about summary refs log tree commit diff
path: root/src/tools/miri/tests/pass/write-bytes.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/miri/tests/pass/write-bytes.rs')
-rw-r--r--src/tools/miri/tests/pass/write-bytes.rs85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/tools/miri/tests/pass/write-bytes.rs b/src/tools/miri/tests/pass/write-bytes.rs
new file mode 100644
index 00000000000..b2050c5393e
--- /dev/null
+++ b/src/tools/miri/tests/pass/write-bytes.rs
@@ -0,0 +1,85 @@
+#![feature(core_intrinsics)] // for `volatile_set_memory`
+
+#[repr(C)]
+#[derive(Copy, Clone)]
+struct Foo {
+    a: u64,
+    b: u64,
+    c: u64,
+}
+
+fn main() {
+    const LENGTH: usize = 10;
+    let mut v: [u64; LENGTH] = [0; LENGTH];
+
+    for idx in 0..LENGTH {
+        assert_eq!(v[idx], 0);
+    }
+
+    unsafe {
+        let p = v.as_mut_ptr();
+        ::std::ptr::write_bytes(p, 0xab, LENGTH);
+    }
+
+    for idx in 0..LENGTH {
+        assert_eq!(v[idx], 0xabababababababab);
+    }
+
+    // -----
+
+    let mut w: [Foo; LENGTH] = [Foo { a: 0, b: 0, c: 0 }; LENGTH];
+    for idx in 0..LENGTH {
+        assert_eq!(w[idx].a, 0);
+        assert_eq!(w[idx].b, 0);
+        assert_eq!(w[idx].c, 0);
+    }
+
+    unsafe {
+        let p = w.as_mut_ptr();
+        ::std::ptr::write_bytes(p, 0xcd, LENGTH);
+    }
+
+    for idx in 0..LENGTH {
+        assert_eq!(w[idx].a, 0xcdcdcdcdcdcdcdcd);
+        assert_eq!(w[idx].b, 0xcdcdcdcdcdcdcdcd);
+        assert_eq!(w[idx].c, 0xcdcdcdcdcdcdcdcd);
+    }
+
+    // -----
+    // `std::intrinsics::volatile_set_memory` should behave identically
+
+    let mut v: [u64; LENGTH] = [0; LENGTH];
+
+    for idx in 0..LENGTH {
+        assert_eq!(v[idx], 0);
+    }
+
+    unsafe {
+        let p = v.as_mut_ptr();
+        ::std::intrinsics::volatile_set_memory(p, 0xab, LENGTH);
+    }
+
+    for idx in 0..LENGTH {
+        assert_eq!(v[idx], 0xabababababababab);
+    }
+
+    // -----
+
+    let mut w: [Foo; LENGTH] = [Foo { a: 0, b: 0, c: 0 }; LENGTH];
+    for idx in 0..LENGTH {
+        assert_eq!(w[idx].a, 0);
+        assert_eq!(w[idx].b, 0);
+        assert_eq!(w[idx].c, 0);
+    }
+
+    unsafe {
+        let p = w.as_mut_ptr();
+        ::std::intrinsics::volatile_set_memory(p, 0xcd, LENGTH);
+    }
+
+    for idx in 0..LENGTH {
+        assert_eq!(w[idx].a, 0xcdcdcdcdcdcdcdcd);
+        assert_eq!(w[idx].b, 0xcdcdcdcdcdcdcdcd);
+        assert_eq!(w[idx].c, 0xcdcdcdcdcdcdcdcd);
+    }
+}