about summary refs log tree commit diff
path: root/src/test/ui/simd
diff options
context:
space:
mode:
authorCaleb Zulawski <caleb.zulawski@gmail.com>2021-01-23 17:55:34 -0500
committerCaleb Zulawski <caleb.zulawski@gmail.com>2021-01-23 17:55:34 -0500
commitf39f1a4ad93b6bca237631ff5c3325e7d0ddbd67 (patch)
treefde99ad4c281bafa8d6ea79b6436902fb6c9ec66 /src/test/ui/simd
parent4d72ed61ee11acf084de1a375c839ce40bbdf548 (diff)
Move SIMD tests
Diffstat (limited to 'src/test/ui/simd')
-rw-r--r--src/test/ui/simd/issue-17170.rs11
-rw-r--r--src/test/ui/simd/issue-17170.stderr11
-rw-r--r--src/test/ui/simd/issue-39720.rs23
-rw-r--r--src/test/ui/simd/issue-39720.stderr15
-rw-r--r--src/test/ui/simd/simd-type-generic-monomorphisation-empty.rs12
-rw-r--r--src/test/ui/simd/simd-type-generic-monomorphisation-empty.stderr4
-rw-r--r--src/test/ui/simd/simd-type-generic-monomorphisation-oversized.rs12
-rw-r--r--src/test/ui/simd/simd-type-generic-monomorphisation-oversized.stderr4
-rw-r--r--src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.rs12
-rw-r--r--src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.stderr4
-rw-r--r--src/test/ui/simd/simd-type-generic-monomorphisation.rs15
-rw-r--r--src/test/ui/simd/simd-type-generic-monomorphisation.stderr4
-rw-r--r--src/test/ui/simd/simd-type.rs34
-rw-r--r--src/test/ui/simd/simd-type.stderr46
14 files changed, 202 insertions, 5 deletions
diff --git a/src/test/ui/simd/issue-17170.rs b/src/test/ui/simd/issue-17170.rs
new file mode 100644
index 00000000000..49cfbab9a3e
--- /dev/null
+++ b/src/test/ui/simd/issue-17170.rs
@@ -0,0 +1,11 @@
+#![feature(repr_simd)]
+
+#[repr(simd)]
+struct T(f64, f64, f64);
+//~^ ERROR SIMD vector length must be a power of two
+
+static X: T = T(0.0, 0.0, 0.0);
+
+fn main() {
+    let _ = X;
+}
diff --git a/src/test/ui/simd/issue-17170.stderr b/src/test/ui/simd/issue-17170.stderr
new file mode 100644
index 00000000000..b35c3c4dc98
--- /dev/null
+++ b/src/test/ui/simd/issue-17170.stderr
@@ -0,0 +1,11 @@
+error[E0075]: SIMD vector length must be a power of two
+  --> $DIR/issue-17170.rs:4:1
+   |
+LL | struct T(f64, f64, f64);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: monomorphising SIMD type `T` of non-power-of-two length
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0075`.
diff --git a/src/test/ui/simd/issue-39720.rs b/src/test/ui/simd/issue-39720.rs
new file mode 100644
index 00000000000..7d596926512
--- /dev/null
+++ b/src/test/ui/simd/issue-39720.rs
@@ -0,0 +1,23 @@
+// ignore-emscripten FIXME(#45351)
+
+#![feature(repr_simd, platform_intrinsics)]
+
+#[repr(simd)]
+#[derive(Copy, Clone, Debug)]
+pub struct Char3(pub i8, pub i8, pub i8);
+//~^ ERROR SIMD vector length must be a power of two
+
+#[repr(simd)]
+#[derive(Copy, Clone, Debug)]
+pub struct Short3(pub i16, pub i16, pub i16);
+//~^ ERROR SIMD vector length must be a power of two
+
+extern "platform-intrinsic" {
+    fn simd_cast<T, U>(x: T) -> U;
+}
+
+fn main() {
+    let cast: Short3 = unsafe { simd_cast(Char3(10, -3, -9)) };
+
+    println!("{:?}", cast);
+}
diff --git a/src/test/ui/simd/issue-39720.stderr b/src/test/ui/simd/issue-39720.stderr
new file mode 100644
index 00000000000..355ceff0050
--- /dev/null
+++ b/src/test/ui/simd/issue-39720.stderr
@@ -0,0 +1,15 @@
+error[E0075]: SIMD vector length must be a power of two
+  --> $DIR/issue-39720.rs:7:1
+   |
+LL | pub struct Char3(pub i8, pub i8, pub i8);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error[E0075]: SIMD vector length must be a power of two
+  --> $DIR/issue-39720.rs:12:1
+   |
+LL | pub struct Short3(pub i16, pub i16, pub i16);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0075`.
diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-empty.rs b/src/test/ui/simd/simd-type-generic-monomorphisation-empty.rs
new file mode 100644
index 00000000000..0121404c749
--- /dev/null
+++ b/src/test/ui/simd/simd-type-generic-monomorphisation-empty.rs
@@ -0,0 +1,12 @@
+// build-fail
+
+#![feature(repr_simd, platform_intrinsics)]
+
+// error-pattern:monomorphising SIMD type `Simd<0_usize>` of zero length
+
+#[repr(simd)]
+struct Simd<const N: usize>([f32; N]);
+
+fn main() {
+    let _ = Simd::<0>([]);
+}
diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-empty.stderr b/src/test/ui/simd/simd-type-generic-monomorphisation-empty.stderr
new file mode 100644
index 00000000000..00fde199b12
--- /dev/null
+++ b/src/test/ui/simd/simd-type-generic-monomorphisation-empty.stderr
@@ -0,0 +1,4 @@
+error: monomorphising SIMD type `Simd<0_usize>` of zero length
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.rs b/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.rs
new file mode 100644
index 00000000000..bd0d457b35e
--- /dev/null
+++ b/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.rs
@@ -0,0 +1,12 @@
+// build-fail
+
+#![feature(repr_simd, platform_intrinsics)]
+
+// error-pattern:monomorphising SIMD type `Simd<65536_usize>` of length greater than 32768
+
+#[repr(simd)]
+struct Simd<const N: usize>([f32; N]);
+
+fn main() {
+    let _ = Simd::<65536>([0.; 65536]);
+}
diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.stderr b/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.stderr
new file mode 100644
index 00000000000..f4418350115
--- /dev/null
+++ b/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.stderr
@@ -0,0 +1,4 @@
+error: monomorphising SIMD type `Simd<65536_usize>` of length greater than 32768
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.rs b/src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.rs
new file mode 100644
index 00000000000..3a0b9e02663
--- /dev/null
+++ b/src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.rs
@@ -0,0 +1,12 @@
+// build-fail
+
+#![feature(repr_simd, platform_intrinsics)]
+
+// error-pattern:monomorphising SIMD type `Simd<3_usize>` of non-power-of-two length
+
+#[repr(simd)]
+struct Simd<const N: usize>([f32; N]);
+
+fn main() {
+    let _ = Simd::<3>([0.; 3]);
+}
diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.stderr b/src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.stderr
new file mode 100644
index 00000000000..82cc0d8714a
--- /dev/null
+++ b/src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.stderr
@@ -0,0 +1,4 @@
+error: monomorphising SIMD type `Simd<3_usize>` of non-power-of-two length
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation.rs b/src/test/ui/simd/simd-type-generic-monomorphisation.rs
new file mode 100644
index 00000000000..0275f0ce4c1
--- /dev/null
+++ b/src/test/ui/simd/simd-type-generic-monomorphisation.rs
@@ -0,0 +1,15 @@
+// build-fail
+
+#![feature(repr_simd, platform_intrinsics)]
+
+// ignore-tidy-linelength
+
+// error-pattern:monomorphising SIMD type `Simd2<X>` with a non-primitive-scalar (integer/float/pointer) element type `X`
+
+struct X(Vec<i32>);
+#[repr(simd)]
+struct Simd2<T>(T, T);
+
+fn main() {
+    let _ = Simd2(X(vec![]), X(vec![]));
+}
diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation.stderr b/src/test/ui/simd/simd-type-generic-monomorphisation.stderr
new file mode 100644
index 00000000000..7f23893ac85
--- /dev/null
+++ b/src/test/ui/simd/simd-type-generic-monomorphisation.stderr
@@ -0,0 +1,4 @@
+error: monomorphising SIMD type `Simd2<X>` with a non-primitive-scalar (integer/float/pointer) element type `X`
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/simd/simd-type.rs b/src/test/ui/simd/simd-type.rs
index e7b9bfe32f8..cc7443d0485 100644
--- a/src/test/ui/simd/simd-type.rs
+++ b/src/test/ui/simd/simd-type.rs
@@ -1,9 +1,33 @@
-// run-pass
-#![allow(dead_code)]
+#![feature(repr_simd)]
+#![allow(non_camel_case_types)]
 
-// pretty-expanded FIXME #23616
+// ignore-tidy-linelength
 
-#![feature(repr_simd)]
+#[repr(simd)]
+struct empty; //~ ERROR SIMD vector cannot be empty
+
+#[repr(simd)]
+struct empty2([f32; 0]); //~ ERROR SIMD vector cannot be empty
+
+#[repr(simd)]
+struct pow2([f32; 7]); //~ ERROR SIMD vector length must be a power of two
+
+#[repr(simd)]
+struct i64f64(i64, f64); //~ ERROR SIMD vector should be homogeneous
+
+struct Foo;
+
+#[repr(simd)]
+struct FooV(Foo, Foo); //~ ERROR SIMD vector element type should be a primitive scalar (integer/float/pointer) type
+
+#[repr(simd)]
+struct FooV2([Foo; 2]); //~ ERROR SIMD vector element type should be a primitive scalar (integer/float/pointer) type
+
+#[repr(simd)]
+struct TooBig([f32; 65536]); //~ ERROR SIMD vector cannot have more than 32768 elements
+
+#[repr(simd)]
+struct JustRight([u128; 32768]);
 
 #[repr(simd)]
 struct RGBA {
@@ -13,4 +37,4 @@ struct RGBA {
     a: f32
 }
 
-pub fn main() {}
+fn main() {}
diff --git a/src/test/ui/simd/simd-type.stderr b/src/test/ui/simd/simd-type.stderr
new file mode 100644
index 00000000000..8b15ef05e03
--- /dev/null
+++ b/src/test/ui/simd/simd-type.stderr
@@ -0,0 +1,46 @@
+error[E0075]: SIMD vector cannot be empty
+  --> $DIR/simd-type.rs:7:1
+   |
+LL | struct empty;
+   | ^^^^^^^^^^^^^
+
+error[E0075]: SIMD vector cannot be empty
+  --> $DIR/simd-type.rs:10:1
+   |
+LL | struct empty2([f32; 0]);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^
+
+error[E0075]: SIMD vector length must be a power of two
+  --> $DIR/simd-type.rs:13:1
+   |
+LL | struct pow2([f32; 7]);
+   | ^^^^^^^^^^^^^^^^^^^^^^
+
+error[E0076]: SIMD vector should be homogeneous
+  --> $DIR/simd-type.rs:16:1
+   |
+LL | struct i64f64(i64, f64);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^ SIMD elements must have the same type
+
+error[E0077]: SIMD vector element type should be a primitive scalar (integer/float/pointer) type
+  --> $DIR/simd-type.rs:21:1
+   |
+LL | struct FooV(Foo, Foo);
+   | ^^^^^^^^^^^^^^^^^^^^^^
+
+error[E0077]: SIMD vector element type should be a primitive scalar (integer/float/pointer) type
+  --> $DIR/simd-type.rs:24:1
+   |
+LL | struct FooV2([Foo; 2]);
+   | ^^^^^^^^^^^^^^^^^^^^^^^
+
+error[E0075]: SIMD vector cannot have more than 32768 elements
+  --> $DIR/simd-type.rs:27:1
+   |
+LL | struct TooBig([f32; 65536]);
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 7 previous errors
+
+Some errors have detailed explanations: E0075, E0076, E0077.
+For more information about an error, try `rustc --explain E0075`.