diff options
author | JoJoJet <21144246+JoJoJet@users.noreply.github.com> | 2023-05-16 15:36:05 -0400 |
---|---|---|
committer | JoJoJet <21144246+JoJoJet@users.noreply.github.com> | 2023-05-16 15:36:05 -0400 |
commit | ffacb8861a860e5797e2835668336e60147ef454 (patch) | |
tree | d715e77918291313f93bea79a3fb92ae0b3345f7 | |
parent | b652d9a0fd5c5a7eeacd1ae8299166941c221230 (diff) | |
download | rust-ffacb8861a860e5797e2835668336e60147ef454.tar.gz |
add `UnsafeCell::from_mut`
-rw-r--r-- | compiler/rustc_span/src/symbol.rs | 1 | ||||
-rw-r--r-- | library/core/src/cell.rs | 21 |
2 files changed, 22 insertions, 0 deletions
diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index 9951d8f4fc1..02505457efa 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -1583,6 +1583,7 @@ symbols! { unrestricted_attribute_tokens, unsafe_block_in_unsafe_fn, unsafe_cell, + unsafe_cell_from_mut, unsafe_no_drop_flag, unsafe_pin_internals, unsize, diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs index 2c3c14853a4..744767aae44 100644 --- a/library/core/src/cell.rs +++ b/library/core/src/cell.rs @@ -2030,6 +2030,27 @@ impl<T> UnsafeCell<T> { } impl<T: ?Sized> UnsafeCell<T> { + /// Converts from `&mut T` to `&mut UnsafeCell<T>`. + /// + /// # Examples + /// + /// ``` + /// # #![feature(unsafe_cell_from_mut)] + /// use std::cell::UnsafeCell; + /// + /// let mut val = 42; + /// let uc = UnsafeCell::from_mut(&mut val); + /// + /// *uc.get_mut() -= 1; + /// assert_eq!(*uc.get_mut(), 41); + /// ``` + #[inline(always)] + #[unstable(feature = "unsafe_cell_from_mut", issue = "111645")] + pub const fn from_mut(value: &mut T) -> &mut UnsafeCell<T> { + // SAFETY: `UnsafeCell<T>` has the same memory layout as `T` due to #[repr(transparent)]. + unsafe { &mut *(value as *mut T as *mut UnsafeCell<T>) } + } + /// Gets a mutable pointer to the wrapped value. /// /// This can be cast to a pointer of any kind. |