Skip to content

Commit

Permalink
Simplify array_assume_init
Browse files Browse the repository at this point in the history
  • Loading branch information
joboet committed Jan 11, 2021
1 parent dec8c03 commit 5d65b7e
Showing 1 changed file with 5 additions and 12 deletions.
17 changes: 5 additions & 12 deletions library/core/src/mem/maybe_uninit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -833,21 +833,14 @@ impl<T> MaybeUninit<T> {
#[unstable(feature = "maybe_uninit_array_assume_init", issue = "80908")]
#[inline(always)]
pub unsafe fn array_assume_init<const N: usize>(array: [Self; N]) -> [T; N] {
// Convert using a union because mem::transmute does not support const_generics
union ArrayInit<T, const N: usize> {
maybe_uninit: ManuallyDrop<[MaybeUninit<T>; N]>,
init: ManuallyDrop<[T; N]>,
}

// SAFETY:
// * The caller guarantees that all elements of the array are initialized,
// * `MaybeUninit<T>` and T are guaranteed to have the same layout,
// Therefore the conversion is safe
// * The caller guarantees that all elements of the array are initialized
// * `MaybeUninit<T>` and T are guaranteed to have the same layout
// * MaybeUnint does not drop, so there are no double-frees
// And thus the conversion is safe
unsafe {
intrinsics::assert_inhabited::<T>();

let array = ArrayInit { maybe_uninit: ManuallyDrop::new(array) };
ManuallyDrop::into_inner(array.init)
(&array as *const _ as *const T).read()
}
}

Expand Down

0 comments on commit 5d65b7e

Please sign in to comment.