// run-pass // revisions: mirunsafeck thirunsafeck // [thirunsafeck]compile-flags: -Z thir-unsafeck #[repr(C)] #[derive(Copy, Clone)] struct Pair(T, U); #[repr(C)] #[derive(Copy, Clone)] struct Triple(T, T, T); #[repr(C)] union U where A: Copy, B: Copy { a: Pair, b: B, } #[repr(C)] union W where A: Copy, B: Copy { a: A, b: B, } #[cfg(target_endian = "little")] unsafe fn check() { let mut u = U:: { b: 0xDE_DE }; u.a.0 = 0xBE; assert_eq!(u.b, 0xDE_BE); let mut u = U:: { b: 0xDEAD_DEAD }; u.a.0 = 0xBEEF; assert_eq!(u.b, 0xDEAD_BEEF); let mut u = U:: { b: 0xDEADBEEF_DEADBEEF }; u.a.0 = 0xBAADF00D; assert_eq!(u.b, 0xDEADBEEF_BAADF00D); let mut w = W::, u8>, u32> { b: 0xDEAD_DEAD }; w.a.0 = Triple(0, 0, 0); assert_eq!(w.b, 0xDE00_0000); let mut w = W::>, u32> { b: 0xDEAD_DEAD }; w.a.1 = Triple(0, 0, 0); assert_eq!(w.b, 0x0000_00AD); } #[cfg(target_endian = "big")] unsafe fn check() { let mut u = U:: { b: 0xDE_DE }; u.a.0 = 0xBE; assert_eq!(u.b, 0xBE_DE); let mut u = U:: { b: 0xDEAD_DEAD }; u.a.0 = 0xBEEF; assert_eq!(u.b, 0xBEEF_DEAD); let mut u = U:: { b: 0xDEADBEEF_DEADBEEF }; u.a.0 = 0xBAADF00D; assert_eq!(u.b, 0xBAADF00D_DEADBEEF); let mut w = W::, u8>, u32> { b: 0xDEAD_DEAD }; w.a.0 = Triple(0, 0, 0); assert_eq!(w.b, 0x0000_00AD); let mut w = W::>, u32> { b: 0xDEAD_DEAD }; w.a.1 = Triple(0, 0, 0); assert_eq!(w.b, 0xDE00_0000); } fn main() { unsafe { check(); } }