File tree Expand file tree Collapse file tree 2 files changed +22
-0
lines changed
Expand file tree Collapse file tree 2 files changed +22
-0
lines changed Original file line number Diff line number Diff line change @@ -1583,6 +1583,7 @@ symbols! {
15831583 unrestricted_attribute_tokens,
15841584 unsafe_block_in_unsafe_fn,
15851585 unsafe_cell,
1586+ unsafe_cell_from_mut,
15861587 unsafe_no_drop_flag,
15871588 unsafe_pin_internals,
15881589 unsize,
Original file line number Diff line number Diff line change @@ -2030,6 +2030,27 @@ impl<T> UnsafeCell<T> {
20302030}
20312031
20322032impl<T: ?Sized> UnsafeCell<T> {
2033+ /// Converts from `&mut T` to `&mut UnsafeCell<T>`.
2034+ ///
2035+ /// # Examples
2036+ ///
2037+ /// ```
2038+ /// # #![feature(unsafe_cell_from_mut)]
2039+ /// use std::cell::UnsafeCell;
2040+ ///
2041+ /// let mut val = 42;
2042+ /// let uc = UnsafeCell::from_mut(&mut val);
2043+ ///
2044+ /// *uc.get_mut() -= 1;
2045+ /// assert_eq!(*uc.get_mut(), 41);
2046+ /// ```
2047+ #[inline(always)]
2048+ #[unstable(feature = "unsafe_cell_from_mut", issue = "111645")]
2049+ pub const fn from_mut(value: &mut T) -> &mut UnsafeCell<T> {
2050+ // SAFETY: `UnsafeCell<T>` has the same memory layout as `T` due to #[repr(transparent)].
2051+ unsafe { &mut *(value as *mut T as *mut UnsafeCell<T>) }
2052+ }
2053+
20332054 /// Gets a mutable pointer to the wrapped value.
20342055 ///
20352056 /// This can be cast to a pointer of any kind.
You can’t perform that action at this time.
0 commit comments