diff options
| author | Dylan DPC <99973273+Dylan-DPC@users.noreply.github.com> | 2022-09-17 15:31:07 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-09-17 15:31:07 +0530 |
| commit | cbd561d41f61201decae3adb45fe827d30aa96ec (patch) | |
| tree | 61f8f4dce1a826fd0cb071559ab21f7fa925c8b8 /src | |
| parent | 3ad81e0dd854d0edaeea7429fba6c2255c6a27ef (diff) | |
| parent | 3f2ce0624dfed866f758521b225e26c00b3250d8 (diff) | |
| download | rust-cbd561d41f61201decae3adb45fe827d30aa96ec.tar.gz rust-cbd561d41f61201decae3adb45fe827d30aa96ec.zip | |
Rollup merge of #98441 - calebzulawski:simd_as, r=oli-obk
Implement simd_as for pointers Expands `simd_as` (and `simd_cast`) to handle pointer-to-pointer, pointer-to-integer, and integer-to-pointer conversions. cc ``@programmerjake`` ``@thomcc``
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/ui/simd/intrinsic/ptr-cast.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/test/ui/simd/intrinsic/ptr-cast.rs b/src/test/ui/simd/intrinsic/ptr-cast.rs new file mode 100644 index 00000000000..1d13720bcd3 --- /dev/null +++ b/src/test/ui/simd/intrinsic/ptr-cast.rs @@ -0,0 +1,33 @@ +// run-pass + +#![feature(repr_simd, platform_intrinsics)] + +extern "platform-intrinsic" { + fn simd_cast_ptr<T, U>(x: T) -> U; + fn simd_expose_addr<T, U>(x: T) -> U; + fn simd_from_exposed_addr<T, U>(x: T) -> U; +} + +#[derive(Copy, Clone)] +#[repr(simd)] +struct V<T>([T; 2]); + +fn main() { + unsafe { + let mut foo = 4i8; + let ptr = &mut foo as *mut i8; + + let ptrs = V::<*mut i8>([ptr, core::ptr::null_mut()]); + + // change constness and type + let const_ptrs: V<*const u8> = simd_cast_ptr(ptrs); + + let exposed_addr: V<usize> = simd_expose_addr(const_ptrs); + + let from_exposed_addr: V<*mut i8> = simd_from_exposed_addr(exposed_addr); + + assert!(const_ptrs.0 == [ptr as *const u8, core::ptr::null()]); + assert!(exposed_addr.0 == [ptr as usize, 0]); + assert!(from_exposed_addr.0 == ptrs.0); + } +} |
