From d03683caf66082e0430db5d07e67e82c5b7d676f Mon Sep 17 00:00:00 2001 From: Jubilee Young Date: Tue, 1 Jun 2021 16:43:48 -0700 Subject: Allow raw pointers in SIMD types --- src/test/ui/simd/issue-85915-simd-ptrs.rs | 67 +++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/test/ui/simd/issue-85915-simd-ptrs.rs (limited to 'src') diff --git a/src/test/ui/simd/issue-85915-simd-ptrs.rs b/src/test/ui/simd/issue-85915-simd-ptrs.rs new file mode 100644 index 00000000000..6fe415545f8 --- /dev/null +++ b/src/test/ui/simd/issue-85915-simd-ptrs.rs @@ -0,0 +1,67 @@ +// run-pass +// ignore-emscripten + +// Short form of the generic gather/scatter tests, +// verifying simd([*const T; N]) and simd([*mut T; N]) pass typeck and work. +#![feature(repr_simd, platform_intrinsics)] +#![allow(non_camel_case_types)] + +#[repr(simd)] +#[derive(Copy, Clone, PartialEq, Debug)] +struct cptrx4([*const T; 4]); + +#[repr(simd)] +#[derive(Copy, Clone, PartialEq, Debug)] +struct mptrx4([*mut T; 4]); + +#[repr(simd)] +#[derive(Copy, Clone, PartialEq, Debug)] +struct f32x4([f32; 4]); + +#[repr(simd)] +#[derive(Copy, Clone, PartialEq, Debug)] +struct i32x4([i32; 4]); + +extern "platform-intrinsic" { + fn simd_gather(x: T, y: U, z: V) -> T; + fn simd_scatter(x: T, y: U, z: V) -> (); +} + +fn main() { + let mut x = [0_f32, 1., 2., 3., 4., 5., 6., 7.]; + + let default = f32x4([-3_f32, -3., -3., -3.]); + let s_strided = f32x4([0_f32, 2., -3., 6.]); + let mask = i32x4([-1_i32, -1, 0, -1]); + + // reading from *const + unsafe { + let pointer = &x as *const f32; + let pointers = cptrx4([ + pointer.offset(0) as *const f32, + pointer.offset(2), + pointer.offset(4), + pointer.offset(6) + ]); + + let r_strided = simd_gather(default, pointers, mask); + + assert_eq!(r_strided, s_strided); + } + + // writing to *mut + unsafe { + let pointer = &mut x as *mut f32; + let pointers = mptrx4([ + pointer.offset(0) as *mut f32, + pointer.offset(2), + pointer.offset(4), + pointer.offset(6) + ]); + + let values = f32x4([42_f32, 43_f32, 44_f32, 45_f32]); + simd_scatter(values, pointers, mask); + + assert_eq!(x, [42., 1., 43., 3., 4., 5., 45., 7.]); + } +} -- cgit 1.4.1-3-g733a5 From d9a5df669c45204daa5e10f5221ff82026fef9e6 Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Wed, 2 Jun 2021 15:47:15 -0700 Subject: test for more SIMD monomorphization errors build-fail test for simd type with an element type that's a wide pointer test for SIMD element type of optional nonnull ptr to extern type test that wide ptr simd element type of *mut [u8] fails --- ...-generic-monomorphisation-extern-nonnull-ptr.rs | 23 ++++++++++++++++++++++ .../simd-type-generic-monomorphisation-wide-ptr.rs | 12 +++++++++++ ...d-type-generic-monomorphisation-wide-ptr.stderr | 4 ++++ src/test/ui/simd/simd-type-wide-ptr.rs | 12 +++++++++++ src/test/ui/simd/simd-type-wide-ptr.stderr | 4 ++++ 5 files changed, 55 insertions(+) create mode 100644 src/test/ui/simd/simd-type-generic-monomorphisation-extern-nonnull-ptr.rs create mode 100644 src/test/ui/simd/simd-type-generic-monomorphisation-wide-ptr.rs create mode 100644 src/test/ui/simd/simd-type-generic-monomorphisation-wide-ptr.stderr create mode 100644 src/test/ui/simd/simd-type-wide-ptr.rs create mode 100644 src/test/ui/simd/simd-type-wide-ptr.stderr (limited to 'src') diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-extern-nonnull-ptr.rs b/src/test/ui/simd/simd-type-generic-monomorphisation-extern-nonnull-ptr.rs new file mode 100644 index 00000000000..ae321c974b9 --- /dev/null +++ b/src/test/ui/simd/simd-type-generic-monomorphisation-extern-nonnull-ptr.rs @@ -0,0 +1,23 @@ +// run-pass +// ignore-emscripten + +#![feature(extern_types)] +#![feature(repr_simd)] + +use std::ptr::NonNull; + +extern { + type Extern; +} + +#[repr(simd)] +struct S(T); + +#[inline(never)] +fn identity(v: T) -> T { + v +} + +fn main() { + let _v: S<[Option>; 4]> = identity(S([None; 4])); +} diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-wide-ptr.rs b/src/test/ui/simd/simd-type-generic-monomorphisation-wide-ptr.rs new file mode 100644 index 00000000000..3e02b08ce5d --- /dev/null +++ b/src/test/ui/simd/simd-type-generic-monomorphisation-wide-ptr.rs @@ -0,0 +1,12 @@ +// build-fail + +#![feature(repr_simd)] + +// error-pattern:monomorphising SIMD type `S<[*mut [u8]; 4]>` with a non-primitive-scalar (integer/float/pointer) element type `*mut [u8]` + +#[repr(simd)] +struct S(T); + +fn main() { + let _v: Option> = None; +} diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-wide-ptr.stderr b/src/test/ui/simd/simd-type-generic-monomorphisation-wide-ptr.stderr new file mode 100644 index 00000000000..3888e7a0f38 --- /dev/null +++ b/src/test/ui/simd/simd-type-generic-monomorphisation-wide-ptr.stderr @@ -0,0 +1,4 @@ +error: monomorphising SIMD type `S<[*mut [u8]; 4]>` with a non-primitive-scalar (integer/float/pointer) element type `*mut [u8]` + +error: aborting due to previous error + diff --git a/src/test/ui/simd/simd-type-wide-ptr.rs b/src/test/ui/simd/simd-type-wide-ptr.rs new file mode 100644 index 00000000000..88f62a07ea0 --- /dev/null +++ b/src/test/ui/simd/simd-type-wide-ptr.rs @@ -0,0 +1,12 @@ +// build-fail + +#![feature(repr_simd)] + +// error-pattern:monomorphising SIMD type `S` with a non-primitive-scalar (integer/float/pointer) element type `*mut [u8]` + +#[repr(simd)] +struct S([*mut [u8]; 4]); + +fn main() { + let _v: Option = None; +} diff --git a/src/test/ui/simd/simd-type-wide-ptr.stderr b/src/test/ui/simd/simd-type-wide-ptr.stderr new file mode 100644 index 00000000000..51d3c005072 --- /dev/null +++ b/src/test/ui/simd/simd-type-wide-ptr.stderr @@ -0,0 +1,4 @@ +error: monomorphising SIMD type `S` with a non-primitive-scalar (integer/float/pointer) element type `*mut [u8]` + +error: aborting due to previous error + -- cgit 1.4.1-3-g733a5