]> git.lizzy.rs Git - rust.git/blob - src/test/ui/union/union-align.rs
Merge commit '03f01bbe901d60b71cf2c5ec766aef5e532ab79d' into update_cg_clif-2020...
[rust.git] / src / test / ui / union / union-align.rs
1 // run-pass
2 #![allow(dead_code)]
3
4 use std::mem::{size_of, size_of_val, align_of, align_of_val};
5
6 #[repr(align(16))]
7 pub union U16 {
8     a: u8,
9     b: u32
10 }
11
12 fn main() {
13     assert_eq!(align_of::<U16>(), 16);
14     assert_eq!(size_of::<U16>(), 16);
15     let u = U16 { a: 10 };
16     unsafe {
17         assert_eq!(align_of_val(&u.a), 1);
18         assert_eq!(size_of_val(&u.a), 1);
19         assert_eq!(u.a, 10);
20     }
21
22     let u = U16 { b: 11 };
23     unsafe {
24         assert_eq!(align_of_val(&u.b), 4);
25         assert_eq!(size_of_val(&u.b), 4);
26         assert_eq!(u.b, 11);
27     }
28
29     hybrid::check_hybrid();
30 }
31
32 mod hybrid {
33     use std::mem::{size_of, align_of};
34
35     #[repr(align(16))]
36     #[derive(Copy, Clone)]
37     struct S1 {
38         a: u16,
39         b: u8,
40     }
41
42     #[repr(align(32))]
43     union U {
44         s: S1,
45         c: u16,
46     }
47
48     #[repr(align(64))]
49     struct S2 {
50         d: u8,
51         u: U,
52     }
53
54     pub fn check_hybrid() {
55         assert_eq!(align_of::<S1>(), 16);
56         assert_eq!(size_of::<S1>(), 16);
57         assert_eq!(align_of::<U>(), 32);
58         assert_eq!(size_of::<U>(), 32);
59         assert_eq!(align_of::<S2>(), 64);
60         assert_eq!(size_of::<S2>(), 64);
61     }
62 }