@@ -596,81 +596,86 @@ fn find_deprecation_generic<'a, I>(sess: &ParseSess,
596596 let diagnostic = & sess. span_diagnostic ;
597597
598598 ' outer: for attr in attrs_iter {
599- if attr. path != "deprecated" {
600- continue
599+ if ! attr. check_name ( "deprecated" ) {
600+ continue ;
601601 }
602602
603- mark_used ( attr) ;
604-
605603 if depr. is_some ( ) {
606604 span_err ! ( diagnostic, item_sp, E0550 , "multiple deprecated attributes" ) ;
607605 break
608606 }
609607
610- depr = if let Some ( metas) = attr. meta_item_list ( ) {
611- let get = |meta : & MetaItem , item : & mut Option < Symbol > | {
612- if item. is_some ( ) {
613- handle_errors ( sess, meta. span , AttrError :: MultipleItem ( meta. name ( ) ) ) ;
614- return false
615- }
616- if let Some ( v) = meta. value_str ( ) {
617- * item = Some ( v) ;
618- true
619- } else {
620- if let Some ( lit) = meta. name_value_literal ( ) {
621- handle_errors (
622- sess,
623- lit. span ,
624- AttrError :: UnsupportedLiteral (
625- "literal in `deprecated` \
626- value must be a string",
627- lit. node . is_bytestr ( )
628- ) ,
629- ) ;
630- } else {
631- span_err ! ( diagnostic, meta. span, E0551 , "incorrect meta item" ) ;
608+ let meta = attr. meta ( ) . unwrap ( ) ;
609+ depr = match & meta. node {
610+ MetaItemKind :: Word => Some ( Deprecation { since : None , note : None } ) ,
611+ MetaItemKind :: NameValue ( ..) => {
612+ meta. value_str ( ) . map ( |note| {
613+ Deprecation { since : None , note : Some ( note) }
614+ } )
615+ }
616+ MetaItemKind :: List ( list) => {
617+ let get = |meta : & MetaItem , item : & mut Option < Symbol > | {
618+ if item. is_some ( ) {
619+ handle_errors ( sess, meta. span , AttrError :: MultipleItem ( meta. name ( ) ) ) ;
620+ return false
632621 }
622+ if let Some ( v) = meta. value_str ( ) {
623+ * item = Some ( v) ;
624+ true
625+ } else {
626+ if let Some ( lit) = meta. name_value_literal ( ) {
627+ handle_errors (
628+ sess,
629+ lit. span ,
630+ AttrError :: UnsupportedLiteral (
631+ "literal in `deprecated` \
632+ value must be a string",
633+ lit. node . is_bytestr ( )
634+ ) ,
635+ ) ;
636+ } else {
637+ span_err ! ( diagnostic, meta. span, E0551 , "incorrect meta item" ) ;
638+ }
633639
634- false
635- }
636- } ;
640+ false
641+ }
642+ } ;
637643
638- let mut since = None ;
639- let mut note = None ;
640- for meta in metas {
641- match & meta. node {
642- NestedMetaItemKind :: MetaItem ( mi) => {
643- match & * mi. name ( ) . as_str ( ) {
644- "since" => if !get ( mi, & mut since) { continue ' outer } ,
645- "note" => if !get ( mi, & mut note) { continue ' outer } ,
646- _ => {
647- handle_errors (
648- sess,
649- meta. span ,
650- AttrError :: UnknownMetaItem ( mi. name ( ) , & [ "since" , "note" ] ) ,
651- ) ;
652- continue ' outer
644+ let mut since = None ;
645+ let mut note = None ;
646+ for meta in list {
647+ match & meta. node {
648+ NestedMetaItemKind :: MetaItem ( mi) => {
649+ match & * mi. name ( ) . as_str ( ) {
650+ "since" => if !get ( mi, & mut since) { continue ' outer } ,
651+ "note" => if !get ( mi, & mut note) { continue ' outer } ,
652+ _ => {
653+ handle_errors (
654+ sess,
655+ meta. span ,
656+ AttrError :: UnknownMetaItem ( mi. name ( ) , & [ "since" , "note" ] ) ,
657+ ) ;
658+ continue ' outer
659+ }
653660 }
654661 }
655- }
656- NestedMetaItemKind :: Literal ( lit ) => {
657- handle_errors (
658- sess ,
659- lit . span ,
660- AttrError :: UnsupportedLiteral (
661- "item in `deprecated` must be a key/value pair" ,
662- false ,
663- ) ,
664- ) ;
665- continue ' outer
662+ NestedMetaItemKind :: Literal ( lit ) => {
663+ handle_errors (
664+ sess ,
665+ lit . span ,
666+ AttrError :: UnsupportedLiteral (
667+ "item in `deprecated` must be a key/value pair" ,
668+ false ,
669+ ) ,
670+ ) ;
671+ continue ' outer
672+ }
666673 }
667674 }
668- }
669675
670- Some ( Deprecation { since : since, note : note} )
671- } else {
672- Some ( Deprecation { since : None , note : None } )
673- }
676+ Some ( Deprecation { since, note } )
677+ }
678+ } ;
674679 }
675680
676681 depr
0 commit comments