Add #[rustc_box]
This commit adds an alternative content boxing syntax, and uses it inside alloc. The usage inside the very performance relevant code in liballoc is the only remaining relevant usage of box syntax in the compiler (outside of tests, which are comparatively easy to port). box syntax was originally designed to be used by all Rust developers. This introduces a replacement syntax more tailored to only being used inside the Rust compiler, and with it, lays the groundwork for eventually removing box syntax.
This commit is contained in:
parent
e810f750a2
commit
cfc21deebd
4 changed files with 21 additions and 2 deletions
|
@ -41,7 +41,19 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
}
|
||||
ExprKind::Tup(ref elts) => hir::ExprKind::Tup(self.lower_exprs(elts)),
|
||||
ExprKind::Call(ref f, ref args) => {
|
||||
if let Some(legacy_args) = self.resolver.legacy_const_generic_args(f) {
|
||||
if e.attrs.get(0).map_or(false, |a| a.has_name(sym::rustc_box)) {
|
||||
if let [inner] = &args[..] {
|
||||
hir::ExprKind::Box(self.lower_expr(&inner))
|
||||
} else {
|
||||
self.sess
|
||||
.struct_span_err(
|
||||
e.span,
|
||||
"rustc_box requires precisely one argument",
|
||||
)
|
||||
.emit();
|
||||
hir::ExprKind::Err
|
||||
}
|
||||
} else if let Some(legacy_args) = self.resolver.legacy_const_generic_args(f) {
|
||||
self.lower_legacy_const_generics((**f).clone(), args.clone(), &legacy_args)
|
||||
} else {
|
||||
let f = self.lower_expr(f);
|
||||
|
|
|
@ -675,6 +675,12 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
"#[rustc_has_incoherent_inherent_impls] allows the addition of incoherent inherent impls for \
|
||||
the given type by annotating all impl items with #[rustc_allow_incoherent_impl]."
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_box, AttributeType::Normal, template!(Word), ErrorFollowing,
|
||||
"#[rustc_box] allows creating boxes \
|
||||
and it is only intended to be used in `alloc`."
|
||||
),
|
||||
|
||||
BuiltinAttribute {
|
||||
name: sym::rustc_diagnostic_item,
|
||||
// FIXME: This can be `true` once we always use `tcx.is_diagnostic_item`.
|
||||
|
|
|
@ -1173,6 +1173,7 @@ symbols! {
|
|||
rustc_allow_const_fn_unstable,
|
||||
rustc_allow_incoherent_impl,
|
||||
rustc_attrs,
|
||||
rustc_box,
|
||||
rustc_builtin_macro,
|
||||
rustc_capture_analysis,
|
||||
rustc_clean,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
error: expected type, found `<[_]>::into_vec(box [0, 1])`
|
||||
error: expected type, found `<[_]>::into_vec(#[rustc_box] ::alloc::boxed::Box::new([0, 1]))`
|
||||
--> $DIR/issue-47666.rs:3:25
|
||||
|
|
||||
LL | let _ = Option:Some(vec![0, 1]);
|
||||
|
|
Loading…
Add table
Reference in a new issue