@@ -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,42 @@ 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
+ 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
+ }
787
826
788
- let attrs = thin_vec ! [ cx. attr_word( sym:: automatically_derived, self . span) , ] ;
789
827
let opt_trait_ref = Some ( trait_ref) ;
790
828
791
829
cx. item (
0 commit comments