summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-02-07 22:25:14 +0000
committerbors <bors@rust-lang.org>2021-02-07 22:25:14 +0000
commitbb587b1a1737738658d2eaecd4c8c1cab555257a (patch)
treedd6c0c0f7509d6c9d75e817485adb61ecf720c59 /src/test
parent9778068cbc1e06cc3685422323ff38a2f397de26 (diff)
parenta4bab7c6fab5a44f989321c1abf4cfc72ebb1d28 (diff)
downloadrust-bb587b1a1737738658d2eaecd4c8c1cab555257a.tar.gz
rust-bb587b1a1737738658d2eaecd4c8c1cab555257a.zip
Auto merge of #80652 - calebzulawski:simd-lanes, r=nagisa
Improve SIMD type element count validation

Resolves rust-lang/stdsimd#53.

These changes are motivated by `stdsimd` moving in the direction of const generic vectors, e.g.:
```rust
#[repr(simd)]
struct SimdF32<const N: usize>([f32; N]);
```

This makes a few changes:
* Establishes a maximum SIMD lane count of 2^16 (65536).  This value is arbitrary, but attempts to validate lane count before hitting potential errors in the backend.  It's not clear what LLVM's maximum lane count is, but cranelift's appears to be much less than `usize::MAX`, at least.
* Expands some SIMD intrinsics to support arbitrary lane counts.  This resolves the ICE in the linked issue.
* Attempts to catch invalid-sized vectors during typeck when possible.

Unresolved questions:
* Generic-length vectors can't be validated in typeck and are only validated after monomorphization while computing layout.  This "works", but the errors simply bail out with no context beyond the name of the type.  Should these errors instead return `LayoutError` or otherwise provide context in some way?  As it stands, users of `stdsimd` could trivially produce monomorphization errors by making zero-length vectors.

cc `@bjorn3`
Diffstat (limited to 'src/test')
-rw-r--r--src/test/ui/consts/const-eval/simd/insert_extract.rs10
-rw-r--r--src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.rs19
-rw-r--r--src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.stderr48
-rw-r--r--src/test/ui/simd-type.rs20
-rw-r--r--src/test/ui/simd/issue-17170.rs (renamed from src/test/ui/issues/issue-17170.rs)2
-rw-r--r--src/test/ui/simd/issue-17170.stderr11
-rw-r--r--src/test/ui/simd/issue-39720.rs (renamed from src/test/ui/issues/issue-39720.rs)3
-rw-r--r--src/test/ui/simd/issue-39720.stderr15
-rw-r--r--src/test/ui/simd/simd-intrinsic-generic-elements.rs24
-rw-r--r--src/test/ui/simd/simd-size-align.rs103
-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.rs (renamed from src/test/ui/simd-type-generic-monomorphisation.rs)0
-rw-r--r--src/test/ui/simd/simd-type-generic-monomorphisation.stderr (renamed from src/test/ui/simd-type-generic-monomorphisation.stderr)0
-rw-r--r--src/test/ui/simd/simd-type.rs34
-rw-r--r--src/test/ui/simd/simd-type.stderr (renamed from src/test/ui/simd-type.stderr)26
20 files changed, 182 insertions, 181 deletions
diff --git a/src/test/ui/consts/const-eval/simd/insert_extract.rs b/src/test/ui/consts/const-eval/simd/insert_extract.rs
index 92231d4ced3..9e5cb0d4eb1 100644
--- a/src/test/ui/consts/const-eval/simd/insert_extract.rs
+++ b/src/test/ui/consts/const-eval/simd/insert_extract.rs
@@ -8,7 +8,7 @@
 
 #[repr(simd)] struct i8x1(i8);
 #[repr(simd)] struct u16x2(u16, u16);
-#[repr(simd)] struct f32x3(f32, f32, f32);
+#[repr(simd)] struct f32x4(f32, f32, f32, f32);
 
 extern "platform-intrinsic" {
     #[rustc_const_stable(feature = "foo", since = "1.3.37")]
@@ -39,19 +39,23 @@ fn main() {
         assert_eq!(Y1, 42);
     }
     {
-        const U: f32x3 = f32x3(13., 14., 15.);
-        const V: f32x3 = unsafe { simd_insert(U, 1_u32, 42_f32) };
+        const U: f32x4 = f32x4(13., 14., 15., 16.);
+        const V: f32x4 = unsafe { simd_insert(U, 1_u32, 42_f32) };
         const X0: f32 = V.0;
         const X1: f32 = V.1;
         const X2: f32 = V.2;
+        const X3: f32 = V.3;
         const Y0: f32 = unsafe { simd_extract(V, 0) };
         const Y1: f32 = unsafe { simd_extract(V, 1) };
         const Y2: f32 = unsafe { simd_extract(V, 2) };
+        const Y3: f32 = unsafe { simd_extract(V, 3) };
         assert_eq!(X0, 13.);
         assert_eq!(X1, 42.);
         assert_eq!(X2, 15.);
+        assert_eq!(X3, 16.);
         assert_eq!(Y0, 13.);
         assert_eq!(Y1, 42.);
         assert_eq!(Y2, 15.);
+        assert_eq!(Y3, 16.);
     }
 }
diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.rs
index 5929d05f4de..493cd7a477c 100644
--- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.rs
+++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.rs
@@ -9,10 +9,6 @@ struct i32x2(i32, i32);
 #[repr(simd)]
 #[derive(Copy, Clone)]
 #[allow(non_camel_case_types)]
-struct i32x3(i32, i32, i32);
-#[repr(simd)]
-#[derive(Copy, Clone)]
-#[allow(non_camel_case_types)]
 struct i32x4(i32, i32, i32, i32);
 #[repr(simd)]
 #[derive(Copy, Clone)]
@@ -27,10 +23,6 @@ struct f32x2(f32, f32);
 #[repr(simd)]
 #[derive(Copy, Clone)]
 #[allow(non_camel_case_types)]
-struct f32x3(f32, f32, f32);
-#[repr(simd)]
-#[derive(Copy, Clone)]
-#[allow(non_camel_case_types)]
 struct f32x4(f32, f32, f32, f32);
 #[repr(simd)]
 #[derive(Copy, Clone)]
@@ -43,7 +35,6 @@ extern "platform-intrinsic" {
     fn simd_extract<T, E>(x: T, idx: u32) -> E;
 
     fn simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U;
-    fn simd_shuffle3<T, U>(x: T, y: T, idx: [u32; 3]) -> U;
     fn simd_shuffle4<T, U>(x: T, y: T, idx: [u32; 4]) -> U;
     fn simd_shuffle8<T, U>(x: T, y: T, idx: [u32; 8]) -> U;
 }
@@ -61,8 +52,6 @@ fn main() {
 
         simd_shuffle2::<i32, i32>(0, 0, [0; 2]);
         //~^ ERROR expected SIMD input type, found non-SIMD `i32`
-        simd_shuffle3::<i32, i32>(0, 0, [0; 3]);
-        //~^ ERROR expected SIMD input type, found non-SIMD `i32`
         simd_shuffle4::<i32, i32>(0, 0, [0; 4]);
         //~^ ERROR expected SIMD input type, found non-SIMD `i32`
         simd_shuffle8::<i32, i32>(0, 0, [0; 8]);
@@ -70,8 +59,6 @@ fn main() {
 
         simd_shuffle2::<_, f32x2>(x, x, [0; 2]);
 //~^ ERROR element type `i32` (element of input `i32x4`), found `f32x2` with element type `f32`
-        simd_shuffle3::<_, f32x3>(x, x, [0; 3]);
-//~^ ERROR element type `i32` (element of input `i32x4`), found `f32x3` with element type `f32`
         simd_shuffle4::<_, f32x4>(x, x, [0; 4]);
 //~^ ERROR element type `i32` (element of input `i32x4`), found `f32x4` with element type `f32`
         simd_shuffle8::<_, f32x8>(x, x, [0; 8]);
@@ -79,10 +66,8 @@ fn main() {
 
         simd_shuffle2::<_, i32x8>(x, x, [0; 2]);
         //~^ ERROR expected return type of length 2, found `i32x8` with length 8
-        simd_shuffle3::<_, i32x4>(x, x, [0; 3]);
-        //~^ ERROR expected return type of length 3, found `i32x4` with length 4
-        simd_shuffle4::<_, i32x3>(x, x, [0; 4]);
-        //~^ ERROR expected return type of length 4, found `i32x3` with length 3
+        simd_shuffle4::<_, i32x8>(x, x, [0; 4]);
+        //~^ ERROR expected return type of length 4, found `i32x8` with length 8
         simd_shuffle8::<_, i32x2>(x, x, [0; 8]);
         //~^ ERROR expected return type of length 8, found `i32x2` with length 2
     }
diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.stderr b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.stderr
index 78022c0c8bd..703e64d1ddc 100644
--- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.stderr
+++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.stderr
@@ -1,93 +1,75 @@
 error[E0511]: invalid monomorphization of `simd_insert` intrinsic: expected SIMD input type, found non-SIMD `i32`
-  --> $DIR/simd-intrinsic-generic-elements.rs:55:9
+  --> $DIR/simd-intrinsic-generic-elements.rs:46:9
    |
 LL |         simd_insert(0, 0, 0);
    |         ^^^^^^^^^^^^^^^^^^^^
 
 error[E0511]: invalid monomorphization of `simd_insert` intrinsic: expected inserted type `i32` (element of input `i32x4`), found `f64`
-  --> $DIR/simd-intrinsic-generic-elements.rs:57:9
+  --> $DIR/simd-intrinsic-generic-elements.rs:48:9
    |
 LL |         simd_insert(x, 0, 1.0);
    |         ^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0511]: invalid monomorphization of `simd_extract` intrinsic: expected return type `i32` (element of input `i32x4`), found `f32`
-  --> $DIR/simd-intrinsic-generic-elements.rs:59:9
+  --> $DIR/simd-intrinsic-generic-elements.rs:50:9
    |
 LL |         simd_extract::<_, f32>(x, 0);
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0511]: invalid monomorphization of `simd_shuffle2` intrinsic: expected SIMD input type, found non-SIMD `i32`
-  --> $DIR/simd-intrinsic-generic-elements.rs:62:9
+  --> $DIR/simd-intrinsic-generic-elements.rs:53:9
    |
 LL |         simd_shuffle2::<i32, i32>(0, 0, [0; 2]);
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error[E0511]: invalid monomorphization of `simd_shuffle3` intrinsic: expected SIMD input type, found non-SIMD `i32`
-  --> $DIR/simd-intrinsic-generic-elements.rs:64:9
-   |
-LL |         simd_shuffle3::<i32, i32>(0, 0, [0; 3]);
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
 error[E0511]: invalid monomorphization of `simd_shuffle4` intrinsic: expected SIMD input type, found non-SIMD `i32`
-  --> $DIR/simd-intrinsic-generic-elements.rs:66:9
+  --> $DIR/simd-intrinsic-generic-elements.rs:55:9
    |
 LL |         simd_shuffle4::<i32, i32>(0, 0, [0; 4]);
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0511]: invalid monomorphization of `simd_shuffle8` intrinsic: expected SIMD input type, found non-SIMD `i32`
-  --> $DIR/simd-intrinsic-generic-elements.rs:68:9
+  --> $DIR/simd-intrinsic-generic-elements.rs:57:9
    |
 LL |         simd_shuffle8::<i32, i32>(0, 0, [0; 8]);
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0511]: invalid monomorphization of `simd_shuffle2` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x2` with element type `f32`
-  --> $DIR/simd-intrinsic-generic-elements.rs:71:9
+  --> $DIR/simd-intrinsic-generic-elements.rs:60:9
    |
 LL |         simd_shuffle2::<_, f32x2>(x, x, [0; 2]);
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error[E0511]: invalid monomorphization of `simd_shuffle3` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x3` with element type `f32`
-  --> $DIR/simd-intrinsic-generic-elements.rs:73:9
-   |
-LL |         simd_shuffle3::<_, f32x3>(x, x, [0; 3]);
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
 error[E0511]: invalid monomorphization of `simd_shuffle4` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x4` with element type `f32`
-  --> $DIR/simd-intrinsic-generic-elements.rs:75:9
+  --> $DIR/simd-intrinsic-generic-elements.rs:62:9
    |
 LL |         simd_shuffle4::<_, f32x4>(x, x, [0; 4]);
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0511]: invalid monomorphization of `simd_shuffle8` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x8` with element type `f32`
-  --> $DIR/simd-intrinsic-generic-elements.rs:77:9
+  --> $DIR/simd-intrinsic-generic-elements.rs:64:9
    |
 LL |         simd_shuffle8::<_, f32x8>(x, x, [0; 8]);
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0511]: invalid monomorphization of `simd_shuffle2` intrinsic: expected return type of length 2, found `i32x8` with length 8
-  --> $DIR/simd-intrinsic-generic-elements.rs:80:9
+  --> $DIR/simd-intrinsic-generic-elements.rs:67:9
    |
 LL |         simd_shuffle2::<_, i32x8>(x, x, [0; 2]);
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error[E0511]: invalid monomorphization of `simd_shuffle3` intrinsic: expected return type of length 3, found `i32x4` with length 4
-  --> $DIR/simd-intrinsic-generic-elements.rs:82:9
+error[E0511]: invalid monomorphization of `simd_shuffle4` intrinsic: expected return type of length 4, found `i32x8` with length 8
+  --> $DIR/simd-intrinsic-generic-elements.rs:69:9
    |
-LL |         simd_shuffle3::<_, i32x4>(x, x, [0; 3]);
-   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error[E0511]: invalid monomorphization of `simd_shuffle4` intrinsic: expected return type of length 4, found `i32x3` with length 3
-  --> $DIR/simd-intrinsic-generic-elements.rs:84:9
-   |
-LL |         simd_shuffle4::<_, i32x3>(x, x, [0; 4]);
+LL |         simd_shuffle4::<_, i32x8>(x, x, [0; 4]);
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0511]: invalid monomorphization of `simd_shuffle8` intrinsic: expected return type of length 8, found `i32x2` with length 2
-  --> $DIR/simd-intrinsic-generic-elements.rs:86:9
+  --> $DIR/simd-intrinsic-generic-elements.rs:71:9
    |
 LL |         simd_shuffle8::<_, i32x2>(x, x, [0; 8]);
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error: aborting due to 15 previous errors
+error: aborting due to 12 previous errors
 
 For more information about this error, try `rustc --explain E0511`.
diff --git a/src/test/ui/simd-type.rs b/src/test/ui/simd-type.rs
deleted file mode 100644
index a320df85138..00000000000
--- a/src/test/ui/simd-type.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-#![feature(repr_simd)]
-#![allow(non_camel_case_types)]
-
-// ignore-tidy-linelength
-
-#[repr(simd)]
-struct empty; //~ ERROR SIMD vector cannot be empty
-
-#[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
-
-fn main() {}
diff --git a/src/test/ui/issues/issue-17170.rs b/src/test/ui/simd/issue-17170.rs
index 8d70dacdc90..49cfbab9a3e 100644
--- a/src/test/ui/issues/issue-17170.rs
+++ b/src/test/ui/simd/issue-17170.rs
@@ -1,8 +1,8 @@
-// run-pass
 #![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);
 
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/issues/issue-39720.rs b/src/test/ui/simd/issue-39720.rs
index 8cf841f9371..7d596926512 100644
--- a/src/test/ui/issues/issue-39720.rs
+++ b/src/test/ui/simd/issue-39720.rs
@@ -1,4 +1,3 @@
-// run-pass
 // ignore-emscripten FIXME(#45351)
 
 #![feature(repr_simd, platform_intrinsics)]
@@ -6,10 +5,12 @@
 #[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;
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-intrinsic-generic-elements.rs b/src/test/ui/simd/simd-intrinsic-generic-elements.rs
index ea3d4b18944..a85ec7c5823 100644
--- a/src/test/ui/simd/simd-intrinsic-generic-elements.rs
+++ b/src/test/ui/simd/simd-intrinsic-generic-elements.rs
@@ -10,10 +10,6 @@ struct i32x2(i32, i32);
 #[repr(simd)]
 #[derive(Copy, Clone, Debug, PartialEq)]
 #[allow(non_camel_case_types)]
-struct i32x3(i32, i32, i32);
-#[repr(simd)]
-#[derive(Copy, Clone, Debug, PartialEq)]
-#[allow(non_camel_case_types)]
 struct i32x4(i32, i32, i32, i32);
 #[repr(simd)]
 #[derive(Copy, Clone, Debug, PartialEq)]
@@ -26,7 +22,6 @@ extern "platform-intrinsic" {
     fn simd_extract<T, E>(x: T, idx: u32) -> E;
 
     fn simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U;
-    fn simd_shuffle3<T, U>(x: T, y: T, idx: [u32; 3]) -> U;
     fn simd_shuffle4<T, U>(x: T, y: T, idx: [u32; 4]) -> U;
     fn simd_shuffle8<T, U>(x: T, y: T, idx: [u32; 8]) -> U;
 }
@@ -45,17 +40,12 @@ macro_rules! all_eq {
 
 fn main() {
     let x2 = i32x2(20, 21);
-    let x3 = i32x3(30, 31, 32);
     let x4 = i32x4(40, 41, 42, 43);
     let x8 = i32x8(80, 81, 82, 83, 84, 85, 86, 87);
     unsafe {
         all_eq!(simd_insert(x2, 0, 100), i32x2(100, 21));
         all_eq!(simd_insert(x2, 1, 100), i32x2(20, 100));
 
-        all_eq!(simd_insert(x3, 0, 100), i32x3(100, 31, 32));
-        all_eq!(simd_insert(x3, 1, 100), i32x3(30, 100, 32));
-        all_eq!(simd_insert(x3, 2, 100), i32x3(30, 31, 100));
-
         all_eq!(simd_insert(x4, 0, 100), i32x4(100, 41, 42, 43));
         all_eq!(simd_insert(x4, 1, 100), i32x4(40, 100, 42, 43));
         all_eq!(simd_insert(x4, 2, 100), i32x4(40, 41, 100, 43));
@@ -73,10 +63,6 @@ fn main() {
         all_eq!(simd_extract(x2, 0), 20);
         all_eq!(simd_extract(x2, 1), 21);
 
-        all_eq!(simd_extract(x3, 0), 30);
-        all_eq!(simd_extract(x3, 1), 31);
-        all_eq!(simd_extract(x3, 2), 32);
-
         all_eq!(simd_extract(x4, 0), 40);
         all_eq!(simd_extract(x4, 1), 41);
         all_eq!(simd_extract(x4, 2), 42);
@@ -93,30 +79,20 @@ fn main() {
     }
 
     let y2 = i32x2(120, 121);
-    let y3 = i32x3(130, 131, 132);
     let y4 = i32x4(140, 141, 142, 143);
     let y8 = i32x8(180, 181, 182, 183, 184, 185, 186, 187);
     unsafe {
         all_eq!(simd_shuffle2(x2, y2, [3, 0]), i32x2(121, 20));
-        all_eq!(simd_shuffle3(x2, y2, [3, 0, 1]), i32x3(121, 20, 21));
         all_eq!(simd_shuffle4(x2, y2, [3, 0, 1, 2]), i32x4(121, 20, 21, 120));
         all_eq!(simd_shuffle8(x2, y2, [3, 0, 1, 2, 1, 2, 3, 0]),
                 i32x8(121, 20, 21, 120, 21, 120, 121, 20));
 
-        all_eq!(simd_shuffle2(x3, y3, [4, 2]), i32x2(131, 32));
-        all_eq!(simd_shuffle3(x3, y3, [4, 2, 3]), i32x3(131, 32, 130));
-        all_eq!(simd_shuffle4(x3, y3, [4, 2, 3, 0]), i32x4(131, 32, 130, 30));
-        all_eq!(simd_shuffle8(x3, y3, [4, 2, 3, 0, 1, 5, 5, 1]),
-                i32x8(131, 32, 130, 30, 31, 132, 132, 31));
-
         all_eq!(simd_shuffle2(x4, y4, [7, 2]), i32x2(143, 42));
-        all_eq!(simd_shuffle3(x4, y4, [7, 2, 5]), i32x3(143, 42, 141));
         all_eq!(simd_shuffle4(x4, y4, [7, 2, 5, 0]), i32x4(143, 42, 141, 40));
         all_eq!(simd_shuffle8(x4, y4, [7, 2, 5, 0, 3, 6, 4, 1]),
                 i32x8(143, 42, 141, 40, 43, 142, 140, 41));
 
         all_eq!(simd_shuffle2(x8, y8, [11, 5]), i32x2(183, 85));
-        all_eq!(simd_shuffle3(x8, y8, [11, 5, 15]), i32x3(183, 85, 187));
         all_eq!(simd_shuffle4(x8, y8, [11, 5, 15, 0]), i32x4(183, 85, 187, 80));
         all_eq!(simd_shuffle8(x8, y8, [11, 5, 15, 0, 3, 8, 12, 1]),
                 i32x8(183, 85, 187, 80, 83, 180, 184, 81));
diff --git a/src/test/ui/simd/simd-size-align.rs b/src/test/ui/simd/simd-size-align.rs
index 556013788c3..0afa4947225 100644
--- a/src/test/ui/simd/simd-size-align.rs
+++ b/src/test/ui/simd/simd-size-align.rs
@@ -10,87 +10,44 @@ 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);
+    assert_eq!(mem::size_of::<T>() % mem::min_align_of::<T>(), 0);
 }
 
-fn main() {
-    check::<u8x2>();
-    check::<u8x3>();
-    check::<u8x4>();
-    check::<u8x5>();
-    check::<u8x6>();
-    check::<u8x7>();
-    check::<u8x8>();
+#[repr(simd)]
+struct U8<const N: usize>([u8; N]);
 
-    check::<i16x2>();
-    check::<i16x3>();
-    check::<i16x4>();
-    check::<i16x5>();
-    check::<i16x6>();
-    check::<i16x7>();
-    check::<i16x8>();
+#[repr(simd)]
+struct I16<const N: usize>([i16; N]);
 
-    check::<f32x2>();
-    check::<f32x3>();
-    check::<f32x4>();
-    check::<f32x5>();
-    check::<f32x6>();
-    check::<f32x7>();
-    check::<f32x8>();
+#[repr(simd)]
+struct F32<const N: usize>([f32; N]);
 
-    check::<usizex2>();
-    check::<usizex3>();
-    check::<usizex4>();
-    check::<usizex5>();
-    check::<usizex6>();
-    check::<usizex7>();
-    check::<usizex8>();
+#[repr(simd)]
+struct Usize<const N: usize>([usize; N]);
 
-    check::<isizex2>();
-    check::<isizex3>();
-    check::<isizex4>();
-    check::<isizex5>();
-    check::<isizex6>();
-    check::<isizex7>();
-    check::<isizex8>();
-}
+#[repr(simd)]
+struct Isize<const N: usize>([isize; N]);
 
-#[repr(simd)] struct u8x2(u8, u8);
-#[repr(simd)] struct u8x3(u8, u8, u8);
-#[repr(simd)] struct u8x4(u8, u8, u8, u8);
-#[repr(simd)] struct u8x5(u8, u8, u8, u8, u8);
-#[repr(simd)] struct u8x6(u8, u8, u8, u8, u8, u8);
-#[repr(simd)] struct u8x7(u8, u8, u8, u8, u8, u8, u8);
-#[repr(simd)] struct u8x8(u8, u8, u8, u8, u8, u8, u8, u8);
+fn main() {
+    check::<U8<2>>();
+    check::<U8<4>>();
+    check::<U8<8>>();
 
-#[repr(simd)] struct i16x2(i16, i16);
-#[repr(simd)] struct i16x3(i16, i16, i16);
-#[repr(simd)] struct i16x4(i16, i16, i16, i16);
-#[repr(simd)] struct i16x5(i16, i16, i16, i16, i16);
-#[repr(simd)] struct i16x6(i16, i16, i16, i16, i16, i16);
-#[repr(simd)] struct i16x7(i16, i16, i16, i16, i16, i16, i16);
-#[repr(simd)] struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
+    check::<I16<2>>();
+    check::<I16<4>>();
+    check::<I16<8>>();
 
-#[repr(simd)] struct f32x2(f32, f32);
-#[repr(simd)] struct f32x3(f32, f32, f32);
-#[repr(simd)] struct f32x4(f32, f32, f32, f32);
-#[repr(simd)] struct f32x5(f32, f32, f32, f32, f32);
-#[repr(simd)] struct f32x6(f32, f32, f32, f32, f32, f32);
-#[repr(simd)] struct f32x7(f32, f32, f32, f32, f32, f32, f32);
-#[repr(simd)] struct f32x8(f32, f32, f32, f32, f32, f32, f32, f32);
+    check::<F32<2>>();
+    check::<F32<4>>();
+    check::<F32<8>>();
 
-#[repr(simd)] struct usizex2(usize, usize);
-#[repr(simd)] struct usizex3(usize, usize, usize);
-#[repr(simd)] struct usizex4(usize, usize, usize, usize);
-#[repr(simd)] struct usizex5(usize, usize, usize, usize, usize);
-#[repr(simd)] struct usizex6(usize, usize, usize, usize, usize, usize);
-#[repr(simd)] struct usizex7(usize, usize, usize, usize, usize, usize, usize);
-#[repr(simd)] struct usizex8(usize, usize, usize, usize, usize, usize, usize, usize);
+    check::<Usize<2>>();
+    check::<Usize<4>>();
+    check::<Usize<8>>();
 
-#[repr(simd)] struct isizex2(isize, isize);
-#[repr(simd)] struct isizex3(isize, isize, isize);
-#[repr(simd)] struct isizex4(isize, isize, isize, isize);
-#[repr(simd)] struct isizex5(isize, isize, isize, isize, isize);
-#[repr(simd)] struct isizex6(isize, isize, isize, isize, isize, isize);
-#[repr(simd)] struct isizex7(isize, isize, isize, isize, isize, isize, isize);
-#[repr(simd)] struct isizex8(isize, isize, isize, isize, isize, isize, isize, isize);
+    check::<Isize<2>>();
+    check::<Isize<4>>();
+    check::<Isize<8>>();
+}
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-type-generic-monomorphisation.rs b/src/test/ui/simd/simd-type-generic-monomorphisation.rs
index 0275f0ce4c1..0275f0ce4c1 100644
--- a/src/test/ui/simd-type-generic-monomorphisation.rs
+++ b/src/test/ui/simd/simd-type-generic-monomorphisation.rs
diff --git a/src/test/ui/simd-type-generic-monomorphisation.stderr b/src/test/ui/simd/simd-type-generic-monomorphisation.stderr
index 7f23893ac85..7f23893ac85 100644
--- a/src/test/ui/simd-type-generic-monomorphisation.stderr
+++ b/src/test/ui/simd/simd-type-generic-monomorphisation.stderr
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-type.stderr b/src/test/ui/simd/simd-type.stderr
index 23004c78591..8b15ef05e03 100644
--- a/src/test/ui/simd-type.stderr
+++ b/src/test/ui/simd/simd-type.stderr
@@ -4,25 +4,43 @@ error[E0075]: SIMD vector cannot be empty
 LL | struct empty;
    | ^^^^^^^^^^^^^
 
-error[E0076]: SIMD vector should be homogeneous
+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:15:1
+  --> $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:18:1
+  --> $DIR/simd-type.rs:24:1
    |
 LL | struct FooV2([Foo; 2]);
    | ^^^^^^^^^^^^^^^^^^^^^^^
 
-error: aborting due to 4 previous errors
+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`.