| #![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); | |
| } | |
| } |