@@ -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                } 
@@ -289,16 +297,13 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
289297                        [ sym:: macro_use,  ..]  | [ sym:: macro_escape,  ..]  => { 
290298                            self . check_macro_use ( hir_id,  attr,  target) 
291299                        } 
292-                         [ sym:: path,  ..]  => self . check_generic_attr ( hir_id,  attr,  target,  Target :: Mod ) , 
300+                         [ sym:: path,  ..]  => self . check_generic_attr_unparsed ( hir_id,  attr,  target,  Target :: Mod ) , 
293301                        [ sym:: macro_export,  ..]  => self . check_macro_export ( hir_id,  attr,  target) , 
294302                        [ sym:: ignore,  ..]  | [ sym:: should_panic,  ..]  => { 
295-                             self . check_generic_attr ( hir_id,  attr,  target,  Target :: Fn ) 
303+                             self . check_generic_attr_unparsed ( hir_id,  attr,  target,  Target :: Fn ) 
296304                        } 
297305                        [ sym:: automatically_derived,  ..]  => { 
298-                             self . check_generic_attr ( hir_id,  attr,  target,  Target :: Impl ) 
299-                         } 
300-                         [ sym:: no_implicit_prelude,  ..]  => { 
301-                             self . check_generic_attr ( hir_id,  attr,  target,  Target :: Mod ) 
306+                             self . check_generic_attr_unparsed ( hir_id,  attr,  target,  Target :: Impl ) 
302307                        } 
303308                        [ sym:: proc_macro,  ..]  => { 
304309                            self . check_proc_macro ( hir_id,  target,  ProcMacroKind :: FunctionLike ) 
@@ -307,7 +312,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
307312                            self . check_proc_macro ( hir_id,  target,  ProcMacroKind :: Attribute ) ; 
308313                        } 
309314                        [ sym:: proc_macro_derive,  ..]  => { 
310-                             self . check_generic_attr ( hir_id,  attr,  target,  Target :: Fn ) ; 
315+                             self . check_generic_attr_unparsed ( hir_id,  attr,  target,  Target :: Fn ) ; 
311316                            self . check_proc_macro ( hir_id,  target,  ProcMacroKind :: Derive ) 
312317                        } 
313318                        [ sym:: autodiff_forward,  ..]  | [ sym:: autodiff_reverse,  ..]  => { 
@@ -616,7 +621,8 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
616621        } 
617622    } 
618623
619-     fn  check_generic_attr ( 
624+     /// FIXME: Remove when all attributes are ported to the new parser 
625+ fn  check_generic_attr_unparsed ( 
620626        & self , 
621627        hir_id :  HirId , 
622628        attr :  & Attribute , 
@@ -639,6 +645,27 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
639645        } 
640646    } 
641647
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+ 
642669    /// Checks if `#[naked]` is applied to a function definition. 
643670fn  check_naked ( & self ,  hir_id :  HirId ,  attr_span :  Span ,  span :  Span ,  target :  Target )  { 
644671        match  target { 
0 commit comments