about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBenoît du Garreau <benoit.dugarreau@platform.sh>2020-11-04 11:41:57 +0100
committerBenoît du Garreau <benoit.dugarreau@platform.sh>2020-11-04 11:41:57 +0100
commit9a12d727df77d086c83167e5f68da2fdc7303f7b (patch)
tree3e2a072888494d5d639d1dc2a42c26bae78c444e
parent56293097f7f877f1350a6cd00f79d03132f16515 (diff)
downloadrust-9a12d727df77d086c83167e5f68da2fdc7303f7b.tar.gz
rust-9a12d727df77d086c83167e5f68da2fdc7303f7b.zip
Constantify `UnsafeCell::into_inner` and related
Also includes:
- Cell::into_inner
- RefCell::into_inner
- Atomic*::into_inner
-rw-r--r--library/core/src/cell.rs11
-rw-r--r--library/core/src/lib.rs1
-rw-r--r--library/core/src/sync/atomic.rs9
-rw-r--r--library/core/tests/cell.rs12
-rw-r--r--library/core/tests/lib.rs1
5 files changed, 26 insertions, 8 deletions
diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs
index 7140218fa91..d753b2a02f7 100644
--- a/library/core/src/cell.rs
+++ b/library/core/src/cell.rs
@@ -406,7 +406,8 @@ impl<T> Cell<T> {
     /// assert_eq!(five, 5);
     /// ```
     #[stable(feature = "move_cell", since = "1.17.0")]
-    pub fn into_inner(self) -> T {
+    #[rustc_const_unstable(feature = "const_cell_into_inner", issue = "none")]
+    pub const fn into_inner(self) -> T {
         self.value.into_inner()
     }
 }
@@ -668,12 +669,11 @@ impl<T> RefCell<T> {
     /// let five = c.into_inner();
     /// ```
     #[stable(feature = "rust1", since = "1.0.0")]
+    #[rustc_const_unstable(feature = "const_cell_into_inner", issue = "none")]
     #[inline]
-    pub fn into_inner(self) -> T {
+    pub const fn into_inner(self) -> T {
         // Since this function takes `self` (the `RefCell`) by value, the
         // compiler statically verifies that it is not currently borrowed.
-        // Therefore the following assertion is just a `debug_assert!`.
-        debug_assert!(self.borrow.get() == UNUSED);
         self.value.into_inner()
     }
 
@@ -1682,7 +1682,8 @@ impl<T> UnsafeCell<T> {
     /// ```
     #[inline]
     #[stable(feature = "rust1", since = "1.0.0")]
-    pub fn into_inner(self) -> T {
+    #[rustc_const_unstable(feature = "const_cell_into_inner", issue = "none")]
+    pub const fn into_inner(self) -> T {
         self.value
     }
 }
diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs
index b89ec93834f..ee63f1ab1f6 100644
--- a/library/core/src/lib.rs
+++ b/library/core/src/lib.rs
@@ -70,6 +70,7 @@
 #![feature(cfg_target_has_atomic)]
 #![feature(const_alloc_layout)]
 #![feature(const_discriminant)]
+#![feature(const_cell_into_inner)]
 #![feature(const_checked_int_methods)]
 #![feature(const_euclidean_int_methods)]
 #![feature(const_float_classify)]
diff --git a/library/core/src/sync/atomic.rs b/library/core/src/sync/atomic.rs
index 2edeb81011a..3283736c4fe 100644
--- a/library/core/src/sync/atomic.rs
+++ b/library/core/src/sync/atomic.rs
@@ -365,7 +365,8 @@ impl AtomicBool {
     /// ```
     #[inline]
     #[stable(feature = "atomic_access", since = "1.15.0")]
-    pub fn into_inner(self) -> bool {
+    #[rustc_const_unstable(feature = "const_cell_into_inner", issue = "none")]
+    pub const fn into_inner(self) -> bool {
         self.v.into_inner() != 0
     }
 
@@ -941,7 +942,8 @@ impl<T> AtomicPtr<T> {
     /// ```
     #[inline]
     #[stable(feature = "atomic_access", since = "1.15.0")]
-    pub fn into_inner(self) -> *mut T {
+    #[rustc_const_unstable(feature = "const_cell_into_inner", issue = "none")]
+    pub const fn into_inner(self) -> *mut T {
         self.p.into_inner()
     }
 
@@ -1462,7 +1464,8 @@ assert_eq!(some_var.into_inner(), 5);
 ```"),
                 #[inline]
                 #[$stable_access]
-                pub fn into_inner(self) -> $int_type {
+                #[rustc_const_unstable(feature = "const_cell_into_inner", issue = "none")]
+                pub const fn into_inner(self) -> $int_type {
                     self.v.into_inner()
                 }
             }
diff --git a/library/core/tests/cell.rs b/library/core/tests/cell.rs
index 40be01f4439..77517879dd2 100644
--- a/library/core/tests/cell.rs
+++ b/library/core/tests/cell.rs
@@ -422,3 +422,15 @@ fn refcell_format() {
     let msg = format!("{name} {}", &*what.borrow(), name = &*name.borrow());
     assert_eq!(msg, "rust rocks".to_string());
 }
+
+#[allow(dead_code)]
+fn const_cells() {
+    const UNSAFE_CELL: UnsafeCell<i32> = UnsafeCell::new(3);
+    const _: i32 = UNSAFE_CELL.into_inner();
+
+    const REF_CELL: RefCell<i32> = RefCell::new(3);
+    const _: i32 = REF_CELL.into_inner();
+
+    const CELL: Cell<i32> = Cell::new(3);
+    const _: i32 = CELL.into_inner();
+}
diff --git a/library/core/tests/lib.rs b/library/core/tests/lib.rs
index 0c4ce867f54..31aa4630564 100644
--- a/library/core/tests/lib.rs
+++ b/library/core/tests/lib.rs
@@ -9,6 +9,7 @@
 #![feature(box_syntax)]
 #![feature(cell_update)]
 #![feature(const_assume)]
+#![feature(const_cell_into_inner)]
 #![feature(core_intrinsics)]
 #![feature(core_private_bignum)]
 #![feature(core_private_diy_float)]