Skip to content

Commit 2addec3

Browse files
committed
refactor: use #![feature(const_maybe_uninit_array_assume_init)]
This feature, which covers the `const fn` version of `MaybeUninit:: array_assume_init`, was added by [rust-lang/rust#96099][1]. [1]: rust-lang/rust#96099
1 parent 6e8e26f commit 2addec3

File tree

8 files changed

+12
-49
lines changed

8 files changed

+12
-49
lines changed

doc/toolchain_limitations.md

-22
Original file line numberDiff line numberDiff line change
@@ -366,28 +366,6 @@ const _: () = { b"".iter(); };
366366
```
367367

368368

369-
### `[tag:const_array_assume_init]` `MaybeUninit::array_assume_init` is not `const fn`
370-
371-
```rust
372-
#![feature(maybe_uninit_array_assume_init)]
373-
use core::mem::MaybeUninit;
374-
assert!(matches!(
375-
unsafe { MaybeUninit::array_assume_init([MaybeUninit::new(42)]) },
376-
[42]
377-
));
378-
```
379-
380-
```rust,compile_fail,E0015
381-
#![feature(maybe_uninit_array_assume_init)]
382-
use core::mem::MaybeUninit;
383-
const _: () = assert!(matches!(
384-
// error[E0015]: cannot call non-const fn `MaybeUninit::<i32>::
385-
// array_assume_init::<1_usize>` in constants
386-
unsafe { MaybeUninit::array_assume_init([MaybeUninit::new(42)]) },
387-
[42]
388-
));
389-
```
390-
391369
### `[tag:const_uninit_array]` `MaybeUninit::uninit_array` is unstable
392370

393371
```rust,compile_fail,E0658

src/r3_core/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
#![feature(const_maybe_uninit_array_assume_init)]
12
#![feature(const_fn_floating_point_arithmetic)]
23
#![feature(const_nonnull_slice_from_raw_parts)]
34
#![feature(const_maybe_uninit_uninit_array)]
45
#![feature(const_maybe_uninit_assume_init)]
6+
#![feature(maybe_uninit_array_assume_init)]
57
#![feature(const_maybe_uninit_as_mut_ptr)]
68
#![feature(nonnull_slice_from_raw_parts)]
79
#![feature(arbitrary_enum_discriminant)]

src/r3_core/src/utils/for_times.rs

+2-15
Original file line numberDiff line numberDiff line change
@@ -232,21 +232,8 @@ macro_rules! const_array_from_fn {
232232
))
233233
}
234234

235-
// `MaybeUninit::array_assume_init` is not `const fn` yet
236-
// [ref:const_array_assume_init]
237-
const unsafe fn __assume_init<
238-
$($iter_gparam $($iter_gparam_bounds)*,)*
239-
const LEN: usize
240-
>(array: [MaybeUninit<$ty>; LEN]) -> [$ty; LEN] {
241-
// Safety: This is equivalent to `transmute_copy(&array)`. The
242-
// memory layout of `[MaybeUninit<T>; $len]` is identical to `[T; $len]`.
243-
// We initialized all elements in `array[0..$len]`, so it's safe to
244-
// reinterpret that range as `[T; $len]`.
245-
unsafe { *(array.as_ptr() as *const _ as *const [$ty; LEN]) }
246-
}
247-
248-
// Safety: See the body of `__assume_init`.
249-
unsafe { __assume_init::<$($ctx_t,)* {$len_value}>(array) }
235+
// Safety: All elements of `array` are initialized
236+
unsafe { MaybeUninit::array_assume_init(array) }
250237
}};
251238
}
252239

src/r3_core/src/utils/init.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,8 @@ impl<T: Init, const LEN: usize> Init for [T; LEN] {
4444
i += 1;
4545
}
4646

47-
// `MaybeUninit::array_assume_init` is not `const fn` yet
48-
// [ref:const_array_assume_init]
49-
// Safety: The memory layout of `[MaybeUninit<T>; LEN]` is
50-
// identical to `[T; LEN]`. We initialized all elements, so it's
51-
// safe to reinterpret that range as `[T; LEN]`.
52-
unsafe { super::mem::transmute(array) }
47+
// Safety: `array`'s elements are fully initialized
48+
unsafe { mem::MaybeUninit::array_assume_init(array) }
5349
};
5450
}
5551

src/r3_core/src/utils/mem.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ mod tests {
4444
MaybeUninit::new(2),
4545
MaybeUninit::new(3),
4646
];
47-
// `MaybeUninit::array_assume_init` is not `const fn`
48-
// [ref:const_array_assume_init]
49-
unsafe { transmute(array) }
47+
unsafe { MaybeUninit::array_assume_init(array) }
5048
};
5149
assert_eq!(ARRAY1, [1, 2, 3]);
5250
}

src/r3_kernel/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
#![feature(const_maybe_uninit_array_assume_init)]
12
#![feature(const_maybe_uninit_uninit_array)]
23
#![feature(const_maybe_uninit_assume_init)]
4+
#![feature(maybe_uninit_array_assume_init)]
35
#![feature(const_slice_from_raw_parts)]
46
#![feature(maybe_uninit_uninit_array)]
57
#![feature(const_precise_live_drops)]

src/r3_test_suite/src/kernel_benchmarks/timer_start.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,7 @@ impl<System: SupportedSystem> AppInner<System> {
4949
i += 1;
5050
}
5151

52-
// `MaybeUninit::array_assume_init` is not `const fn` yet
53-
// [ref:const_array_assume_init]
54-
unsafe { core::mem::transmute_copy(&timers) }
52+
unsafe { MaybeUninit::array_assume_init(timers) }
5553
};
5654

5755
Self { timers }

src/r3_test_suite/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
#![feature(const_maybe_uninit_array_assume_init)]
12
#![feature(const_fn_floating_point_arithmetic)]
3+
#![feature(maybe_uninit_array_assume_init)]
24
#![feature(cfg_target_has_atomic)]
35
#![feature(const_transmute_copy)]
46
#![feature(const_refs_to_cell)]

0 commit comments

Comments
 (0)