]> git.proxmox.com Git - rustc.git/blame - src/test/run-pass/union/union-align.rs
New upstream version 1.37.0+dfsg1
[rustc.git] / src / test / run-pass / union / union-align.rs
CommitLineData
b7449926 1// run-pass
0bf4aa26 2#![allow(dead_code)]
b7449926 3
3b2f2976
XL
4#![feature(untagged_unions)]
5
6use std::mem::{size_of, size_of_val, align_of, align_of_val};
7
8#[repr(align(16))]
9pub union U16 {
10 a: u8,
11 b: u32
12}
13
14fn 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
34mod 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}