diff --git a/src/liballoc/lib.rs b/src/liballoc/lib.rs index 68df0137ee6..dbc1f3b47c8 100644 --- a/src/liballoc/lib.rs +++ b/src/liballoc/lib.rs @@ -85,6 +85,7 @@ #![feature(fmt_internals)] #![feature(fn_traits)] #![feature(fundamental)] +#![feature(internal_uninit_const)] #![feature(lang_items)] #![feature(libc)] #![feature(nll)] diff --git a/src/libcore/macros.rs b/src/libcore/macros.rs index 9855c5fb9c3..296bb43f9fa 100644 --- a/src/libcore/macros.rs +++ b/src/libcore/macros.rs @@ -653,7 +653,7 @@ macro_rules! uninit_array { #[cfg(not(bootstrap))] macro_rules! uninit_array { ($t:ty; $size:expr) => ( - [MaybeUninit::<$t>::uninit(); $size] + [MaybeUninit::<$t>::UNINIT; $size] ); } diff --git a/src/libcore/mem/maybe_uninit.rs b/src/libcore/mem/maybe_uninit.rs index 1c69e7f90f6..9ce89f9669d 100644 --- a/src/libcore/mem/maybe_uninit.rs +++ b/src/libcore/mem/maybe_uninit.rs @@ -248,11 +248,18 @@ impl MaybeUninit { /// [type]: union.MaybeUninit.html #[stable(feature = "maybe_uninit", since = "1.36.0")] #[inline(always)] - #[rustc_promotable] pub const fn uninit() -> MaybeUninit { MaybeUninit { uninit: () } } + /// A promotable constant, equivalent to `uninit()`. + #[unstable( + feature = "internal_uninit_const", + issue = "0", + reason = "hack to work around promotability", + )] + pub const UNINIT: Self = Self::uninit(); + /// Creates a new `MaybeUninit` in an uninitialized state, with the memory being /// filled with `0` bytes. It depends on `T` whether that already makes for /// proper initialization. For example, `MaybeUninit::zeroed()` is initialized,