]>
Commit | Line | Data |
---|---|---|
b7449926 | 1 | // run-pass |
0bf4aa26 | 2 | #![allow(dead_code)] |
b7449926 | 3 | |
3b2f2976 XL |
4 | #![feature(untagged_unions)] |
5 | ||
6 | use std::mem::{size_of, size_of_val, align_of, align_of_val}; | |
7 | ||
8 | #[repr(align(16))] | |
9 | pub union U16 { | |
10 | a: u8, | |
11 | b: u32 | |
12 | } | |
13 | ||
14 | fn main() { | |
15 | assert_eq!(align_of::<U16>(), 16); | |
16 | assert_eq!(size_of::<U16>(), 16); | |
17 | let u = U16 { a: 10 }; | |
18 | unsafe { | |
19 | assert_eq!(align_of_val(&u.a), 1); | |
20 | assert_eq!(size_of_val(&u.a), 1); | |
21 | assert_eq!(u.a, 10); | |
22 | } | |
23 | ||
24 | let u = U16 { b: 11 }; | |
25 | unsafe { | |
26 | assert_eq!(align_of_val(&u.b), 4); | |
27 | assert_eq!(size_of_val(&u.b), 4); | |
28 | assert_eq!(u.b, 11); | |
29 | } | |
30 | ||
31 | hybrid::check_hybrid(); | |
32 | } | |
33 | ||
34 | mod hybrid { | |
35 | use std::mem::{size_of, align_of}; | |
36 | ||
37 | #[repr(align(16))] | |
38 | struct S1 { | |
39 | a: u16, | |
40 | b: u8, | |
41 | } | |
42 | ||
43 | #[repr(align(32))] | |
44 | union U { | |
45 | s: S1, | |
46 | c: u16, | |
47 | } | |
48 | ||
49 | #[repr(align(64))] | |
50 | struct S2 { | |
51 | d: u8, | |
52 | u: U, | |
53 | } | |
54 | ||
55 | pub fn check_hybrid() { | |
56 | assert_eq!(align_of::<S1>(), 16); | |
57 | assert_eq!(size_of::<S1>(), 16); | |
58 | assert_eq!(align_of::<U>(), 32); | |
59 | assert_eq!(size_of::<U>(), 32); | |
60 | assert_eq!(align_of::<S2>(), 64); | |
61 | assert_eq!(size_of::<S2>(), 64); | |
62 | } | |
63 | } |