about summary refs log tree commit diff
path: root/src/test/run-pass
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/run-pass')
-rw-r--r--src/test/run-pass/structs-enums/align-enum.rs46
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);
 }