2019-01-09 20:16:32 +00:00
|
|
|
#![feature(rustc_attrs)]
|
|
|
|
|
|
|
|
// Regression test for #56877. We want to ensure that the presence of
|
|
|
|
// `PhantomData` does not prevent `Bar` from being considered a
|
|
|
|
// homogeneous aggregate.
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct BaseCase {
|
|
|
|
pub a: f32,
|
|
|
|
pub b: f32,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct WithPhantomData {
|
|
|
|
pub a: f32,
|
|
|
|
pub b: f32,
|
|
|
|
pub _unit: std::marker::PhantomData<()>,
|
|
|
|
}
|
|
|
|
|
2022-04-30 16:30:11 +00:00
|
|
|
pub struct EmptyRustStruct {}
|
2019-01-09 20:16:32 +00:00
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct WithEmptyRustStruct {
|
|
|
|
pub a: f32,
|
|
|
|
pub b: f32,
|
|
|
|
pub _unit: EmptyRustStruct,
|
|
|
|
}
|
|
|
|
|
|
|
|
pub struct TransitivelyEmptyRustStruct {
|
|
|
|
field: EmptyRustStruct,
|
|
|
|
array: [u32; 0],
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct WithTransitivelyEmptyRustStruct {
|
|
|
|
pub a: f32,
|
|
|
|
pub b: f32,
|
|
|
|
pub _unit: TransitivelyEmptyRustStruct,
|
|
|
|
}
|
|
|
|
|
|
|
|
pub enum EmptyRustEnum {
|
|
|
|
Dummy,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
pub struct WithEmptyRustEnum {
|
|
|
|
pub a: f32,
|
|
|
|
pub b: f32,
|
|
|
|
pub _unit: EmptyRustEnum,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[rustc_layout(homogeneous_aggregate)]
|
|
|
|
pub type Test1 = BaseCase;
|
2022-04-30 16:30:11 +00:00
|
|
|
//~^ ERROR homogeneous_aggregate: Ok(Homogeneous(Reg { kind: Float, size: Size(4 bytes) }))
|
2019-01-09 20:16:32 +00:00
|
|
|
|
|
|
|
#[rustc_layout(homogeneous_aggregate)]
|
|
|
|
pub type Test2 = WithPhantomData;
|
2022-04-30 16:30:11 +00:00
|
|
|
//~^ ERROR homogeneous_aggregate: Ok(Homogeneous(Reg { kind: Float, size: Size(4 bytes) }))
|
2019-01-09 20:16:32 +00:00
|
|
|
|
|
|
|
#[rustc_layout(homogeneous_aggregate)]
|
|
|
|
pub type Test3 = WithEmptyRustStruct;
|
2022-04-30 16:30:11 +00:00
|
|
|
//~^ ERROR homogeneous_aggregate: Ok(Homogeneous(Reg { kind: Float, size: Size(4 bytes) }))
|
2019-01-09 20:16:32 +00:00
|
|
|
|
|
|
|
#[rustc_layout(homogeneous_aggregate)]
|
|
|
|
pub type Test4 = WithTransitivelyEmptyRustStruct;
|
2022-04-30 16:30:11 +00:00
|
|
|
//~^ ERROR homogeneous_aggregate: Ok(Homogeneous(Reg { kind: Float, size: Size(4 bytes) }))
|
2019-01-09 20:16:32 +00:00
|
|
|
|
|
|
|
#[rustc_layout(homogeneous_aggregate)]
|
|
|
|
pub type Test5 = WithEmptyRustEnum;
|
2022-04-30 16:30:11 +00:00
|
|
|
//~^ ERROR homogeneous_aggregate: Ok(Homogeneous(Reg { kind: Float, size: Size(4 bytes) }))
|
2019-01-09 20:16:32 +00:00
|
|
|
|
2022-04-30 16:30:11 +00:00
|
|
|
fn main() {}
|