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