Skip to content

Commit 13fca73

Browse files
committed
Replace MaybeUninit::uninit_array() with array repeat expression.
This is possible now that inline const blocks are stable; the idea was even mentioned as an alternative when `uninit_array()` was added: <#65580 (comment)> > if it’s stabilized soon enough maybe it’s not worth having a > standard library method that will be replaceable with > `let buffer = [MaybeUninit::<T>::uninit(); $N];` Const array repetition and inline const blocks are now stable (in the next release), so that circumstance has come to pass, and we no longer have reason to want `uninit_array()` other than convenience. Therefore, let’s evaluate the inconvenience by not using `uninit_array()` in the standard library, before potentially deleting it entirely.
1 parent d371d17 commit 13fca73

File tree

22 files changed

+32
-38
lines changed

22 files changed

+32
-38
lines changed

compiler/rustc_data_structures/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
#![feature(lint_reasons)]
2828
#![feature(macro_metavar_expr)]
2929
#![feature(map_try_insert)]
30-
#![feature(maybe_uninit_uninit_array)]
3130
#![feature(min_specialization)]
3231
#![feature(negative_impls)]
3332
#![feature(never_type)]

compiler/rustc_data_structures/src/sip128.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ impl SipHasher128 {
188188
pub fn new_with_keys(key0: u64, key1: u64) -> SipHasher128 {
189189
let mut hasher = SipHasher128 {
190190
nbuf: 0,
191-
buf: MaybeUninit::uninit_array(),
191+
buf: [MaybeUninit::uninit(); BUFFER_WITH_SPILL_CAPACITY],
192192
state: State {
193193
v0: key0 ^ 0x736f6d6570736575,
194194
// The XOR with 0xee is only done on 128-bit algorithm version.

library/alloc/src/collections/vec_deque/into_iter.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
132132
fn next_chunk<const N: usize>(
133133
&mut self,
134134
) -> Result<[Self::Item; N], array::IntoIter<Self::Item, N>> {
135-
let mut raw_arr = MaybeUninit::uninit_array();
135+
let mut raw_arr = [const { MaybeUninit::uninit() }; N];
136136
let raw_arr_ptr = raw_arr.as_mut_ptr().cast();
137137
let (head, tail) = self.inner.as_slices();
138138

library/alloc/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@
135135
#![feature(layout_for_ptr)]
136136
#![feature(local_waker)]
137137
#![feature(maybe_uninit_slice)]
138-
#![feature(maybe_uninit_uninit_array)]
139138
#![feature(maybe_uninit_uninit_array_transpose)]
140139
#![feature(panic_internals)]
141140
#![feature(pattern)]

library/alloc/src/vec/into_iter.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
254254

255255
#[inline]
256256
fn next_chunk<const N: usize>(&mut self) -> Result<[T; N], core::array::IntoIter<T, N>> {
257-
let mut raw_ary = MaybeUninit::uninit_array();
257+
let mut raw_ary = [const { MaybeUninit::uninit() }; N];
258258

259259
let len = self.len();
260260

library/core/src/array/iter.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ impl<T, const N: usize> IntoIter<T, N> {
101101
/// ```
102102
/// #![feature(array_into_iter_constructors)]
103103
/// #![feature(maybe_uninit_uninit_array_transpose)]
104-
/// #![feature(maybe_uninit_uninit_array)]
105104
/// use std::array::IntoIter;
106105
/// use std::mem::MaybeUninit;
107106
///
@@ -111,7 +110,7 @@ impl<T, const N: usize> IntoIter<T, N> {
111110
/// fn next_chunk<T: Copy, const N: usize>(
112111
/// it: &mut impl Iterator<Item = T>,
113112
/// ) -> Result<[T; N], IntoIter<T, N>> {
114-
/// let mut buffer = MaybeUninit::uninit_array();
113+
/// let mut buffer = [const { MaybeUninit::uninit() }; N];
115114
/// let mut i = 0;
116115
/// while i < N {
117116
/// match it.next() {
@@ -203,7 +202,7 @@ impl<T, const N: usize> IntoIter<T, N> {
203202
#[unstable(feature = "array_into_iter_constructors", issue = "91583")]
204203
#[rustc_const_unstable(feature = "const_array_into_iter_constructors", issue = "91583")]
205204
pub const fn empty() -> Self {
206-
let buffer = MaybeUninit::uninit_array();
205+
let buffer = [const { MaybeUninit::uninit() }; N];
207206
let initialized = 0..0;
208207

209208
// SAFETY: We're telling it that none of the elements are initialized,
@@ -405,7 +404,8 @@ impl<T: Clone, const N: usize> Clone for IntoIter<T, N> {
405404
fn clone(&self) -> Self {
406405
// Note, we don't really need to match the exact same alive range, so
407406
// we can just clone into offset 0 regardless of where `self` is.
408-
let mut new = Self { data: MaybeUninit::uninit_array(), alive: IndexRange::zero_to(0) };
407+
let mut new =
408+
Self { data: [const { MaybeUninit::uninit() }; N], alive: IndexRange::zero_to(0) };
409409

410410
// Clone all alive elements.
411411
for (src, dst) in iter::zip(self.as_slice(), &mut new.data) {

library/core/src/array/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ where
127127
R: Try,
128128
R::Residual: Residual<[R::Output; N]>,
129129
{
130-
let mut array = MaybeUninit::uninit_array::<N>();
130+
let mut array = [const { MaybeUninit::uninit() }; N];
131131
match try_from_fn_erased(&mut array, cb) {
132132
ControlFlow::Break(r) => FromResidual::from_residual(r),
133133
ControlFlow::Continue(()) => {
@@ -918,7 +918,7 @@ impl<T> Drop for Guard<'_, T> {
918918
pub(crate) fn iter_next_chunk<T, const N: usize>(
919919
iter: &mut impl Iterator<Item = T>,
920920
) -> Result<[T; N], IntoIter<T, N>> {
921-
let mut array = MaybeUninit::uninit_array::<N>();
921+
let mut array = [const { MaybeUninit::uninit() }; N];
922922
let r = iter_next_chunk_erased(&mut array, iter);
923923
match r {
924924
Ok(()) => {

library/core/src/fmt/float.rs

+10-8
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ fn float_to_decimal_common_exact<T>(
3535
where
3636
T: flt2dec::DecodableFloat,
3737
{
38-
let mut buf: [MaybeUninit<u8>; 1024] = MaybeUninit::uninit_array(); // enough for f32 and f64
39-
let mut parts: [MaybeUninit<numfmt::Part<'_>>; 4] = MaybeUninit::uninit_array();
38+
let mut buf: [MaybeUninit<u8>; 1024] = [MaybeUninit::uninit(); 1024]; // enough for f32 and f64
39+
let mut parts: [MaybeUninit<numfmt::Part<'_>>; 4] = [MaybeUninit::uninit(); 4];
4040
let formatted = flt2dec::to_exact_fixed_str(
4141
flt2dec::strategy::grisu::format_exact,
4242
*num,
@@ -62,8 +62,9 @@ where
6262
T: flt2dec::DecodableFloat,
6363
{
6464
// enough for f32 and f64
65-
let mut buf: [MaybeUninit<u8>; flt2dec::MAX_SIG_DIGITS] = MaybeUninit::uninit_array();
66-
let mut parts: [MaybeUninit<numfmt::Part<'_>>; 4] = MaybeUninit::uninit_array();
65+
let mut buf: [MaybeUninit<u8>; flt2dec::MAX_SIG_DIGITS] =
66+
[MaybeUninit::uninit(); flt2dec::MAX_SIG_DIGITS];
67+
let mut parts: [MaybeUninit<numfmt::Part<'_>>; 4] = [MaybeUninit::uninit(); 4];
6768
let formatted = flt2dec::to_shortest_str(
6869
flt2dec::strategy::grisu::format_shortest,
6970
*num,
@@ -107,8 +108,8 @@ fn float_to_exponential_common_exact<T>(
107108
where
108109
T: flt2dec::DecodableFloat,
109110
{
110-
let mut buf: [MaybeUninit<u8>; 1024] = MaybeUninit::uninit_array(); // enough for f32 and f64
111-
let mut parts: [MaybeUninit<numfmt::Part<'_>>; 6] = MaybeUninit::uninit_array();
111+
let mut buf: [MaybeUninit<u8>; 1024] = [MaybeUninit::uninit(); 1024]; // enough for f32 and f64
112+
let mut parts: [MaybeUninit<numfmt::Part<'_>>; 6] = [MaybeUninit::uninit(); 6];
112113
let formatted = flt2dec::to_exact_exp_str(
113114
flt2dec::strategy::grisu::format_exact,
114115
*num,
@@ -135,8 +136,9 @@ where
135136
T: flt2dec::DecodableFloat,
136137
{
137138
// enough for f32 and f64
138-
let mut buf: [MaybeUninit<u8>; flt2dec::MAX_SIG_DIGITS] = MaybeUninit::uninit_array();
139-
let mut parts: [MaybeUninit<numfmt::Part<'_>>; 6] = MaybeUninit::uninit_array();
139+
let mut buf: [MaybeUninit<u8>; flt2dec::MAX_SIG_DIGITS] =
140+
[MaybeUninit::uninit(); flt2dec::MAX_SIG_DIGITS];
141+
let mut parts: [MaybeUninit<numfmt::Part<'_>>; 6] = [MaybeUninit::uninit(); 6];
140142
let formatted = flt2dec::to_shortest_exp_str(
141143
flt2dec::strategy::grisu::format_shortest,
142144
*num,

library/core/src/iter/adapters/copied.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ where
202202
T: Copy,
203203
{
204204
fn spec_next_chunk(&mut self) -> Result<[T; N], array::IntoIter<T, N>> {
205-
let mut raw_array = MaybeUninit::uninit_array();
205+
let mut raw_array = [const { MaybeUninit::uninit() }; N];
206206

207207
let len = self.len();
208208

library/core/src/iter/adapters/filter.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ where
6464
fn next_chunk<const N: usize>(
6565
&mut self,
6666
) -> Result<[Self::Item; N], array::IntoIter<Self::Item, N>> {
67-
let mut array: [MaybeUninit<Self::Item>; N] = MaybeUninit::uninit_array();
67+
let mut array: [MaybeUninit<Self::Item>; N] = [const { MaybeUninit::uninit() }; N];
6868

6969
struct Guard<'a, T> {
7070
array: &'a mut [MaybeUninit<T>],

library/core/src/iter/adapters/filter_map.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ where
6868
fn next_chunk<const N: usize>(
6969
&mut self,
7070
) -> Result<[Self::Item; N], array::IntoIter<Self::Item, N>> {
71-
let mut array: [MaybeUninit<Self::Item>; N] = MaybeUninit::uninit_array();
71+
let mut array: [MaybeUninit<Self::Item>; N] = [const { MaybeUninit::uninit() }; N];
7272

7373
struct Guard<'a, T> {
7474
array: &'a mut [MaybeUninit<T>],

library/core/src/iter/adapters/map_windows.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ impl<I: Iterator, const N: usize> MapWindowsInner<I, N> {
110110
impl<T, const N: usize> Buffer<T, N> {
111111
fn try_from_iter(iter: &mut impl Iterator<Item = T>) -> Option<Self> {
112112
let first_half = crate::array::iter_next_chunk(iter).ok()?;
113-
let buffer = [MaybeUninit::new(first_half).transpose(), MaybeUninit::uninit_array()];
113+
let buffer =
114+
[MaybeUninit::new(first_half).transpose(), [const { MaybeUninit::uninit() }; N]];
114115
Some(Self { buffer, start: 0 })
115116
}
116117

@@ -204,7 +205,7 @@ impl<T, const N: usize> Buffer<T, N> {
204205
impl<T: Clone, const N: usize> Clone for Buffer<T, N> {
205206
fn clone(&self) -> Self {
206207
let mut buffer = Buffer {
207-
buffer: [MaybeUninit::uninit_array(), MaybeUninit::uninit_array()],
208+
buffer: [[const { MaybeUninit::uninit() }; N], [const { MaybeUninit::uninit() }; N]],
208209
start: self.start,
209210
};
210211
buffer.as_uninit_array_mut().write(self.as_array_ref().clone());

library/core/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@
140140
#![feature(const_likely)]
141141
#![feature(const_maybe_uninit_as_mut_ptr)]
142142
#![feature(const_maybe_uninit_assume_init)]
143-
#![feature(const_maybe_uninit_uninit_array)]
144143
#![feature(const_nonnull_new)]
145144
#![feature(const_num_midpoint)]
146145
#![feature(const_option)]
@@ -177,7 +176,6 @@
177176
#![feature(is_ascii_octdigit)]
178177
#![feature(isqrt)]
179178
#![feature(link_cfg)]
180-
#![feature(maybe_uninit_uninit_array)]
181179
#![feature(offset_of_enum)]
182180
#![feature(offset_of_nested)]
183181
#![feature(panic_internals)]

library/core/src/mem/maybe_uninit.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -917,11 +917,10 @@ impl<T> MaybeUninit<T> {
917917
/// # Examples
918918
///
919919
/// ```
920-
/// #![feature(maybe_uninit_uninit_array)]
921920
/// #![feature(maybe_uninit_array_assume_init)]
922921
/// use std::mem::MaybeUninit;
923922
///
924-
/// let mut array: [MaybeUninit<i32>; 3] = MaybeUninit::uninit_array();
923+
/// let mut array: [MaybeUninit<i32>; 3] = [MaybeUninit::uninit(); 3];
925924
/// array[0].write(0);
926925
/// array[1].write(1);
927926
/// array[2].write(2);

library/core/src/net/display_buffer.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub struct DisplayBuffer<const SIZE: usize> {
1111
impl<const SIZE: usize> DisplayBuffer<SIZE> {
1212
#[inline]
1313
pub const fn new() -> Self {
14-
Self { buf: MaybeUninit::uninit_array(), len: 0 }
14+
Self { buf: [MaybeUninit::uninit(); SIZE], len: 0 }
1515
}
1616

1717
#[inline]

library/core/src/slice/sort/stable/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ struct AlignedStorage<T, const N: usize> {
104104

105105
impl<T, const N: usize> AlignedStorage<T, N> {
106106
fn new() -> Self {
107-
Self { _align: [], storage: MaybeUninit::uninit_array() }
107+
Self { _align: [], storage: [const { MaybeUninit::uninit() }; N] }
108108
}
109109

110110
fn as_uninit_slice_mut(&mut self) -> &mut [MaybeUninit<T>] {

library/core/tests/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@
5454
#![feature(slice_split_once)]
5555
#![feature(split_as_slice)]
5656
#![feature(maybe_uninit_fill)]
57-
#![feature(maybe_uninit_slice)]
58-
#![feature(maybe_uninit_uninit_array)]
5957
#![feature(maybe_uninit_write_slice)]
6058
#![feature(maybe_uninit_uninit_array_transpose)]
6159
#![feature(min_specialization)]

library/std/src/fs/tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ fn file_test_read_buf() {
406406
let filename = &tmpdir.join("test");
407407
check!(fs::write(filename, &[1, 2, 3, 4]));
408408

409-
let mut buf: [MaybeUninit<u8>; 128] = MaybeUninit::uninit_array();
409+
let mut buf: [MaybeUninit<u8>; 128] = [MaybeUninit::uninit(); 128];
410410
let mut buf = BorrowedBuf::from(buf.as_mut_slice());
411411
let mut file = check!(File::open(filename));
412412
check!(file.read_buf(buf.unfilled()));

library/std/src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,6 @@
337337
#![feature(hint_assert_unchecked)]
338338
#![feature(ip)]
339339
#![feature(maybe_uninit_slice)]
340-
#![feature(maybe_uninit_uninit_array)]
341340
#![feature(maybe_uninit_write_slice)]
342341
#![feature(panic_can_unwind)]
343342
#![feature(panic_info_message)]
@@ -407,7 +406,6 @@
407406
#![feature(const_ip)]
408407
#![feature(const_ipv4)]
409408
#![feature(const_ipv6)]
410-
#![feature(const_maybe_uninit_uninit_array)]
411409
#![feature(const_waker)]
412410
#![feature(thread_local_internals)]
413411
// tidy-alphabetical-end

library/std/src/net/tcp/tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ fn read_buf() {
301301
});
302302

303303
let mut s = t!(srv.accept()).0;
304-
let mut buf: [MaybeUninit<u8>; 128] = MaybeUninit::uninit_array();
304+
let mut buf: [MaybeUninit<u8>; 128] = [MaybeUninit::uninit(); 128];
305305
let mut buf = BorrowedBuf::from(buf.as_mut_slice());
306306
t!(s.read_buf(buf.unfilled()));
307307
assert_eq!(buf.filled(), &[1, 2, 3, 4]);

library/std/src/process/tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ fn child_stdout_read_buf() {
137137
let child = cmd.spawn().unwrap();
138138

139139
let mut stdout = child.stdout.unwrap();
140-
let mut buf: [MaybeUninit<u8>; 128] = MaybeUninit::uninit_array();
140+
let mut buf: [MaybeUninit<u8>; 128] = [MaybeUninit::uninit(); 128];
141141
let mut buf = BorrowedBuf::from(buf.as_mut_slice());
142142
stdout.read_buf(buf.unfilled()).unwrap();
143143

library/std/src/sys/pal/windows/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ where
227227
// This initial size also works around `GetFullPathNameW` returning
228228
// incorrect size hints for some short paths:
229229
// https://github.com/dylni/normpath/issues/5
230-
let mut stack_buf: [MaybeUninit<u16>; 512] = MaybeUninit::uninit_array();
230+
let mut stack_buf: [MaybeUninit<u16>; 512] = [MaybeUninit::uninit(); 512];
231231
let mut heap_buf: Vec<MaybeUninit<u16>> = Vec::new();
232232
unsafe {
233233
let mut n = stack_buf.len();

0 commit comments

Comments
 (0)