Auto merge of #47204 - varkor:unsafecell-into_inner-safe, r=alexcrichton

Make UnsafeCell::into_inner safe

This fixes #35067. It will require a Crater run as discussed in that
issue.
This commit is contained in:
bors 2018-01-28 19:01:51 +00:00
commit 21882aad72
2 changed files with 7 additions and 12 deletions

View File

@ -450,7 +450,7 @@ impl<T> Cell<T> {
/// ``` /// ```
#[stable(feature = "move_cell", since = "1.17.0")] #[stable(feature = "move_cell", since = "1.17.0")]
pub fn into_inner(self) -> T { pub fn into_inner(self) -> T {
unsafe { self.value.into_inner() } self.value.into_inner()
} }
} }
@ -569,7 +569,7 @@ impl<T> RefCell<T> {
// compiler statically verifies that it is not currently borrowed. // compiler statically verifies that it is not currently borrowed.
// Therefore the following assertion is just a `debug_assert!`. // Therefore the following assertion is just a `debug_assert!`.
debug_assert!(self.borrow.get() == UNUSED); debug_assert!(self.borrow.get() == UNUSED);
unsafe { self.value.into_inner() } self.value.into_inner()
} }
/// Replaces the wrapped value with a new one, returning the old value, /// Replaces the wrapped value with a new one, returning the old value,
@ -1220,11 +1220,6 @@ impl<T> UnsafeCell<T> {
/// Unwraps the value. /// Unwraps the value.
/// ///
/// # Safety
///
/// This function is unsafe because this thread or another thread may currently be
/// inspecting the inner value.
///
/// # Examples /// # Examples
/// ///
/// ``` /// ```
@ -1232,11 +1227,11 @@ impl<T> UnsafeCell<T> {
/// ///
/// let uc = UnsafeCell::new(5); /// let uc = UnsafeCell::new(5);
/// ///
/// let five = unsafe { uc.into_inner() }; /// let five = uc.into_inner();
/// ``` /// ```
#[inline] #[inline]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub unsafe fn into_inner(self) -> T { pub fn into_inner(self) -> T {
self.value self.value
} }
} }

View File

@ -285,7 +285,7 @@ impl AtomicBool {
#[inline] #[inline]
#[stable(feature = "atomic_access", since = "1.15.0")] #[stable(feature = "atomic_access", since = "1.15.0")]
pub fn into_inner(self) -> bool { pub fn into_inner(self) -> bool {
unsafe { self.v.into_inner() != 0 } self.v.into_inner() != 0
} }
/// Loads a value from the bool. /// Loads a value from the bool.
@ -695,7 +695,7 @@ impl<T> AtomicPtr<T> {
#[inline] #[inline]
#[stable(feature = "atomic_access", since = "1.15.0")] #[stable(feature = "atomic_access", since = "1.15.0")]
pub fn into_inner(self) -> *mut T { pub fn into_inner(self) -> *mut T {
unsafe { self.p.into_inner() } self.p.into_inner()
} }
/// Loads a value from the pointer. /// Loads a value from the pointer.
@ -1051,7 +1051,7 @@ macro_rules! atomic_int {
#[inline] #[inline]
#[$stable_access] #[$stable_access]
pub fn into_inner(self) -> $int_type { pub fn into_inner(self) -> $int_type {
unsafe { self.v.into_inner() } self.v.into_inner()
} }
/// Loads a value from the atomic integer. /// Loads a value from the atomic integer.