]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/pass/union-overwrite.rs
:arrow_up: rust-analyzer
[rust.git] / src / tools / miri / tests / pass / union-overwrite.rs
1 #[repr(C)]
2 #[derive(Clone, Copy)]
3 struct Pair<T, U>(T, U);
4 #[repr(C)]
5 #[derive(Clone, Copy)]
6 struct Triple<T>(T, T, T);
7
8 #[repr(C)]
9 union U<A: Copy, B: Copy> {
10     a: Pair<A, A>,
11     b: B,
12 }
13
14 #[repr(C)]
15 union W<A: Copy, B: Copy> {
16     a: A,
17     b: B,
18 }
19
20 #[cfg(target_endian = "little")]
21 unsafe fn check() {
22     let mut u = U::<u8, u16> { b: 0xDE_DE };
23     u.a.0 = 0xBE;
24     assert_eq!(u.b, 0xDE_BE);
25
26     let mut u = U::<u16, u32> { b: 0xDEAD_DEAD };
27     u.a.0 = 0xBEEF;
28     assert_eq!(u.b, 0xDEAD_BEEF);
29
30     let mut u = U::<u32, u64> { b: 0xDEADBEEF_DEADBEEF };
31     u.a.0 = 0xBAADF00D;
32     assert_eq!(u.b, 0xDEADBEEF_BAADF00D);
33
34     let mut w = W::<Pair<Triple<u8>, u8>, u32> { b: 0xDEAD_DEAD };
35     w.a.0 = Triple(0, 0, 0);
36     assert_eq!(w.b, 0xDE00_0000);
37
38     let mut w = W::<Pair<u8, Triple<u8>>, u32> { b: 0xDEAD_DEAD };
39     w.a.1 = Triple(0, 0, 0);
40     assert_eq!(w.b, 0x0000_00AD);
41 }
42
43 #[cfg(target_endian = "big")]
44 unsafe fn check() {
45     let mut u = U::<u8, u16> { b: 0xDE_DE };
46     u.a.0 = 0xBE;
47     assert_eq!(u.b, 0xBE_DE);
48
49     let mut u = U::<u16, u32> { b: 0xDEAD_DEAD };
50     u.a.0 = 0xBEEF;
51     assert_eq!(u.b, 0xBEEF_DEAD);
52
53     let mut u = U::<u32, u64> { b: 0xDEADBEEF_DEADBEEF };
54     u.a.0 = 0xBAADF00D;
55     assert_eq!(u.b, 0xBAADF00D_DEADBEEF);
56
57     let mut w = W::<Pair<Triple<u8>, u8>, u32> { b: 0xDEAD_DEAD };
58     w.a.0 = Triple(0, 0, 0);
59     assert_eq!(w.b, 0x0000_00AD);
60
61     let mut w = W::<Pair<u8, Triple<u8>>, u32> { b: 0xDEAD_DEAD };
62     w.a.1 = Triple(0, 0, 0);
63     assert_eq!(w.b, 0xDE00_0000);
64 }
65
66 fn main() {
67     unsafe {
68         check();
69     }
70 }