@@ -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