diff options
Diffstat (limited to 'src/test/run-pass')
| -rw-r--r-- | src/test/run-pass/structs-enums/align-enum.rs | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/src/test/run-pass/structs-enums/align-enum.rs b/src/test/run-pass/structs-enums/align-enum.rs index 265bae89b80..8d72b1f6f0d 100644 --- a/src/test/run-pass/structs-enums/align-enum.rs +++ b/src/test/run-pass/structs-enums/align-enum.rs @@ -5,13 +5,51 @@ use std::mem; // Raising alignment -#[repr(align(8))] -enum Align8 { +#[repr(align(16))] +enum Align16 { Foo { foo: u32 }, Bar { bar: u32 }, } +// Raise alignment by maximum +#[repr(align(1), align(16))] +#[repr(align(32))] +#[repr(align(4))] +enum Align32 { + Foo, + Bar, +} + +// Not reducing alignment +#[repr(align(4))] +enum AlsoAlign16 { + Foo { limb_with_align16: Align16 }, + Bar, +} + +// No niche for discriminant when used as limb +#[repr(align(16))] +struct NoNiche16(u64, u64); + +// Discriminant will require extra space, but enum needs to stay compatible +// with alignment 16 +#[repr(align(1))] +enum AnotherAlign16 { + Foo { limb_with_noniche16: NoNiche16 }, + Bar, + Baz, +} + fn main() { - assert_eq!(mem::align_of::<Align8>(), 8); - assert_eq!(mem::size_of::<Align8>(), 8); + assert_eq!(mem::align_of::<Align16>(), 16); + assert_eq!(mem::size_of::<Align16>(), 16); + + assert_eq!(mem::align_of::<Align32>(), 32); + assert_eq!(mem::size_of::<Align32>(), 32); + + assert_eq!(mem::align_of::<AlsoAlign16>(), 16); + assert_eq!(mem::size_of::<AlsoAlign16>(), 16); + + assert_eq!(mem::align_of::<AnotherAlign16>(), 16); + assert_eq!(mem::size_of::<AnotherAlign16>(), 32); } |
