mirror of https://github.com/rust-lang/rust
96 lines
1.4 KiB
Rust
96 lines
1.4 KiB
Rust
#![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() { }
|