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