@@ -592,81 +592,86 @@ fn find_deprecation_generic<'a, I>(sess: &ParseSess,
592592 let diagnostic = & sess. span_diagnostic ;
593593
594594 ' outer: for attr in attrs_iter {
595- if attr. path != "deprecated" {
596- continue
595+ if ! attr. check_name ( "deprecated" ) {
596+ continue ;
597597 }
598598
599- mark_used ( attr) ;
600-
601599 if depr. is_some ( ) {
602600 span_err ! ( diagnostic, item_sp, E0550 , "multiple deprecated attributes" ) ;
603601 break
604602 }
605603
606- depr = if let Some ( metas) = attr. meta_item_list ( ) {
607- let get = |meta : & MetaItem , item : & mut Option < Symbol > | {
608- if item. is_some ( ) {
609- handle_errors ( sess, meta. span , AttrError :: MultipleItem ( meta. name ( ) ) ) ;
610- return false
611- }
612- if let Some ( v) = meta. value_str ( ) {
613- * item = Some ( v) ;
614- true
615- } else {
616- if let Some ( lit) = meta. name_value_literal ( ) {
617- handle_errors (
618- sess,
619- lit. span ,
620- AttrError :: UnsupportedLiteral (
621- "literal in `deprecated` \
622- value must be a string",
623- lit. node . is_bytestr ( )
624- ) ,
625- ) ;
626- } else {
627- span_err ! ( diagnostic, meta. span, E0551 , "incorrect meta item" ) ;
604+ let meta = attr. meta ( ) . unwrap ( ) ;
605+ depr = match & meta. node {
606+ MetaItemKind :: Word => Some ( Deprecation { since : None , note : None } ) ,
607+ MetaItemKind :: NameValue ( ..) => {
608+ meta. value_str ( ) . map ( |note| {
609+ Deprecation { since : None , note : Some ( note) }
610+ } )
611+ }
612+ MetaItemKind :: List ( list) => {
613+ let get = |meta : & MetaItem , item : & mut Option < Symbol > | {
614+ if item. is_some ( ) {
615+ handle_errors ( sess, meta. span , AttrError :: MultipleItem ( meta. name ( ) ) ) ;
616+ return false
628617 }
618+ if let Some ( v) = meta. value_str ( ) {
619+ * item = Some ( v) ;
620+ true
621+ } else {
622+ if let Some ( lit) = meta. name_value_literal ( ) {
623+ handle_errors (
624+ sess,
625+ lit. span ,
626+ AttrError :: UnsupportedLiteral (
627+ "literal in `deprecated` \
628+ value must be a string",
629+ lit. node . is_bytestr ( )
630+ ) ,
631+ ) ;
632+ } else {
633+ span_err ! ( diagnostic, meta. span, E0551 , "incorrect meta item" ) ;
634+ }
629635
630- false
631- }
632- } ;
636+ false
637+ }
638+ } ;
633639
634- let mut since = None ;
635- let mut note = None ;
636- for meta in metas {
637- match & meta. node {
638- NestedMetaItemKind :: MetaItem ( mi) => {
639- match & * mi. name ( ) . as_str ( ) {
640- "since" => if !get ( mi, & mut since) { continue ' outer } ,
641- "note" => if !get ( mi, & mut note) { continue ' outer } ,
642- _ => {
643- handle_errors (
644- sess,
645- meta. span ,
646- AttrError :: UnknownMetaItem ( mi. name ( ) , & [ "since" , "note" ] ) ,
647- ) ;
648- continue ' outer
640+ let mut since = None ;
641+ let mut note = None ;
642+ for meta in list {
643+ match & meta. node {
644+ NestedMetaItemKind :: MetaItem ( mi) => {
645+ match & * mi. name ( ) . as_str ( ) {
646+ "since" => if !get ( mi, & mut since) { continue ' outer } ,
647+ "note" => if !get ( mi, & mut note) { continue ' outer } ,
648+ _ => {
649+ handle_errors (
650+ sess,
651+ meta. span ,
652+ AttrError :: UnknownMetaItem ( mi. name ( ) , & [ "since" , "note" ] ) ,
653+ ) ;
654+ continue ' outer
655+ }
649656 }
650657 }
651- }
652- NestedMetaItemKind :: Literal ( lit ) => {
653- handle_errors (
654- sess ,
655- lit . span ,
656- AttrError :: UnsupportedLiteral (
657- "item in `deprecated` must be a key/value pair" ,
658- false ,
659- ) ,
660- ) ;
661- continue ' outer
658+ NestedMetaItemKind :: Literal ( lit ) => {
659+ handle_errors (
660+ sess ,
661+ lit . span ,
662+ AttrError :: UnsupportedLiteral (
663+ "item in `deprecated` must be a key/value pair" ,
664+ false ,
665+ ) ,
666+ ) ;
667+ continue ' outer
668+ }
662669 }
663670 }
664- }
665671
666- Some ( Deprecation { since : since, note : note} )
667- } else {
668- Some ( Deprecation { since : None , note : None } )
669- }
672+ Some ( Deprecation { since, note } )
673+ }
674+ } ;
670675 }
671676
672677 depr
0 commit comments