// run-pass #![allow(non_upper_case_globals)] // Issue #13186 // For simplicity of explanations assuming code is compiled for x86_64 // Linux ABI. // Size of TestOption is 16, and alignment of TestOption is 8. // Size of u8 is 1, and alignment of u8 is 1. // So size of Request is 24, and alignment of Request must be 8: // the maximum alignment of its fields. // Last 7 bytes of Request struct are not occupied by any fields. enum TestOption { TestNone, TestSome(T), } pub struct Request { foo: TestOption, bar: u8, } fn default_instance() -> &'static Request { static instance: Request = Request { // LLVM does not allow to specify alignment of expressions, thus // alignment of `foo` in constant is 1, not 8. foo: TestOption::TestNone, bar: 17, // Space after last field is not occupied by any data, but it is // reserved to make struct aligned properly. If compiler does // not insert padding after last field when emitting constant, // size of struct may be not equal to size of struct, and // compiler crashes in internal assertion check. }; &instance } fn non_default_instance() -> &'static Request { static instance: Request = Request { foo: TestOption::TestSome(0x1020304050607080), bar: 19, }; &instance } pub fn main() { match default_instance() { &Request { foo: TestOption::TestNone, bar: 17 } => {}, _ => panic!(), }; match non_default_instance() { &Request { foo: TestOption::TestSome(0x1020304050607080), bar: 19 } => {}, _ => panic!(), }; }