]>
Commit | Line | Data |
---|---|---|
b7449926 | 1 | // run-pass |
0bf4aa26 | 2 | #![allow(dead_code)] |
b7449926 | 3 | |
3b2f2976 XL |
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))] | |
29967ef6 | 36 | #[derive(Copy, Clone)] |
3b2f2976 XL |
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 | } |