| //@ run-pass | |
| #![allow(dead_code)] | |
| use std::mem; | |
| // Raising alignment | |
| #[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::<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); | |
| } |