| #![feature(rustc_attrs)] | |
| // Various tests around the behavior of zero-sized arrays and | |
| // unions. This matches the behavior of modern C compilers, though | |
| // older compilers (and sometimes clang) treat `T[0]` as a "flexible | |
| // array member". See more | |
| // details in #56877. | |
| #[derive(Copy, Clone)] | |
| #[repr(C)] | |
| struct Empty { } | |
| #[derive(Copy, Clone)] | |
| #[repr(C)] | |
| struct Empty2 { | |
| e: Empty | |
| } | |
| #[derive(Copy, Clone)] | |
| #[repr(C)] | |
| struct Empty3 { | |
| z: [f32; 0], | |
| } | |
| #[derive(Copy, Clone)] | |
| #[repr(C)] | |
| struct Empty4 { | |
| e: Empty3 | |
| } | |
| #[repr(C)] | |
| union U1 { | |
| s: Empty | |
| } | |
| #[repr(C)] | |
| union U2 { | |
| s: Empty2 | |
| } | |
| #[repr(C)] | |
| union U3 { | |
| s: Empty3 | |
| } | |
| #[repr(C)] | |
| union U4 { | |
| s: Empty4 | |
| } | |
| #[repr(C)] | |
| struct Baz1 { | |
| x: f32, | |
| y: f32, | |
| u: U1, | |
| } | |
| #[rustc_dump_layout(homogeneous_aggregate)] | |
| type TestBaz1 = Baz1; | |
| //~^ ERROR homogeneous_aggregate: Ok(Homogeneous | |
| #[repr(C)] | |
| struct Baz2 { | |
| x: f32, | |
| y: f32, | |
| u: U2, | |
| } | |
| #[rustc_dump_layout(homogeneous_aggregate)] | |
| type TestBaz2 = Baz2; | |
| //~^ ERROR homogeneous_aggregate: Ok(Homogeneous | |
| #[repr(C)] | |
| struct Baz3 { | |
| x: f32, | |
| y: f32, | |
| u: U3, | |
| } | |
| #[rustc_dump_layout(homogeneous_aggregate)] | |
| type TestBaz3 = Baz3; | |
| //~^ ERROR homogeneous_aggregate: Ok(Homogeneous | |
| #[repr(C)] | |
| struct Baz4 { | |
| x: f32, | |
| y: f32, | |
| u: U4, | |
| } | |
| #[rustc_dump_layout(homogeneous_aggregate)] | |
| type TestBaz4 = Baz4; | |
| //~^ ERROR homogeneous_aggregate: Ok(Homogeneous | |
| fn main() { } |