@@ -197,6 +197,9 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
197197 Attribute :: Parsed ( AttributeKind :: MayDangle ( attr_span) ) => {
198198 self . check_may_dangle ( hir_id, * attr_span)
199199 }
200+ Attribute :: Parsed ( AttributeKind :: Ignore { span, .. } ) => {
201+ self . check_generic_attr ( hir_id, sym:: ignore, * span, target, Target :: Fn )
202+ }
200203 Attribute :: Parsed ( AttributeKind :: MustUse { span, .. } ) => {
201204 self . check_must_use ( hir_id, * span, target)
202205 }
@@ -290,16 +293,16 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
290293 [ sym:: macro_use, ..] | [ sym:: macro_escape, ..] => {
291294 self . check_macro_use ( hir_id, attr, target)
292295 }
293- [ sym:: path, ..] => self . check_generic_attr ( hir_id, attr, target, Target :: Mod ) ,
296+ [ sym:: path, ..] => self . check_generic_attr_unparsed ( hir_id, attr, target, Target :: Mod ) ,
294297 [ sym:: macro_export, ..] => self . check_macro_export ( hir_id, attr, target) ,
295- [ sym:: ignore , .. ] | [ sym :: should_panic, ..] => {
296- self . check_generic_attr ( hir_id, attr, target, Target :: Fn )
298+ [ sym:: should_panic, ..] => {
299+ self . check_generic_attr_unparsed ( hir_id, attr, target, Target :: Fn )
297300 }
298301 [ sym:: automatically_derived, ..] => {
299- self . check_generic_attr ( hir_id, attr, target, Target :: Impl )
302+ self . check_generic_attr_unparsed ( hir_id, attr, target, Target :: Impl )
300303 }
301304 [ sym:: no_implicit_prelude, ..] => {
302- self . check_generic_attr ( hir_id, attr, target, Target :: Mod )
305+ self . check_generic_attr_unparsed ( hir_id, attr, target, Target :: Mod )
303306 }
304307 [ sym:: rustc_object_lifetime_default, ..] => self . check_object_lifetime_default ( hir_id) ,
305308 [ sym:: proc_macro, ..] => {
@@ -309,7 +312,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
309312 self . check_proc_macro ( hir_id, target, ProcMacroKind :: Attribute ) ;
310313 }
311314 [ sym:: proc_macro_derive, ..] => {
312- self . check_generic_attr ( hir_id, attr, target, Target :: Fn ) ;
315+ self . check_generic_attr_unparsed ( hir_id, attr, target, Target :: Fn ) ;
313316 self . check_proc_macro ( hir_id, target, ProcMacroKind :: Derive )
314317 }
315318 [ sym:: autodiff_forward, ..] | [ sym:: autodiff_reverse, ..] => {
@@ -618,7 +621,8 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
618621 }
619622 }
620623
621- fn check_generic_attr (
624+ /// FIXME: Remove when all attributes are ported to the new parser
625+ fn check_generic_attr_unparsed (
622626 & self ,
623627 hir_id : HirId ,
624628 attr : & Attribute ,
@@ -641,6 +645,27 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
641645 }
642646 }
643647
648+ fn check_generic_attr (
649+ & self ,
650+ hir_id : HirId ,
651+ attr_name : Symbol ,
652+ attr_span : Span ,
653+ target : Target ,
654+ allowed_target : Target ,
655+ ) {
656+ if target != allowed_target {
657+ self . tcx . emit_node_span_lint (
658+ UNUSED_ATTRIBUTES ,
659+ hir_id,
660+ attr_span,
661+ errors:: OnlyHasEffectOn {
662+ attr_name : attr_name. to_string ( ) ,
663+ target_name : allowed_target. name ( ) . replace ( ' ' , "_" ) ,
664+ } ,
665+ ) ;
666+ }
667+ }
668+
644669 /// Checks if `#[naked]` is applied to a function definition.
645670 fn check_naked ( & self , hir_id : HirId , attr_span : Span , span : Span , target : Target ) {
646671 match target {
0 commit comments