@@ -181,9 +181,11 @@ use std::{iter, vec};
181
181
pub ( crate ) use StaticFields :: * ;
182
182
pub ( crate ) use SubstructureFields :: * ;
183
183
use rustc_ast:: ptr:: P ;
184
+ use rustc_ast:: token:: { IdentIsRaw , LitKind , Token , TokenKind } ;
185
+ use rustc_ast:: tokenstream:: { DelimSpan , Spacing , TokenTree } ;
184
186
use rustc_ast:: {
185
- self as ast, AnonConst , BindingMode , ByRef , EnumDef , Expr , GenericArg , GenericParamKind ,
186
- Generics , Mutability , PatKind , VariantData ,
187
+ self as ast, AnonConst , AttrArgs , BindingMode , ByRef , DelimArgs , EnumDef , Expr , GenericArg ,
188
+ GenericParamKind , Generics , Mutability , PatKind , Safety , VariantData ,
187
189
} ;
188
190
use rustc_attr_data_structures:: { AttributeKind , ReprPacked } ;
189
191
use rustc_attr_parsing:: AttributeParser ;
@@ -222,6 +224,8 @@ pub(crate) struct TraitDef<'a> {
222
224
pub associated_types : Vec < ( Ident , Ty ) > ,
223
225
224
226
pub is_const : bool ,
227
+
228
+ pub is_staged_api_crate : bool ,
225
229
}
226
230
227
231
pub ( crate ) struct MethodDef < ' a > {
@@ -784,8 +788,45 @@ impl<'a> TraitDef<'a> {
784
788
// Create the type of `self`.
785
789
let path = cx. path_all ( self . span , false , vec ! [ type_ident] , self_params) ;
786
790
let self_type = cx. ty_path ( path) ;
791
+ let rustc_const_unstable =
792
+ cx. path_ident ( self . span , Ident :: new ( sym:: rustc_const_unstable, self . span ) ) ;
793
+
794
+ let mut attrs = thin_vec ! [ cx. attr_word( sym:: automatically_derived, self . span) , ] ;
795
+
796
+ // Only add `rustc_const_unstable` attributes if `derive_const` is used within libcore/libstd,
797
+ // Other crates don't need stability attributes, so adding them is not useful, but libcore needs them
798
+ // on all const trait impls.
799
+ if self . is_const && self . is_staged_api_crate {
800
+ attrs. push (
801
+ cx. attr_nested (
802
+ rustc_ast:: AttrItem {
803
+ unsafety : Safety :: Default ,
804
+ path : rustc_const_unstable,
805
+ args : AttrArgs :: Delimited ( DelimArgs {
806
+ dspan : DelimSpan :: from_single ( self . span ) ,
807
+ delim : rustc_ast:: token:: Delimiter :: Parenthesis ,
808
+ tokens : [
809
+ TokenKind :: Ident ( sym:: feature, IdentIsRaw :: No ) ,
810
+ TokenKind :: Eq ,
811
+ TokenKind :: lit ( LitKind :: Str , sym:: derive_const, None ) ,
812
+ TokenKind :: Comma ,
813
+ TokenKind :: Ident ( sym:: issue, IdentIsRaw :: No ) ,
814
+ TokenKind :: Eq ,
815
+ TokenKind :: lit ( LitKind :: Str , sym:: derive_const_issue, None ) ,
816
+ ]
817
+ . into_iter ( )
818
+ . map ( |kind| {
819
+ TokenTree :: Token ( Token { kind, span : self . span } , Spacing :: Alone )
820
+ } )
821
+ . collect ( ) ,
822
+ } ) ,
823
+ tokens : None ,
824
+ } ,
825
+ self . span ,
826
+ ) ,
827
+ )
828
+ }
787
829
788
- let attrs = thin_vec ! [ cx. attr_word( sym:: automatically_derived, self . span) , ] ;
789
830
let opt_trait_ref = Some ( trait_ref) ;
790
831
791
832
cx. item (
0 commit comments