diff --git a/library/core/src/mem/maybe_uninit.rs b/library/core/src/mem/maybe_uninit.rs index 3d96ad32a12..b186aa61eb0 100644 --- a/library/core/src/mem/maybe_uninit.rs +++ b/library/core/src/mem/maybe_uninit.rs @@ -833,21 +833,14 @@ impl MaybeUninit { #[unstable(feature = "maybe_uninit_array_assume_init", issue = "80908")] #[inline(always)] pub unsafe fn array_assume_init(array: [Self; N]) -> [T; N] { - // Convert using a union because mem::transmute does not support const_generics - union ArrayInit { - maybe_uninit: ManuallyDrop<[MaybeUninit; N]>, - init: ManuallyDrop<[T; N]>, - } - // SAFETY: - // * The caller guarantees that all elements of the array are initialized, - // * `MaybeUninit` 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` 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::(); - - let array = ArrayInit { maybe_uninit: ManuallyDrop::new(array) }; - ManuallyDrop::into_inner(array.init) + (&array as *const _ as *const T).read() } }