]> git.lizzy.rs Git - rust.git/blob - src/test/ui/packed/packed-tuple-struct-size.rs
Auto merge of #93718 - thomcc:used-macho, r=pnkfelix
[rust.git] / src / test / ui / packed / packed-tuple-struct-size.rs
1 // run-pass
2 #![allow(dead_code)]
3 #![allow(non_camel_case_types)]
4
5 use std::mem;
6
7 #[repr(packed)]
8 struct P1S4(u8,[u8;  3]);
9
10 #[repr(packed(2))]
11 struct P2S4(u8,[u8;  3]);
12
13 #[repr(packed)]
14 struct P1S5(u8, u32);
15
16 #[repr(packed(2))]
17 struct P2S6(u8, u32);
18
19 #[repr(packed)]
20 struct P1S13(i64, f32, u8);
21
22 #[repr(packed(2))]
23 struct P2S14(i64, f32, u8);
24
25 #[repr(packed(4))]
26 struct P4S16(u8, f32, i64, u16);
27
28 #[repr(C, packed(4))]
29 struct P4CS20(u8, f32, i64, u16);
30
31 enum Foo {
32     Bar = 1,
33     Baz = 2
34 }
35
36 #[repr(packed)]
37 struct P1S3_Foo(u8, u16, Foo);
38
39 #[repr(packed(2))]
40 struct P2_Foo(Foo);
41
42 #[repr(packed(2))]
43 struct P2S3_Foo(u8, u16, Foo);
44
45 #[repr(packed)]
46 struct P1S7_Option(f32, u8, u16, Option<Box<f64>>);
47
48 #[repr(packed(2))]
49 struct P2_Option(Option<Box<f64>>);
50
51 #[repr(packed(2))]
52 struct P2S7_Option(f32, u8, u16, Option<Box<f64>>);
53
54 fn align_to(value: usize, align: usize) -> usize {
55     (value + (align - 1)) & !(align - 1)
56 }
57
58 macro_rules! check {
59     ($t:ty, $align:expr, $size:expr) => ({
60         assert_eq!(mem::align_of::<$t>(), $align);
61         assert_eq!(mem::size_of::<$t>(), $size);
62     });
63 }
64
65 pub fn main() {
66     check!(P1S4, 1, 4);
67     check!(P1S5, 1, 5);
68     check!(P1S13, 1, 13);
69     check!(P1S3_Foo, 1, 3 + mem::size_of::<Foo>());
70     check!(P1S7_Option, 1, 7 + mem::size_of::<Option<Box<f64>>>());
71
72     check!(P2S4, 1, 4);
73     check!(P2S6, 2, 6);
74     check!(P2S14, 2, 14);
75     check!(P4S16, 4, 16);
76     check!(P4CS20, 4, 20);
77     check!(P2S3_Foo, 2, align_to(3 + mem::size_of::<P2_Foo>(), 2));
78     check!(P2S7_Option, 2, align_to(7 + mem::size_of::<P2_Option>(), 2));
79 }