]> git.proxmox.com Git - rustc.git/blob - src/test/ui/union/union-align.rs
New upstream version 1.49.0~beta.4+dfsg1
[rustc.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 }