@@ -185,6 +185,14 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
185185 Attribute :: Parsed ( AttributeKind :: Naked ( attr_span) ) => {
186186 self . check_naked ( hir_id, * attr_span, span, target)
187187 }
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+ ) ,
188196 Attribute :: Parsed ( AttributeKind :: TrackCaller ( attr_span) ) => {
189197 self . check_track_caller ( hir_id, * attr_span, attrs, span, target)
190198 }
@@ -294,16 +302,13 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
294302 [ sym:: macro_use, ..] | [ sym:: macro_escape, ..] => {
295303 self . check_macro_use ( hir_id, attr, target)
296304 }
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 ) ,
298306 [ sym:: macro_export, ..] => self . check_macro_export ( hir_id, attr, target) ,
299307 [ 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 )
301309 }
302310 [ 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 )
307312 }
308313 [ sym:: proc_macro, ..] => {
309314 self . check_proc_macro ( hir_id, target, ProcMacroKind :: FunctionLike )
@@ -312,7 +317,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
312317 self . check_proc_macro ( hir_id, target, ProcMacroKind :: Attribute ) ;
313318 }
314319 [ 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 ) ;
316321 self . check_proc_macro ( hir_id, target, ProcMacroKind :: Derive )
317322 }
318323 [ sym:: autodiff_forward, ..] | [ sym:: autodiff_reverse, ..] => {
@@ -621,7 +626,8 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
621626 }
622627 }
623628
624- fn check_generic_attr (
629+ /// FIXME: Remove when all attributes are ported to the new parser
630+ fn check_generic_attr_unparsed (
625631 & self ,
626632 hir_id : HirId ,
627633 attr : & Attribute ,
@@ -644,6 +650,27 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
644650 }
645651 }
646652
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+
647674 /// Checks if `#[naked]` is applied to a function definition.
648675 fn check_naked ( & self , hir_id : HirId , attr_span : Span , span : Span , target : Target ) {
649676 match target {
0 commit comments