about summary refs log tree commit diff
diff options
context:
space:
mode:
authorinquisitivecrystal <22333129+inquisitivecrystal@users.noreply.github.com>2021-08-31 16:32:01 -0700
committerinquisitivecrystal <22333129+inquisitivecrystal@users.noreply.github.com>2021-08-31 16:32:01 -0700
commit227e004d3fda91b72eef2b5e064dcbf3647dc68e (patch)
tree9307b1a290c8d8b322c0b3950c358c0334b10884
parent753dac16abd16411e1833b35ba82cabac6997cec (diff)
downloadrust-227e004d3fda91b72eef2b5e064dcbf3647dc68e.tar.gz
rust-227e004d3fda91b72eef2b5e064dcbf3647dc68e.zip
Add a few tests for `UnsafeCell`
-rw-r--r--library/core/tests/cell.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/library/core/tests/cell.rs b/library/core/tests/cell.rs
index 77517879dd2..85a006c5d5b 100644
--- a/library/core/tests/cell.rs
+++ b/library/core/tests/cell.rs
@@ -3,6 +3,38 @@ use core::default::Default;
 use std::mem::drop;
 
 #[test]
+fn smoketest_unsafe_cell() {
+    let mut x = UnsafeCell::new(10);
+    let ref_mut = &mut x;
+    unsafe {
+        // The asserts are repeated in order to ensure that `get()`
+        // is non-mutating.
+        assert_eq!(*ref_mut.get(), 10);
+        assert_eq!(*ref_mut.get(), 10);
+        *ref_mut.get_mut() += 5;
+        assert_eq!(*ref_mut.get(), 15);
+        assert_eq!(*ref_mut.get(), 15);
+        assert_eq!(x.into_inner(), 15);
+    }
+}
+
+#[test]
+fn unsafe_cell_raw_get() {
+    let x = UnsafeCell::new(10);
+    let ptr = &x as *const UnsafeCell<i32>;
+    unsafe {
+        // The asserts are repeated in order to ensure that `raw_get()`
+        // is non-mutating.
+        assert_eq!(*UnsafeCell::raw_get(ptr), 10);
+        assert_eq!(*UnsafeCell::raw_get(ptr), 10);
+        *UnsafeCell::raw_get(ptr) += 5;
+        assert_eq!(*UnsafeCell::raw_get(ptr), 15);
+        assert_eq!(*UnsafeCell::raw_get(ptr), 15);
+        assert_eq!(x.into_inner(), 15);
+    }
+}
+
+#[test]
 fn smoketest_cell() {
     let x = Cell::new(10);
     assert_eq!(x, Cell::new(10));