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")]
check()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")]
check()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
main()66 fn main() {
67 unsafe {
68 check();
69 }
70 }
71