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