#![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_layout(homogeneous_aggregate)] type TestBaz1 = Baz1; //~^ ERROR homogeneous_aggregate: Ok(Homogeneous #[repr(C)] struct Baz2 { x: f32, y: f32, u: U2, } #[rustc_layout(homogeneous_aggregate)] type TestBaz2 = Baz2; //~^ ERROR homogeneous_aggregate: Ok(Homogeneous #[repr(C)] struct Baz3 { x: f32, y: f32, u: U3, } #[rustc_layout(homogeneous_aggregate)] type TestBaz3 = Baz3; //~^ ERROR homogeneous_aggregate: Ok(Homogeneous #[repr(C)] struct Baz4 { x: f32, y: f32, u: U4, } #[rustc_layout(homogeneous_aggregate)] type TestBaz4 = Baz4; //~^ ERROR homogeneous_aggregate: Ok(Homogeneous fn main() { }