@@ -183,6 +183,14 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
183
183
Attribute :: Parsed ( AttributeKind :: Naked ( attr_span) ) => {
184
184
self . check_naked ( hir_id, * attr_span, span, target)
185
185
}
186
+ Attribute :: Parsed ( AttributeKind :: NoImplicitPrelude ( attr_span) ) => self
187
+ . check_generic_attr (
188
+ hir_id,
189
+ sym:: no_implicit_prelude,
190
+ * attr_span,
191
+ target,
192
+ Target :: Mod ,
193
+ ) ,
186
194
Attribute :: Parsed ( AttributeKind :: TrackCaller ( attr_span) ) => {
187
195
self . check_track_caller ( hir_id, * attr_span, attrs, span, target)
188
196
}
@@ -292,16 +300,13 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
292
300
[ sym:: macro_use, ..] | [ sym:: macro_escape, ..] => {
293
301
self . check_macro_use ( hir_id, attr, target)
294
302
}
295
- [ sym:: path, ..] => self . check_generic_attr ( hir_id, attr, target, Target :: Mod ) ,
303
+ [ sym:: path, ..] => self . check_generic_attr_unparsed ( hir_id, attr, target, Target :: Mod ) ,
296
304
[ sym:: macro_export, ..] => self . check_macro_export ( hir_id, attr, target) ,
297
305
[ sym:: ignore, ..] | [ sym:: should_panic, ..] => {
298
- self . check_generic_attr ( hir_id, attr, target, Target :: Fn )
306
+ self . check_generic_attr_unparsed ( hir_id, attr, target, Target :: Fn )
299
307
}
300
308
[ sym:: automatically_derived, ..] => {
301
- self . check_generic_attr ( hir_id, attr, target, Target :: Impl )
302
- }
303
- [ sym:: no_implicit_prelude, ..] => {
304
- self . check_generic_attr ( hir_id, attr, target, Target :: Mod )
309
+ self . check_generic_attr_unparsed ( hir_id, attr, target, Target :: Impl )
305
310
}
306
311
[ sym:: rustc_object_lifetime_default, ..] => self . check_object_lifetime_default ( hir_id) ,
307
312
[ sym:: proc_macro, ..] => {
@@ -311,7 +316,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
311
316
self . check_proc_macro ( hir_id, target, ProcMacroKind :: Attribute ) ;
312
317
}
313
318
[ sym:: proc_macro_derive, ..] => {
314
- self . check_generic_attr ( hir_id, attr, target, Target :: Fn ) ;
319
+ self . check_generic_attr_unparsed ( hir_id, attr, target, Target :: Fn ) ;
315
320
self . check_proc_macro ( hir_id, target, ProcMacroKind :: Derive )
316
321
}
317
322
[ sym:: autodiff_forward, ..] | [ sym:: autodiff_reverse, ..] => {
@@ -620,7 +625,8 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
620
625
}
621
626
}
622
627
623
- fn check_generic_attr (
628
+ /// FIXME: Remove when all attributes are ported to the new parser
629
+ fn check_generic_attr_unparsed (
624
630
& self ,
625
631
hir_id : HirId ,
626
632
attr : & Attribute ,
@@ -643,6 +649,27 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
643
649
}
644
650
}
645
651
652
+ fn check_generic_attr (
653
+ & self ,
654
+ hir_id : HirId ,
655
+ attr_name : Symbol ,
656
+ attr_span : Span ,
657
+ target : Target ,
658
+ allowed_target : Target ,
659
+ ) {
660
+ if target != allowed_target {
661
+ self . tcx . emit_node_span_lint (
662
+ UNUSED_ATTRIBUTES ,
663
+ hir_id,
664
+ attr_span,
665
+ errors:: OnlyHasEffectOn {
666
+ attr_name : attr_name. to_string ( ) ,
667
+ target_name : allowed_target. name ( ) . replace ( ' ' , "_" ) ,
668
+ } ,
669
+ ) ;
670
+ }
671
+ }
672
+
646
673
/// Checks if `#[naked]` is applied to a function definition.
647
674
fn check_naked ( & self , hir_id : HirId , attr_span : Span , span : Span , target : Target ) {
648
675
match target {
0 commit comments