@@ -183,6 +183,14 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
183183 Attribute :: Parsed ( AttributeKind :: Naked ( attr_span) ) => {
184184 self . check_naked ( hir_id, * attr_span, span, target)
185185 }
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+ ) ,
186194 Attribute :: Parsed ( AttributeKind :: TrackCaller ( attr_span) ) => {
187195 self . check_track_caller ( hir_id, * attr_span, attrs, span, target)
188196 }
@@ -292,16 +300,13 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
292300 [ sym:: macro_use, ..] | [ sym:: macro_escape, ..] => {
293301 self . check_macro_use ( hir_id, attr, target)
294302 }
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 ) ,
296304 [ sym:: macro_export, ..] => self . check_macro_export ( hir_id, attr, target) ,
297305 [ 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 )
299307 }
300308 [ 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 )
305310 }
306311 [ sym:: rustc_object_lifetime_default, ..] => self . check_object_lifetime_default ( hir_id) ,
307312 [ sym:: proc_macro, ..] => {
@@ -311,7 +316,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
311316 self . check_proc_macro ( hir_id, target, ProcMacroKind :: Attribute ) ;
312317 }
313318 [ 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 ) ;
315320 self . check_proc_macro ( hir_id, target, ProcMacroKind :: Derive )
316321 }
317322 [ sym:: autodiff_forward, ..] | [ sym:: autodiff_reverse, ..] => {
@@ -620,7 +625,8 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
620625 }
621626 }
622627
623- fn check_generic_attr (
628+ /// FIXME: Remove when all attributes are ported to the new parser
629+ fn check_generic_attr_unparsed (
624630 & self ,
625631 hir_id : HirId ,
626632 attr : & Attribute ,
@@ -643,6 +649,27 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
643649 }
644650 }
645651
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+
646673 /// Checks if `#[naked]` is applied to a function definition.
647674 fn check_naked ( & self , hir_id : HirId , attr_span : Span , span : Span , target : Target ) {
648675 match target {
0 commit comments