summaryrefslogtreecommitdiffstats
path: root/src/test/ui/structs-enums/codegen-tag-static-padding.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/structs-enums/codegen-tag-static-padding.rs')
-rw-r--r--src/test/ui/structs-enums/codegen-tag-static-padding.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/test/ui/structs-enums/codegen-tag-static-padding.rs b/src/test/ui/structs-enums/codegen-tag-static-padding.rs
new file mode 100644
index 000000000..8aa087c01
--- /dev/null
+++ b/src/test/ui/structs-enums/codegen-tag-static-padding.rs
@@ -0,0 +1,59 @@
+// 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<u64> is 16, and alignment of TestOption<u64> 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<T> {
+ TestNone,
+ TestSome(T),
+}
+
+pub struct Request {
+ foo: TestOption<u64>,
+ 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!(),
+ };
+}