about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNiklas Fiekas <niklas.fiekas@backscattering.de>2019-01-31 14:18:31 +0100
committerNiklas Fiekas <niklas.fiekas@backscattering.de>2019-01-31 14:18:51 +0100
commit73bf0703a70098cdeebfb29709f74f101ab3e6b1 (patch)
tree40e3f0dee5536e8b82357f44b9e624ccbe608db3 /src
parentc6f6101180f8f18008b819b4e438824048b90925 (diff)
downloadrust-73bf0703a70098cdeebfb29709f74f101ab3e6b1.tar.gz
rust-73bf0703a70098cdeebfb29709f74f101ab3e6b1.zip
Add more tests for #[repr(align(x))] on enums
Diffstat (limited to 'src')
-rw-r--r--src/test/run-pass/structs-enums/align-enum.rs46
-rw-r--r--src/test/ui/repr/repr-align.rs4
-rw-r--r--src/test/ui/repr/repr-align.stderr14
3 files changed, 56 insertions, 8 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);
 }
diff --git a/src/test/ui/repr/repr-align.rs b/src/test/ui/repr/repr-align.rs
index 78ed6c7e1c4..9ce89e82ca2 100644
--- a/src/test/ui/repr/repr-align.rs
+++ b/src/test/ui/repr/repr-align.rs
@@ -1,3 +1,4 @@
+#![feature(repr_align_enum)]
 #![allow(dead_code)]
 
 #[repr(align(16.0))] //~ ERROR: invalid `repr(align)` attribute: not an unsuffixed integer
@@ -12,4 +13,7 @@ struct C(i32);
 #[repr(align(536870912))] // ok: this is the largest accepted alignment
 struct D(i32);
 
+#[repr(align(15))] //~ ERROR: invalid `repr(align)` attribute: not a power of two
+enum E { Left, Right }
+
 fn main() {}
diff --git a/src/test/ui/repr/repr-align.stderr b/src/test/ui/repr/repr-align.stderr
index e8dbf74232b..f1a5d88ace1 100644
--- a/src/test/ui/repr/repr-align.stderr
+++ b/src/test/ui/repr/repr-align.stderr
@@ -1,21 +1,27 @@
 error[E0589]: invalid `repr(align)` attribute: not an unsuffixed integer
-  --> $DIR/repr-align.rs:3:8
+  --> $DIR/repr-align.rs:4:8
    |
 LL | #[repr(align(16.0))] //~ ERROR: invalid `repr(align)` attribute: not an unsuffixed integer
    |        ^^^^^^^^^^^
 
 error[E0589]: invalid `repr(align)` attribute: not a power of two
-  --> $DIR/repr-align.rs:6:8
+  --> $DIR/repr-align.rs:7:8
    |
 LL | #[repr(align(15))] //~ ERROR: invalid `repr(align)` attribute: not a power of two
    |        ^^^^^^^^^
 
 error[E0589]: invalid `repr(align)` attribute: larger than 2^29
-  --> $DIR/repr-align.rs:9:8
+  --> $DIR/repr-align.rs:10:8
    |
 LL | #[repr(align(4294967296))] //~ ERROR: invalid `repr(align)` attribute: larger than 2^29
    |        ^^^^^^^^^^^^^^^^^
 
-error: aborting due to 3 previous errors
+error[E0589]: invalid `repr(align)` attribute: not a power of two
+  --> $DIR/repr-align.rs:16:8
+   |
+LL | #[repr(align(15))] //~ ERROR: invalid `repr(align)` attribute: not a power of two
+   |        ^^^^^^^^^
+
+error: aborting due to 4 previous errors
 
 For more information about this error, try `rustc --explain E0589`.