@@ -2,6 +2,7 @@ use rustc_abi::ExternAbi;
22use  rustc_ast:: ptr:: P ; 
33use  rustc_ast:: visit:: AssocCtxt ; 
44use  rustc_ast:: * ; 
5+ use  rustc_attr_parsing:: { AttrTarget ,  Position } ; 
56use  rustc_errors:: { E0570 ,  ErrorGuaranteed ,  struct_span_code_err} ; 
67use  rustc_hir:: def:: { DefKind ,  PerNS ,  Res } ; 
78use  rustc_hir:: def_id:: { CRATE_DEF_ID ,  LocalDefId } ; 
@@ -83,7 +84,7 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
8384                    self . with_lctx ( CRATE_NODE_ID ,  |lctx| { 
8485                        let  module = lctx. lower_mod ( & c. items ,  & c. spans ) ; 
8586                        // FIXME(jdonszelman): is dummy span ever a problem here? 
86-                         lctx. lower_attrs ( hir:: CRATE_HIR_ID ,  & c. attrs ,  DUMMY_SP ) ; 
87+                         lctx. lower_attrs ( hir:: CRATE_HIR_ID ,  & c. attrs ,  DUMMY_SP ,   AttrTarget :: Crate ) ; 
8788                        hir:: OwnerNode :: Crate ( module) 
8889                    } ) 
8990                } 
@@ -139,7 +140,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
139140    fn  lower_item ( & mut  self ,  i :  & Item )  -> & ' hir  hir:: Item < ' hir >  { 
140141        let  vis_span = self . lower_span ( i. vis . span ) ; 
141142        let  hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ; 
142-         let  attrs = self . lower_attrs ( hir_id,  & i. attrs ,  i. span ) ; 
143+         let  attrs = self . lower_attrs ( hir_id,  & i. attrs ,  i. span ,   AttrTarget :: from_item ( & i . kind ) ) ; 
143144        let  kind = self . lower_item_kind ( i. span ,  i. id ,  hir_id,  attrs,  vis_span,  & i. kind ) ; 
144145        let  item = hir:: Item  { 
145146            owner_id :  hir_id. expect_owner ( ) , 
@@ -229,6 +230,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
229230                        body. as_deref ( ) , 
230231                        attrs, 
231232                        contract. as_deref ( ) , 
233+                         AttrTarget :: from_item ( i) , 
232234                    ) ; 
233235
234236                    let  itctx = ImplTraitContext :: Universal ; 
@@ -642,7 +644,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
642644    fn  lower_foreign_item ( & mut  self ,  i :  & ForeignItem )  -> & ' hir  hir:: ForeignItem < ' hir >  { 
643645        let  hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ; 
644646        let  owner_id = hir_id. expect_owner ( ) ; 
645-         let  attrs = self . lower_attrs ( hir_id,  & i. attrs ,  i. span ) ; 
647+         let  attrs = self . lower_attrs ( hir_id,  & i. attrs ,  i. span ,   AttrTarget :: from_foreign ( i ) ) ; 
646648        let  ( ident,  kind)  = match  & i. kind  { 
647649            ForeignItemKind :: Fn ( box  Fn  {  sig,  ident,  generics,  define_opaque,  .. } )  => { 
648650                let  fdec = & sig. decl ; 
@@ -717,7 +719,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
717719
718720    fn  lower_variant ( & mut  self ,  item_kind :  & ItemKind ,  v :  & Variant )  -> hir:: Variant < ' hir >  { 
719721        let  hir_id = self . lower_node_id ( v. id ) ; 
720-         self . lower_attrs ( hir_id,  & v. attrs ,  v. span ) ; 
722+         self . lower_attrs ( hir_id,  & v. attrs ,  v. span ,   AttrTarget :: EnumVariant ) ; 
721723        hir:: Variant  { 
722724            hir_id, 
723725            def_id :  self . local_def_id ( v. id ) , 
@@ -800,7 +802,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
800802    )  -> hir:: FieldDef < ' hir >  { 
801803        let  ty = self . lower_ty ( & f. ty ,  ImplTraitContext :: Disallowed ( ImplTraitPosition :: FieldTy ) ) ; 
802804        let  hir_id = self . lower_node_id ( f. id ) ; 
803-         self . lower_attrs ( hir_id,  & f. attrs ,  f. span ) ; 
805+         self . lower_attrs ( hir_id,  & f. attrs ,  f. span ,   AttrTarget :: Field ) ; 
804806        hir:: FieldDef  { 
805807            span :  self . lower_span ( f. span ) , 
806808            hir_id, 
@@ -819,7 +821,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
819821
820822    fn  lower_trait_item ( & mut  self ,  i :  & AssocItem )  -> & ' hir  hir:: TraitItem < ' hir >  { 
821823        let  hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ; 
822-         let  attrs = self . lower_attrs ( hir_id,  & i. attrs ,  i. span ) ; 
824+         let  target = AttrTarget :: from_trait_item ( i) ; 
825+         let  attrs = self . lower_attrs ( hir_id,  & i. attrs ,  i. span ,  target) ; 
823826        let  trait_item_def_id = hir_id. expect_owner ( ) ; 
824827
825828        let  ( ident,  generics,  kind,  has_default)  = match  & i. kind  { 
@@ -902,6 +905,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
902905                    Some ( body) , 
903906                    attrs, 
904907                    contract. as_deref ( ) , 
908+                     target, 
905909                ) ; 
906910                let  ( generics,  sig)  = self . lower_method_sig ( 
907911                    generics, 
@@ -1013,7 +1017,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
10131017        let  has_value = true ; 
10141018        let  ( defaultness,  _)  = self . lower_defaultness ( i. kind . defaultness ( ) ,  has_value) ; 
10151019        let  hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ; 
1016-         let  attrs = self . lower_attrs ( hir_id,  & i. attrs ,  i. span ) ; 
1020+ 
1021+         let  target = AttrTarget :: from_impl_item ( 
1022+             if  is_in_trait_impl {  Position :: TraitImpl  }  else  {  Position :: Impl  } , 
1023+             i, 
1024+         ) ; 
1025+ 
1026+         let  attrs = self . lower_attrs ( hir_id,  & i. attrs ,  i. span ,  target) ; 
10171027
10181028        let  ( ident,  ( generics,  kind) )  = match  & i. kind  { 
10191029            AssocItemKind :: Const ( box ConstItem  { 
@@ -1056,6 +1066,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
10561066                    body. as_deref ( ) , 
10571067                    attrs, 
10581068                    contract. as_deref ( ) , 
1069+                     target, 
10591070                ) ; 
10601071                let  ( generics,  sig)  = self . lower_method_sig ( 
10611072                    generics, 
@@ -1207,7 +1218,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
12071218
12081219    fn  lower_param ( & mut  self ,  param :  & Param )  -> hir:: Param < ' hir >  { 
12091220        let  hir_id = self . lower_node_id ( param. id ) ; 
1210-         self . lower_attrs ( hir_id,  & param. attrs ,  param. span ) ; 
1221+         self . lower_attrs ( hir_id,  & param. attrs ,  param. span ,   AttrTarget :: Param ) ; 
12111222        hir:: Param  { 
12121223            hir_id, 
12131224            pat :  self . lower_pat ( & param. pat ) , 
@@ -1335,6 +1346,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
13351346        body :  Option < & Block > , 
13361347        attrs :  & ' hir  [ hir:: Attribute ] , 
13371348        contract :  Option < & FnContract > , 
1349+         target :  AttrTarget < ' _ > , 
13381350    )  -> hir:: BodyId  { 
13391351        let  Some ( body)  = body else  { 
13401352            // Functions without a body are an error, except if this is an intrinsic. For those we 
@@ -1382,7 +1394,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
13821394
13831395            // FIXME(async_fn_track_caller): Can this be moved above? 
13841396            let  hir_id = expr. hir_id ; 
1385-             this. maybe_forward_track_caller ( body. span ,  fn_id,  hir_id) ; 
1397+             this. maybe_forward_track_caller ( body. span ,  fn_id,  hir_id,  target ) ; 
13861398
13871399            ( parameters,  expr) 
13881400        } ) 
@@ -1936,7 +1948,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
19361948    fn  lower_where_predicate ( & mut  self ,  pred :  & WherePredicate )  -> hir:: WherePredicate < ' hir >  { 
19371949        let  hir_id = self . lower_node_id ( pred. id ) ; 
19381950        let  span = self . lower_span ( pred. span ) ; 
1939-         self . lower_attrs ( hir_id,  & pred. attrs ,  span) ; 
1951+         self . lower_attrs ( hir_id,  & pred. attrs ,  span,   AttrTarget :: WherePredicate ) ; 
19401952        let  kind = self . arena . alloc ( match  & pred. kind  { 
19411953            WherePredicateKind :: BoundPredicate ( WhereBoundPredicate  { 
19421954                bound_generic_params, 
0 commit comments