]> git.lizzy.rs Git - rust.git/blob - src/test/ui/print_type_sizes/packed.rs
Auto merge of #55780 - ogoffart:span_source_text, r=petrochenkov
[rust.git] / src / test / ui / print_type_sizes / packed.rs
1 // compile-flags: -Z print-type-sizes
2 // compile-pass
3
4 // This file illustrates how packing is handled; it should cause
5 // the elimination of padding that would normally be introduced
6 // to satisfy alignment desirata.
7 //
8 // It avoids using u64/i64 because on some targets that is only 4-byte
9 // aligned (while on most it is 8-byte aligned) and so the resulting
10 // padding and overall computed sizes can be quite different.
11
12 #![allow(dead_code)]
13 #![feature(start)]
14
15 #[derive(Default)]
16 #[repr(packed)]
17 struct Packed1 {
18     a: u8,
19     b: u8,
20     g: i32,
21     c: u8,
22     h: i16,
23     d: u8,
24 }
25
26 #[derive(Default)]
27 #[repr(packed(2))]
28 struct Packed2 {
29     a: u8,
30     b: u8,
31     g: i32,
32     c: u8,
33     h: i16,
34     d: u8,
35 }
36
37 #[derive(Default)]
38 #[repr(packed(2))]
39 #[repr(C)]
40 struct Packed2C {
41     a: u8,
42     b: u8,
43     g: i32,
44     c: u8,
45     h: i16,
46     d: u8,
47 }
48
49 #[derive(Default)]
50 struct Padded {
51     a: u8,
52     b: u8,
53     g: i32,
54     c: u8,
55     h: i16,
56     d: u8,
57 }
58
59 #[start]
60 fn start(_: isize, _: *const *const u8) -> isize {
61     let _c: Packed1 = Default::default();
62     let _d: Packed2 = Default::default();
63     let _e: Packed2C = Default::default();
64     let _f: Padded = Default::default();
65     0
66 }