]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/pass/write-bytes.rs
Auto merge of #104915 - weihanglo:update-cargo, r=ehuss
[rust.git] / src / tools / miri / tests / pass / write-bytes.rs
1 #![feature(core_intrinsics)] // for `volatile_set_memory`
2
3 #[repr(C)]
4 #[derive(Copy, Clone)]
5 struct Foo {
6     a: u64,
7     b: u64,
8     c: u64,
9 }
10
11 fn main() {
12     const LENGTH: usize = 10;
13     let mut v: [u64; LENGTH] = [0; LENGTH];
14
15     for idx in 0..LENGTH {
16         assert_eq!(v[idx], 0);
17     }
18
19     unsafe {
20         let p = v.as_mut_ptr();
21         ::std::ptr::write_bytes(p, 0xab, LENGTH);
22     }
23
24     for idx in 0..LENGTH {
25         assert_eq!(v[idx], 0xabababababababab);
26     }
27
28     // -----
29
30     let mut w: [Foo; LENGTH] = [Foo { a: 0, b: 0, c: 0 }; LENGTH];
31     for idx in 0..LENGTH {
32         assert_eq!(w[idx].a, 0);
33         assert_eq!(w[idx].b, 0);
34         assert_eq!(w[idx].c, 0);
35     }
36
37     unsafe {
38         let p = w.as_mut_ptr();
39         ::std::ptr::write_bytes(p, 0xcd, LENGTH);
40     }
41
42     for idx in 0..LENGTH {
43         assert_eq!(w[idx].a, 0xcdcdcdcdcdcdcdcd);
44         assert_eq!(w[idx].b, 0xcdcdcdcdcdcdcdcd);
45         assert_eq!(w[idx].c, 0xcdcdcdcdcdcdcdcd);
46     }
47
48     // -----
49     // `std::intrinsics::volatile_set_memory` should behave identically
50
51     let mut v: [u64; LENGTH] = [0; LENGTH];
52
53     for idx in 0..LENGTH {
54         assert_eq!(v[idx], 0);
55     }
56
57     unsafe {
58         let p = v.as_mut_ptr();
59         ::std::intrinsics::volatile_set_memory(p, 0xab, LENGTH);
60     }
61
62     for idx in 0..LENGTH {
63         assert_eq!(v[idx], 0xabababababababab);
64     }
65
66     // -----
67
68     let mut w: [Foo; LENGTH] = [Foo { a: 0, b: 0, c: 0 }; LENGTH];
69     for idx in 0..LENGTH {
70         assert_eq!(w[idx].a, 0);
71         assert_eq!(w[idx].b, 0);
72         assert_eq!(w[idx].c, 0);
73     }
74
75     unsafe {
76         let p = w.as_mut_ptr();
77         ::std::intrinsics::volatile_set_memory(p, 0xcd, LENGTH);
78     }
79
80     for idx in 0..LENGTH {
81         assert_eq!(w[idx].a, 0xcdcdcdcdcdcdcdcd);
82         assert_eq!(w[idx].b, 0xcdcdcdcdcdcdcdcd);
83         assert_eq!(w[idx].c, 0xcdcdcdcdcdcdcdcd);
84     }
85 }