@@ -181,9 +181,11 @@ use std::{iter, vec};
181181pub ( crate ) use StaticFields :: * ;
182182pub ( crate ) use SubstructureFields :: * ;
183183use rustc_ast:: ptr:: P ;
184+ use rustc_ast:: token:: { IdentIsRaw , LitKind , Token , TokenKind } ;
185+ use rustc_ast:: tokenstream:: { DelimSpan , Spacing , TokenTree } ;
184186use 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 ,
187189} ;
188190use rustc_attr_data_structures:: { AttributeKind , ReprPacked } ;
189191use rustc_attr_parsing:: AttributeParser ;
@@ -222,6 +224,8 @@ pub(crate) struct TraitDef<'a> {
222224 pub associated_types : Vec < ( Ident , Ty ) > ,
223225
224226 pub is_const : bool ,
227+
228+ pub is_staged_api_crate : bool ,
225229}
226230
227231pub ( crate ) struct MethodDef < ' a > {
@@ -784,8 +788,42 @@ impl<'a> TraitDef<'a> {
784788 // Create the type of `self`.
785789 let path = cx. path_all ( self . span , false , vec ! [ type_ident] , self_params) ;
786790 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+ if self . is_const && self . is_staged_api_crate {
797+ attrs. push (
798+ cx. attr_nested (
799+ rustc_ast:: AttrItem {
800+ unsafety : Safety :: Default ,
801+ path : rustc_const_unstable,
802+ args : AttrArgs :: Delimited ( DelimArgs {
803+ dspan : DelimSpan :: from_single ( self . span ) ,
804+ delim : rustc_ast:: token:: Delimiter :: Parenthesis ,
805+ tokens : [
806+ TokenKind :: Ident ( sym:: feature, IdentIsRaw :: No ) ,
807+ TokenKind :: Eq ,
808+ TokenKind :: lit ( LitKind :: Str , sym:: derive_const, None ) ,
809+ TokenKind :: Comma ,
810+ TokenKind :: Ident ( sym:: issue, IdentIsRaw :: No ) ,
811+ TokenKind :: Eq ,
812+ TokenKind :: lit ( LitKind :: Str , sym:: derive_const_issue, None ) ,
813+ ]
814+ . into_iter ( )
815+ . map ( |kind| {
816+ TokenTree :: Token ( Token { kind, span : self . span } , Spacing :: Alone )
817+ } )
818+ . collect ( ) ,
819+ } ) ,
820+ tokens : None ,
821+ } ,
822+ self . span ,
823+ ) ,
824+ )
825+ }
787826
788- let attrs = thin_vec ! [ cx. attr_word( sym:: automatically_derived, self . span) , ] ;
789827 let opt_trait_ref = Some ( trait_ref) ;
790828
791829 cx. item (
0 commit comments