diff --git a/library/core/src/array/mod.rs b/library/core/src/array/mod.rs index 63a99349d7c9a..33d2a216a4280 100644 --- a/library/core/src/array/mod.rs +++ b/library/core/src/array/mod.rs @@ -107,11 +107,20 @@ pub fn repeat(val: T) -> [T; N] { #[inline] #[stable(feature = "array_from_fn", since = "1.63.0")] #[rustc_const_unstable(feature = "const_array", issue = "147606")] -pub const fn from_fn(f: F) -> [T; N] +pub const fn from_fn(mut f: F) -> [T; N] where F: [const] FnMut(usize) -> T + [const] Destruct, { - try_from_fn(NeverShortCircuit::wrap_mut_1(f)).0 + let mut array: [MaybeUninit; N] = [const { MaybeUninit::uninit() }; N]; + + let mut i = 0; + while i < N { + array[i] = MaybeUninit::new(f(i)); + i += 1; + } + + // SAFETY: All N elements were initialized. + unsafe { MaybeUninit::array_assume_init(array) } } /// Creates an array `[T; N]` where each fallible array element `T` is returned by the `cb` call.