@@ -3,6 +3,7 @@ use rustc_ast::ptr::P;
3
3
use rustc_ast:: visit:: AssocCtxt ;
4
4
use rustc_ast:: * ;
5
5
use rustc_attr_data_structures:: { AttributeKind , find_attr} ;
6
+ use rustc_attr_parsing:: { AttrTarget , Position } ;
6
7
use rustc_errors:: { E0570 , ErrorGuaranteed , struct_span_code_err} ;
7
8
use rustc_hir:: def:: { DefKind , PerNS , Res } ;
8
9
use rustc_hir:: def_id:: { CRATE_DEF_ID , LocalDefId } ;
@@ -84,7 +85,7 @@ impl<'a, 'hir> ItemLowerer<'a, 'hir> {
84
85
self . with_lctx ( CRATE_NODE_ID , |lctx| {
85
86
let module = lctx. lower_mod ( & c. items , & c. spans ) ;
86
87
// 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 ) ;
88
89
hir:: OwnerNode :: Crate ( module)
89
90
} )
90
91
}
@@ -140,7 +141,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
140
141
fn lower_item ( & mut self , i : & Item ) -> & ' hir hir:: Item < ' hir > {
141
142
let vis_span = self . lower_span ( i. vis . span ) ;
142
143
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 ) ) ;
144
145
let kind = self . lower_item_kind ( i. span , i. id , hir_id, attrs, vis_span, & i. kind ) ;
145
146
let item = hir:: Item {
146
147
owner_id : hir_id. expect_owner ( ) ,
@@ -230,6 +231,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
230
231
body. as_deref ( ) ,
231
232
attrs,
232
233
contract. as_deref ( ) ,
234
+ AttrTarget :: from_item ( i) ,
233
235
) ;
234
236
235
237
let itctx = ImplTraitContext :: Universal ;
@@ -643,7 +645,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
643
645
fn lower_foreign_item ( & mut self , i : & ForeignItem ) -> & ' hir hir:: ForeignItem < ' hir > {
644
646
let hir_id = hir:: HirId :: make_owner ( self . current_hir_id_owner . def_id ) ;
645
647
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 ) ) ;
647
649
let ( ident, kind) = match & i. kind {
648
650
ForeignItemKind :: Fn ( box Fn { sig, ident, generics, define_opaque, .. } ) => {
649
651
let fdec = & sig. decl ;
@@ -718,7 +720,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
718
720
719
721
fn lower_variant ( & mut self , item_kind : & ItemKind , v : & Variant ) -> hir:: Variant < ' hir > {
720
722
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 ) ;
722
724
hir:: Variant {
723
725
hir_id,
724
726
def_id : self . local_def_id ( v. id ) ,
@@ -801,7 +803,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
801
803
) -> hir:: FieldDef < ' hir > {
802
804
let ty = self . lower_ty ( & f. ty , ImplTraitContext :: Disallowed ( ImplTraitPosition :: FieldTy ) ) ;
803
805
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 ) ;
805
807
hir:: FieldDef {
806
808
span : self . lower_span ( f. span ) ,
807
809
hir_id,
@@ -820,7 +822,8 @@ impl<'hir> LoweringContext<'_, 'hir> {
820
822
821
823
fn lower_trait_item ( & mut self , i : & AssocItem ) -> & ' hir hir:: TraitItem < ' hir > {
822
824
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) ;
824
827
let trait_item_def_id = hir_id. expect_owner ( ) ;
825
828
826
829
let ( ident, generics, kind, has_default) = match & i. kind {
@@ -903,6 +906,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
903
906
Some ( body) ,
904
907
attrs,
905
908
contract. as_deref ( ) ,
909
+ target,
906
910
) ;
907
911
let ( generics, sig) = self . lower_method_sig (
908
912
generics,
@@ -1014,7 +1018,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
1014
1018
let has_value = true ;
1015
1019
let ( defaultness, _) = self . lower_defaultness ( i. kind . defaultness ( ) , has_value) ;
1016
1020
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) ;
1018
1028
1019
1029
let ( ident, ( generics, kind) ) = match & i. kind {
1020
1030
AssocItemKind :: Const ( box ConstItem {
@@ -1057,6 +1067,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1057
1067
body. as_deref ( ) ,
1058
1068
attrs,
1059
1069
contract. as_deref ( ) ,
1070
+ target,
1060
1071
) ;
1061
1072
let ( generics, sig) = self . lower_method_sig (
1062
1073
generics,
@@ -1208,7 +1219,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1208
1219
1209
1220
fn lower_param ( & mut self , param : & Param ) -> hir:: Param < ' hir > {
1210
1221
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 ) ;
1212
1223
hir:: Param {
1213
1224
hir_id,
1214
1225
pat : self . lower_pat ( & param. pat ) ,
@@ -1336,6 +1347,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1336
1347
body : Option < & Block > ,
1337
1348
attrs : & ' hir [ hir:: Attribute ] ,
1338
1349
contract : Option < & FnContract > ,
1350
+ target : AttrTarget < ' _ > ,
1339
1351
) -> hir:: BodyId {
1340
1352
let Some ( body) = body else {
1341
1353
// Functions without a body are an error, except if this is an intrinsic. For those we
@@ -1383,7 +1395,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1383
1395
1384
1396
// FIXME(async_fn_track_caller): Can this be moved above?
1385
1397
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 ) ;
1387
1399
1388
1400
( parameters, expr)
1389
1401
} )
@@ -1937,7 +1949,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
1937
1949
fn lower_where_predicate ( & mut self , pred : & WherePredicate ) -> hir:: WherePredicate < ' hir > {
1938
1950
let hir_id = self . lower_node_id ( pred. id ) ;
1939
1951
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 ) ;
1941
1953
let kind = self . arena . alloc ( match & pred. kind {
1942
1954
WherePredicateKind :: BoundPredicate ( WhereBoundPredicate {
1943
1955
bound_generic_params,
0 commit comments