@@ -197,6 +197,9 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
197
197
Attribute :: Parsed ( AttributeKind :: MayDangle ( attr_span) ) => {
198
198
self . check_may_dangle ( hir_id, * attr_span)
199
199
}
200
+ Attribute :: Parsed ( AttributeKind :: Ignore { span, .. } ) => {
201
+ self . check_generic_attr ( hir_id, sym:: ignore, * span, target, Target :: Fn )
202
+ }
200
203
Attribute :: Parsed ( AttributeKind :: MustUse { span, .. } ) => {
201
204
self . check_must_use ( hir_id, * span, target)
202
205
}
@@ -290,16 +293,16 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
290
293
[ sym:: macro_use, ..] | [ sym:: macro_escape, ..] => {
291
294
self . check_macro_use ( hir_id, attr, target)
292
295
}
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 ) ,
294
297
[ 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 )
297
300
}
298
301
[ 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 )
300
303
}
301
304
[ 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 )
303
306
}
304
307
[ sym:: rustc_object_lifetime_default, ..] => self . check_object_lifetime_default ( hir_id) ,
305
308
[ sym:: proc_macro, ..] => {
@@ -309,7 +312,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
309
312
self . check_proc_macro ( hir_id, target, ProcMacroKind :: Attribute ) ;
310
313
}
311
314
[ 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 ) ;
313
316
self . check_proc_macro ( hir_id, target, ProcMacroKind :: Derive )
314
317
}
315
318
[ sym:: autodiff_forward, ..] | [ sym:: autodiff_reverse, ..] => {
@@ -618,7 +621,8 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
618
621
}
619
622
}
620
623
621
- fn check_generic_attr (
624
+ /// FIXME: Remove when all attributes are ported to the new parser
625
+ fn check_generic_attr_unparsed (
622
626
& self ,
623
627
hir_id : HirId ,
624
628
attr : & Attribute ,
@@ -641,6 +645,27 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
641
645
}
642
646
}
643
647
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
+
644
669
/// Checks if `#[naked]` is applied to a function definition.
645
670
fn check_naked ( & self , hir_id : HirId , attr_span : Span , span : Span , target : Target ) {
646
671
match target {
0 commit comments