MaybeUninit array cleanup

* Links MaybeUninit::uninit_array to meta-tracking issue
* Links MaybeUninit::array_assume_init to meta-tracking issue
* Unstably constifies MaybeUninit::array_assume_init
This commit is contained in:
ltdk 2022-04-15 20:53:50 -04:00
parent 3f391b8455
commit 63a8652961
2 changed files with 14 additions and 8 deletions

View File

@ -117,6 +117,7 @@
#![feature(const_intrinsic_copy)] #![feature(const_intrinsic_copy)]
#![feature(const_intrinsic_forget)] #![feature(const_intrinsic_forget)]
#![feature(const_likely)] #![feature(const_likely)]
#![feature(const_maybe_uninit_uninit_array)]
#![feature(const_maybe_uninit_as_mut_ptr)] #![feature(const_maybe_uninit_as_mut_ptr)]
#![feature(const_maybe_uninit_assume_init)] #![feature(const_maybe_uninit_assume_init)]
#![feature(const_num_from_num)] #![feature(const_num_from_num)]

View File

@ -350,13 +350,13 @@ impl<T> MaybeUninit<T> {
/// let mut buf: [MaybeUninit<u8>; 32] = MaybeUninit::uninit_array(); /// let mut buf: [MaybeUninit<u8>; 32] = MaybeUninit::uninit_array();
/// let data = read(&mut buf); /// let data = read(&mut buf);
/// ``` /// ```
#[unstable(feature = "maybe_uninit_uninit_array", issue = "none")] #[unstable(feature = "maybe_uninit_uninit_array", issue = "96097")]
#[rustc_const_unstable(feature = "maybe_uninit_uninit_array", issue = "none")] #[rustc_const_unstable(feature = "const_maybe_uninit_uninit_array", issue = "96097")]
#[must_use] #[must_use]
#[inline(always)] #[inline(always)]
pub const fn uninit_array<const LEN: usize>() -> [Self; LEN] { pub const fn uninit_array<const N: usize>() -> [Self; N] {
// SAFETY: An uninitialized `[MaybeUninit<_>; LEN]` is valid. // SAFETY: An uninitialized `[MaybeUninit<_>; LEN]` is valid.
unsafe { MaybeUninit::<[MaybeUninit<T>; LEN]>::uninit().assume_init() } unsafe { MaybeUninit::<[MaybeUninit<T>; N]>::uninit().assume_init() }
} }
/// Creates a new `MaybeUninit<T>` in an uninitialized state, with the memory being /// Creates a new `MaybeUninit<T>` in an uninitialized state, with the memory being
@ -942,19 +942,24 @@ impl<T> MaybeUninit<T> {
/// ///
/// assert_eq!(array, [0, 1, 2]); /// assert_eq!(array, [0, 1, 2]);
/// ``` /// ```
#[unstable(feature = "maybe_uninit_array_assume_init", issue = "80908")] #[unstable(feature = "maybe_uninit_array_assume_init", issue = "96097")]
#[rustc_const_unstable(feature = "const_maybe_uninit_array_assume_init", issue = "96097")]
#[inline(always)] #[inline(always)]
#[track_caller] #[track_caller]
pub unsafe fn array_assume_init<const N: usize>(array: [Self; N]) -> [T; N] { pub const unsafe fn array_assume_init<const N: usize>(array: [Self; N]) -> [T; N] {
// SAFETY: // SAFETY:
// * The caller guarantees that all elements of the array are initialized // * The caller guarantees that all elements of the array are initialized
// * `MaybeUninit<T>` and T are guaranteed to have the same layout // * `MaybeUninit<T>` and T are guaranteed to have the same layout
// * `MaybeUninit` does not drop, so there are no double-frees // * `MaybeUninit` does not drop, so there are no double-frees
// And thus the conversion is safe // And thus the conversion is safe
unsafe { let ret = unsafe {
intrinsics::assert_inhabited::<[T; N]>(); intrinsics::assert_inhabited::<[T; N]>();
(&array as *const _ as *const [T; N]).read() (&array as *const _ as *const [T; N]).read()
} };
// FIXME: required to avoid `~const Destruct` bound
super::forget(array);
ret
} }
/// Assuming all the elements are initialized, get a slice to them. /// Assuming all the elements are initialized, get a slice to them.