@@ -3,6 +3,7 @@ use rustc_ast::ptr::P;
33use rustc_ast:: visit:: AssocCtxt ;
44use rustc_ast:: * ;
55use rustc_attr_data_structures:: { AttributeKind , find_attr} ;
6+ use rustc_attr_parsing:: { AttrTarget , Position } ;
67use rustc_errors:: { E0570 , ErrorGuaranteed , struct_span_code_err} ;
78use rustc_hir:: def:: { DefKind , PerNS , Res } ;
89use rustc_hir:: def_id:: { CRATE_DEF_ID , LocalDefId } ;
@@ -84,7 +85,7 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
8485 self . with_lctx ( CRATE_NODE_ID , |lctx| {
8586 let module = lctx. lower_mod ( & c. items , & c. spans ) ;
8687 // FIXME(jdonszelman): is dummy span ever a problem here?
87- lctx. lower_attrs ( hir:: CRATE_HIR_ID , & c. attrs , DUMMY_SP ) ;
88+ lctx. lower_attrs ( hir:: CRATE_HIR_ID , & c. attrs , DUMMY_SP , AttrTarget :: Crate ) ;
8889 hir:: OwnerNode :: Crate ( module)
8990 } )
9091 }
@@ -140,7 +141,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
140141 fn lower_item ( & mut self , i : & Item ) -> & ' hir hir:: Item < ' hir > {
141142 let vis_span = self . lower_span ( i. vis . span ) ;
142143 let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
143- let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
144+ let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span , AttrTarget :: from_item ( & i . kind ) ) ;
144145 let kind = self . lower_item_kind ( i. span , i. id , hir_id, attrs, vis_span, & i. kind ) ;
145146 let item = hir:: Item {
146147 owner_id : hir_id. expect_owner ( ) ,
@@ -230,6 +231,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
230231 body. as_deref ( ) ,
231232 attrs,
232233 contract. as_deref ( ) ,
234+ AttrTarget :: from_item ( i) ,
233235 ) ;
234236
235237 let itctx = ImplTraitContext :: Universal ;
@@ -643,7 +645,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
643645 fn lower_foreign_item ( & mut self , i : & ForeignItem ) -> & ' hir hir:: ForeignItem < ' hir > {
644646 let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
645647 let owner_id = hir_id. expect_owner ( ) ;
646- let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
648+ let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span , AttrTarget :: from_foreign ( i ) ) ;
647649 let ( ident, kind) = match & i. kind {
648650 ForeignItemKind :: Fn ( box Fn { sig, ident, generics, define_opaque, .. } ) => {
649651 let fdec = & sig. decl ;
@@ -718,7 +720,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
718720
719721 fn lower_variant ( & mut self , item_kind : & ItemKind , v : & Variant ) -> hir:: Variant < ' hir > {
720722 let hir_id = self . lower_node_id ( v. id ) ;
721- self . lower_attrs ( hir_id, & v. attrs , v. span ) ;
723+ self . lower_attrs ( hir_id, & v. attrs , v. span , AttrTarget :: EnumVariant ) ;
722724 hir:: Variant {
723725 hir_id,
724726 def_id : self . local_def_id ( v. id ) ,
@@ -801,7 +803,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
801803 ) -> hir:: FieldDef < ' hir > {
802804 let ty = self . lower_ty ( & f. ty , ImplTraitContext :: Disallowed ( ImplTraitPosition :: FieldTy ) ) ;
803805 let hir_id = self . lower_node_id ( f. id ) ;
804- self . lower_attrs ( hir_id, & f. attrs , f. span ) ;
806+ self . lower_attrs ( hir_id, & f. attrs , f. span , AttrTarget :: Field ) ;
805807 hir:: FieldDef {
806808 span : self . lower_span ( f. span ) ,
807809 hir_id,
@@ -820,7 +822,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
820822
821823 fn lower_trait_item ( & mut self , i : & AssocItem ) -> & ' hir hir:: TraitItem < ' hir > {
822824 let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
823- let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
825+ let target = AttrTarget :: from_trait_item ( i) ;
826+ let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span , target) ;
824827 let trait_item_def_id = hir_id. expect_owner ( ) ;
825828
826829 let ( ident, generics, kind, has_default) = match & i. kind {
@@ -903,6 +906,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
903906 Some ( body) ,
904907 attrs,
905908 contract. as_deref ( ) ,
909+ target,
906910 ) ;
907911 let ( generics, sig) = self . lower_method_sig (
908912 generics,
@@ -1014,7 +1018,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
10141018 let has_value = true ;
10151019 let ( defaultness, _) = self . lower_defaultness ( i. kind . defaultness ( ) , has_value) ;
10161020 let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
1017- let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span ) ;
1021+
1022+ let target = AttrTarget :: from_impl_item (
1023+ if is_in_trait_impl { Position :: TraitImpl } else { Position :: Impl } ,
1024+ i,
1025+ ) ;
1026+
1027+ let attrs = self . lower_attrs ( hir_id, & i. attrs , i. span , target) ;
10181028
10191029 let ( ident, ( generics, kind) ) = match & i. kind {
10201030 AssocItemKind :: Const ( box ConstItem {
@@ -1057,6 +1067,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
10571067 body. as_deref ( ) ,
10581068 attrs,
10591069 contract. as_deref ( ) ,
1070+ target,
10601071 ) ;
10611072 let ( generics, sig) = self . lower_method_sig (
10621073 generics,
@@ -1208,7 +1219,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
12081219
12091220 fn lower_param ( & mut self , param : & Param ) -> hir:: Param < ' hir > {
12101221 let hir_id = self . lower_node_id ( param. id ) ;
1211- self . lower_attrs ( hir_id, & param. attrs , param. span ) ;
1222+ self . lower_attrs ( hir_id, & param. attrs , param. span , AttrTarget :: Param ) ;
12121223 hir:: Param {
12131224 hir_id,
12141225 pat : self . lower_pat ( & param. pat ) ,
@@ -1336,6 +1347,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
13361347 body : Option < & Block > ,
13371348 attrs : & ' hir [ hir:: Attribute ] ,
13381349 contract : Option < & FnContract > ,
1350+ target : AttrTarget < ' _ > ,
13391351 ) -> hir:: BodyId {
13401352 let Some ( body) = body else {
13411353 // Functions without a body are an error, except if this is an intrinsic. For those we
@@ -1383,7 +1395,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
13831395
13841396 // FIXME(async_fn_track_caller): Can this be moved above?
13851397 let hir_id = expr. hir_id ;
1386- this. maybe_forward_track_caller ( body. span , fn_id, hir_id) ;
1398+ this. maybe_forward_track_caller ( body. span , fn_id, hir_id, target ) ;
13871399
13881400 ( parameters, expr)
13891401 } )
@@ -1937,7 +1949,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
19371949 fn lower_where_predicate ( & mut self , pred : & WherePredicate ) -> hir:: WherePredicate < ' hir > {
19381950 let hir_id = self . lower_node_id ( pred. id ) ;
19391951 let span = self . lower_span ( pred. span ) ;
1940- self . lower_attrs ( hir_id, & pred. attrs , span) ;
1952+ self . lower_attrs ( hir_id, & pred. attrs , span, AttrTarget :: WherePredicate ) ;
19411953 let kind = self . arena . alloc ( match & pred. kind {
19421954 WherePredicateKind :: BoundPredicate ( WhereBoundPredicate {
19431955 bound_generic_params,
0 commit comments