diff options
| author | Yuki Okushi <huyuumi.dev@gmail.com> | 2020-08-08 11:36:05 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-08 11:36:05 +0900 |
| commit | b032a15fa8fae9d101d7dd37d6627d7d677f8d1e (patch) | |
| tree | 641dafd5dde2c390ae49f8be12156bfb1d7a32a3 | |
| parent | 255434d83cab2dab5ab5c7d942a5dbfcda3db894 (diff) | |
| parent | ec5d78d35004846f1d0c344e968eaf0068a68357 (diff) | |
| download | rust-b032a15fa8fae9d101d7dd37d6627d7d677f8d1e.tar.gz rust-b032a15fa8fae9d101d7dd37d6627d7d677f8d1e.zip | |
Rollup merge of #75250 - RalfJung:uninit-const-ptr, r=oli-obk
make MaybeUninit::as_(mut_)ptr const I think it was just an oversight that they are not const yet. I also changed their implementation as the old one created references to uninitialized memory.^^
| -rw-r--r-- | library/core/src/mem/maybe_uninit.rs | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/library/core/src/mem/maybe_uninit.rs b/library/core/src/mem/maybe_uninit.rs index cf721b01ce3..027498d3911 100644 --- a/library/core/src/mem/maybe_uninit.rs +++ b/library/core/src/mem/maybe_uninit.rs @@ -405,9 +405,11 @@ impl<T> MaybeUninit<T> { /// (Notice that the rules around references to uninitialized data are not finalized yet, but /// until they are, it is advisable to avoid them.) #[stable(feature = "maybe_uninit", since = "1.36.0")] + #[rustc_const_unstable(feature = "const_maybe_uninit_as_ptr", issue = "75251")] #[inline(always)] - pub fn as_ptr(&self) -> *const T { - unsafe { &*self.value as *const T } + pub const fn as_ptr(&self) -> *const T { + // `MaybeUninit` and `ManuallyDrop` are both `repr(transparent)` so we can cast the pointer. + self as *const _ as *const T } /// Gets a mutable pointer to the contained value. Reading from this pointer or turning it @@ -442,9 +444,11 @@ impl<T> MaybeUninit<T> { /// (Notice that the rules around references to uninitialized data are not finalized yet, but /// until they are, it is advisable to avoid them.) #[stable(feature = "maybe_uninit", since = "1.36.0")] + #[rustc_const_unstable(feature = "const_maybe_uninit_as_ptr", issue = "75251")] #[inline(always)] - pub fn as_mut_ptr(&mut self) -> *mut T { - unsafe { &mut *self.value as *mut T } + pub const fn as_mut_ptr(&mut self) -> *mut T { + // `MaybeUninit` and `ManuallyDrop` are both `repr(transparent)` so we can cast the pointer. + self as *mut _ as *mut T } /// Extracts the value from the `MaybeUninit<T>` container. This is a great way |
