Skip to content

Commit 5d5b36d

Browse files
committed
Make derive_const usable within libcore again
Also make it *only* usable on nightly
1 parent 5d9c537 commit 5d5b36d

File tree

17 files changed

+75
-12
lines changed

17 files changed

+75
-12
lines changed

compiler/rustc_builtin_macros/src/deriving/bounds.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub(crate) fn expand_deriving_copy(
2323
methods: Vec::new(),
2424
associated_types: Vec::new(),
2525
is_const,
26+
is_staged_api_crate: cx.ecfg.features.staged_api(),
2627
};
2728

2829
trait_def.expand(cx, mitem, item, push);
@@ -46,6 +47,7 @@ pub(crate) fn expand_deriving_const_param_ty(
4647
methods: Vec::new(),
4748
associated_types: Vec::new(),
4849
is_const,
50+
is_staged_api_crate: cx.ecfg.features.staged_api(),
4951
};
5052

5153
trait_def.expand(cx, mitem, item, push);
@@ -60,6 +62,7 @@ pub(crate) fn expand_deriving_const_param_ty(
6062
methods: Vec::new(),
6163
associated_types: Vec::new(),
6264
is_const,
65+
is_staged_api_crate: cx.ecfg.features.staged_api(),
6366
};
6467

6568
trait_def.expand(cx, mitem, item, push);
@@ -83,6 +86,7 @@ pub(crate) fn expand_deriving_unsized_const_param_ty(
8386
methods: Vec::new(),
8487
associated_types: Vec::new(),
8588
is_const,
89+
is_staged_api_crate: cx.ecfg.features.staged_api(),
8690
};
8791

8892
trait_def.expand(cx, mitem, item, push);

compiler/rustc_builtin_macros/src/deriving/clone.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ pub(crate) fn expand_deriving_clone(
8787
}],
8888
associated_types: Vec::new(),
8989
is_const,
90+
is_staged_api_crate: cx.ecfg.features.staged_api(),
9091
};
9192

9293
trait_def.expand_ext(cx, mitem, item, push, is_simple)

compiler/rustc_builtin_macros/src/deriving/cmp/eq.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ pub(crate) fn expand_deriving_eq(
4343
}],
4444
associated_types: Vec::new(),
4545
is_const,
46+
is_staged_api_crate: cx.ecfg.features.staged_api(),
4647
};
4748
trait_def.expand_ext(cx, mitem, item, push, true)
4849
}

compiler/rustc_builtin_macros/src/deriving/cmp/ord.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ pub(crate) fn expand_deriving_ord(
3434
}],
3535
associated_types: Vec::new(),
3636
is_const,
37+
is_staged_api_crate: cx.ecfg.features.staged_api(),
3738
};
3839

3940
trait_def.expand(cx, mitem, item, push)

compiler/rustc_builtin_macros/src/deriving/cmp/partial_eq.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ pub(crate) fn expand_deriving_partial_eq(
3030
methods: Vec::new(),
3131
associated_types: Vec::new(),
3232
is_const: false,
33+
is_staged_api_crate: cx.ecfg.features.staged_api(),
3334
};
3435
structural_trait_def.expand(cx, mitem, item, push);
3536

@@ -58,6 +59,7 @@ pub(crate) fn expand_deriving_partial_eq(
5859
methods,
5960
associated_types: Vec::new(),
6061
is_const,
62+
is_staged_api_crate: cx.ecfg.features.staged_api(),
6163
};
6264
trait_def.expand(cx, mitem, item, push)
6365
}

compiler/rustc_builtin_macros/src/deriving/cmp/partial_ord.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ pub(crate) fn expand_deriving_partial_ord(
6464
methods: vec![partial_cmp_def],
6565
associated_types: Vec::new(),
6666
is_const,
67+
is_staged_api_crate: cx.ecfg.features.staged_api(),
6768
};
6869
trait_def.expand(cx, mitem, item, push)
6970
}

compiler/rustc_builtin_macros/src/deriving/debug.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ pub(crate) fn expand_deriving_debug(
4141
}],
4242
associated_types: Vec::new(),
4343
is_const,
44+
is_staged_api_crate: cx.ecfg.features.staged_api(),
4445
};
4546
trait_def.expand(cx, mitem, item, push)
4647
}

compiler/rustc_builtin_macros/src/deriving/default.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ pub(crate) fn expand_deriving_default(
5151
}],
5252
associated_types: Vec::new(),
5353
is_const,
54+
is_staged_api_crate: cx.ecfg.features.staged_api(),
5455
};
5556
trait_def.expand(cx, mitem, item, push)
5657
}

compiler/rustc_builtin_macros/src/deriving/generic/mod.rs

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,11 @@ use std::{iter, vec};
181181
pub(crate) use StaticFields::*;
182182
pub(crate) use SubstructureFields::*;
183183
use rustc_ast::ptr::P;
184+
use rustc_ast::token::{IdentIsRaw, LitKind, Token, TokenKind};
185+
use rustc_ast::tokenstream::{DelimSpan, Spacing, TokenTree};
184186
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,
187189
};
188190
use rustc_attr_data_structures::{AttributeKind, ReprPacked};
189191
use 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

227231
pub(crate) struct MethodDef<'a> {
@@ -784,8 +788,45 @@ 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+
// 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+
}
787829

788-
let attrs = thin_vec![cx.attr_word(sym::automatically_derived, self.span),];
789830
let opt_trait_ref = Some(trait_ref);
790831

791832
cx.item(

compiler/rustc_builtin_macros/src/deriving/hash.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ pub(crate) fn expand_deriving_hash(
4141
}],
4242
associated_types: Vec::new(),
4343
is_const,
44+
is_staged_api_crate: cx.ecfg.features.staged_api(),
4445
};
4546

4647
hash_trait_def.expand(cx, mitem, item, push);

0 commit comments

Comments
 (0)