diff options
| author | Yuki Okushi <jtitor@2k36.org> | 2021-08-03 19:07:50 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-03 19:07:50 +0900 |
| commit | 331e78d80422ca779c71b19d9273f5d8ee737643 (patch) | |
| tree | cebf0efa3a5047f95e60466e0aa6568f84fb591f /src | |
| parent | b70c9dd77cc80088ad0316eb82537c2e4d918b90 (diff) | |
| parent | b23de51dcbd8f50094a716c0d99b44fdfa68e474 (diff) | |
| download | rust-331e78d80422ca779c71b19d9273f5d8ee737643.tar.gz rust-331e78d80422ca779c71b19d9273f5d8ee737643.zip | |
Rollup merge of #87716 - calebzulawski:master, r=workingjubilee
Allow generic SIMD array element type Fixes the following: ```rust #[repr(simd)] struct V<T>([T; 4]); ``` cc ``@workingjubilee``
Diffstat (limited to 'src')
3 files changed, 61 insertions, 15 deletions
diff --git a/src/test/ui/simd/simd-generics.rs b/src/test/ui/simd/simd-generics.rs index 50a4bfd9f51..fa9d35ee4df 100644 --- a/src/test/ui/simd/simd-generics.rs +++ b/src/test/ui/simd/simd-generics.rs @@ -10,7 +10,15 @@ struct f32x4(f32, f32, f32, f32); #[repr(simd)] #[derive(Copy, Clone)] -struct S<const N: usize>([f32; N]); +struct A<const N: usize>([f32; N]); + +#[repr(simd)] +#[derive(Copy, Clone)] +struct B<T>([T; 4]); + +#[repr(simd)] +#[derive(Copy, Clone)] +struct C<T, const N: usize>([T; N]); extern "platform-intrinsic" { @@ -29,7 +37,23 @@ impl ops::Add for f32x4 { } } -impl ops::Add for S<4> { +impl ops::Add for A<4> { + type Output = Self; + + fn add(self, rhs: Self) -> Self { + unsafe { simd_add(self, rhs) } + } +} + +impl ops::Add for B<f32> { + type Output = Self; + + fn add(self, rhs: Self) -> Self { + unsafe { simd_add(self, rhs) } + } +} + +impl ops::Add for C<f32, 4> { type Output = Self; fn add(self, rhs: Self) -> Self { @@ -39,19 +63,23 @@ impl ops::Add for S<4> { pub fn main() { - let lr = f32x4(1.0f32, 2.0f32, 3.0f32, 4.0f32); + let x = [1.0f32, 2.0f32, 3.0f32, 4.0f32]; + let y = [2.0f32, 4.0f32, 6.0f32, 8.0f32]; // lame-o - let f32x4(x, y, z, w) = add(lr, lr); - assert_eq!(x, 2.0f32); - assert_eq!(y, 4.0f32); - assert_eq!(z, 6.0f32); - assert_eq!(w, 8.0f32); - - let lr2 = S::<4>([1.0f32, 2.0f32, 3.0f32, 4.0f32]); - let [x, y, z, w] = add(lr2, lr2).0; - assert_eq!(x, 2.0f32); - assert_eq!(y, 4.0f32); - assert_eq!(z, 6.0f32); - assert_eq!(w, 8.0f32); + let a = f32x4(1.0f32, 2.0f32, 3.0f32, 4.0f32); + let f32x4(a0, a1, a2, a3) = add(a, a); + assert_eq!(a0, 2.0f32); + assert_eq!(a1, 4.0f32); + assert_eq!(a2, 6.0f32); + assert_eq!(a3, 8.0f32); + + let a = A(x); + assert_eq!(add(a, a).0, y); + + let b = B(x); + assert_eq!(add(b, b).0, y); + + let c = C(x); + assert_eq!(add(c, c).0, y); } diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-non-primitive.rs b/src/test/ui/simd/simd-type-generic-monomorphisation-non-primitive.rs new file mode 100644 index 00000000000..0bc73b15580 --- /dev/null +++ b/src/test/ui/simd/simd-type-generic-monomorphisation-non-primitive.rs @@ -0,0 +1,14 @@ +// build-fail + +#![feature(repr_simd)] + +struct E; + +// error-pattern:monomorphising SIMD type `S<E>` with a non-primitive-scalar (integer/float/pointer) element type `E` + +#[repr(simd)] +struct S<T>([T; 4]); + +fn main() { + let _v: Option<S<E>> = None; +} diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-non-primitive.stderr b/src/test/ui/simd/simd-type-generic-monomorphisation-non-primitive.stderr new file mode 100644 index 00000000000..9e8f06b824c --- /dev/null +++ b/src/test/ui/simd/simd-type-generic-monomorphisation-non-primitive.stderr @@ -0,0 +1,4 @@ +error: monomorphising SIMD type `S<E>` with a non-primitive-scalar (integer/float/pointer) element type `E` + +error: aborting due to previous error + |
