about summary refs log tree commit diff
path: root/tests/ui/simd/size-align.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/simd/size-align.rs')
-rw-r--r--tests/ui/simd/size-align.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/ui/simd/size-align.rs b/tests/ui/simd/size-align.rs
new file mode 100644
index 00000000000..0afa4947225
--- /dev/null
+++ b/tests/ui/simd/size-align.rs
@@ -0,0 +1,53 @@
+// run-pass
+#![allow(deprecated)]
+
+
+#![feature(repr_simd)]
+#![allow(non_camel_case_types)]
+
+use std::mem;
+
+/// `T` should satisfy `size_of T (mod min_align_of T) === 0` to be stored at `Vec<T>` properly
+/// Please consult the issue #20460
+fn check<T>() {
+    assert_eq!(mem::size_of::<T>() % mem::min_align_of::<T>(), 0);
+    assert_eq!(mem::size_of::<T>() % mem::min_align_of::<T>(), 0);
+    assert_eq!(mem::size_of::<T>() % mem::min_align_of::<T>(), 0);
+}
+
+#[repr(simd)]
+struct U8<const N: usize>([u8; N]);
+
+#[repr(simd)]
+struct I16<const N: usize>([i16; N]);
+
+#[repr(simd)]
+struct F32<const N: usize>([f32; N]);
+
+#[repr(simd)]
+struct Usize<const N: usize>([usize; N]);
+
+#[repr(simd)]
+struct Isize<const N: usize>([isize; N]);
+
+fn main() {
+    check::<U8<2>>();
+    check::<U8<4>>();
+    check::<U8<8>>();
+
+    check::<I16<2>>();
+    check::<I16<4>>();
+    check::<I16<8>>();
+
+    check::<F32<2>>();
+    check::<F32<4>>();
+    check::<F32<8>>();
+
+    check::<Usize<2>>();
+    check::<Usize<4>>();
+    check::<Usize<8>>();
+
+    check::<Isize<2>>();
+    check::<Isize<4>>();
+    check::<Isize<8>>();
+}