@@ -5,9 +5,11 @@ use core::{mem::MaybeUninit, ptr};
5
5
/// `MaybeUninit::slice_assume_init_mut`. Every element of `slice` must have
6
6
/// been initialized.
7
7
#[ inline( always) ]
8
+ #[ allow( unused_unsafe) ] // TODO(MSRV 1.65): Remove this.
8
9
pub unsafe fn slice_assume_init_mut < T > ( slice : & mut [ MaybeUninit < T > ] ) -> & mut [ T ] {
10
+ let ptr = ptr_from_mut :: < [ MaybeUninit < T > ] > ( slice) as * mut [ T ] ;
9
11
// SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
10
- & mut * ( slice as * mut [ MaybeUninit < T > ] as * mut [ T ] )
12
+ unsafe { & mut * ptr }
11
13
}
12
14
13
15
#[ inline]
@@ -18,18 +20,29 @@ pub fn uninit_slice_fill_zero(slice: &mut [MaybeUninit<u8>]) -> &mut [u8] {
18
20
19
21
#[ inline( always) ]
20
22
pub fn slice_as_uninit < T > ( slice : & [ T ] ) -> & [ MaybeUninit < T > ] {
23
+ let ptr = ptr_from_ref :: < [ T ] > ( slice) as * const [ MaybeUninit < T > ] ;
21
24
// SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
22
- // There is no risk of writing a `MaybeUninit<T>` into the result since
23
- // the result isn't mutable.
24
- unsafe { & * ( slice as * const [ T ] as * const [ MaybeUninit < T > ] ) }
25
+ unsafe { & * ptr }
25
26
}
26
27
27
28
/// View an mutable initialized array as potentially-uninitialized.
28
29
///
29
30
/// This is unsafe because it allows assigning uninitialized values into
30
31
/// `slice`, which would be undefined behavior.
31
32
#[ inline( always) ]
33
+ #[ allow( unused_unsafe) ] // TODO(MSRV 1.65): Remove this.
32
34
pub unsafe fn slice_as_uninit_mut < T > ( slice : & mut [ T ] ) -> & mut [ MaybeUninit < T > ] {
35
+ let ptr = ptr_from_mut :: < [ T ] > ( slice) as * mut [ MaybeUninit < T > ] ;
33
36
// SAFETY: `MaybeUninit<T>` is guaranteed to be layout-compatible with `T`.
34
- & mut * ( slice as * mut [ T ] as * mut [ MaybeUninit < T > ] )
37
+ unsafe { & mut * ptr }
38
+ }
39
+
40
+ // TODO: MSRV(1.76.0): Replace with `core::ptr::from_mut`.
41
+ fn ptr_from_mut < T : ?Sized > ( r : & mut T ) -> * mut T {
42
+ r
43
+ }
44
+
45
+ // TODO: MSRV(1.76.0): Replace with `core::ptr::from_ref`.
46
+ fn ptr_from_ref < T : ?Sized > ( r : & T ) -> * const T {
47
+ r
35
48
}
0 commit comments