about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOli Scherer <github333195615777966@oli-obk.de>2024-12-09 09:51:55 +0000
committerOli Scherer <github333195615777966@oli-obk.de>2024-12-11 16:41:27 +0000
commitc04b52ae9ecc04ac53522ad6694d1119df727a4e (patch)
treee2ca8e4644856922b8460d07ce72668d12406c75
parent5a6036a1802262f8cf02192b02026688d396f1d7 (diff)
downloadrust-c04b52ae9ecc04ac53522ad6694d1119df727a4e.tar.gz
rust-c04b52ae9ecc04ac53522ad6694d1119df727a4e.zip
Add regression tests
-rw-r--r--tests/ui/asm/generic_const_simd_vec_len.rs20
-rw-r--r--tests/ui/asm/generic_const_simd_vec_len.stderr10
-rw-r--r--tests/ui/asm/named_const_simd_vec_len.rs22
-rw-r--r--tests/ui/asm/named_const_simd_vec_len.stderr10
4 files changed, 62 insertions, 0 deletions
diff --git a/tests/ui/asm/generic_const_simd_vec_len.rs b/tests/ui/asm/generic_const_simd_vec_len.rs
new file mode 100644
index 00000000000..d3b60abf05a
--- /dev/null
+++ b/tests/ui/asm/generic_const_simd_vec_len.rs
@@ -0,0 +1,20 @@
+//! This is a regression test to ensure that we emit a diagnostic pointing to the
+//! reason the type was rejected in inline assembly.
+
+//@ only-x86_64
+
+#![feature(repr_simd)]
+
+#[repr(simd)]
+#[derive(Copy, Clone)]
+pub struct Foo<const C: usize>([u8; C]);
+
+pub unsafe fn foo<const C: usize>(a: Foo<C>) {
+    std::arch::asm!(
+        "movaps {src}, {src}",
+        src = in(xmm_reg) a,
+        //~^ ERROR: cannot use value of type `Foo<C>` for inline assembly
+    );
+}
+
+fn main() {}
diff --git a/tests/ui/asm/generic_const_simd_vec_len.stderr b/tests/ui/asm/generic_const_simd_vec_len.stderr
new file mode 100644
index 00000000000..7e7a3c9401c
--- /dev/null
+++ b/tests/ui/asm/generic_const_simd_vec_len.stderr
@@ -0,0 +1,10 @@
+error: cannot use value of type `Foo<C>` for inline assembly
+  --> $DIR/generic_const_simd_vec_len.rs:15:27
+   |
+LL |         src = in(xmm_reg) a,
+   |                           ^
+   |
+   = note: only integers, floats, SIMD vectors, pointers and function pointers can be used as arguments for inline assembly
+
+error: aborting due to 1 previous error
+
diff --git a/tests/ui/asm/named_const_simd_vec_len.rs b/tests/ui/asm/named_const_simd_vec_len.rs
new file mode 100644
index 00000000000..8f2159077fc
--- /dev/null
+++ b/tests/ui/asm/named_const_simd_vec_len.rs
@@ -0,0 +1,22 @@
+//! This is a regression test to ensure that we evaluate
+//! SIMD vector length constants instead of assuming they are literals.
+
+//@ only-x86_64
+
+#![feature(repr_simd)]
+
+const C: usize = 16;
+
+#[repr(simd)]
+#[derive(Copy, Clone)]
+pub struct Foo([u8; C]);
+
+pub unsafe fn foo(a: Foo) {
+    std::arch::asm!(
+        "movaps {src}, {src}",
+        src = in(xmm_reg) a,
+        //~^ ERROR: cannot use value of type `Foo` for inline assembly
+    );
+}
+
+fn main() {}
diff --git a/tests/ui/asm/named_const_simd_vec_len.stderr b/tests/ui/asm/named_const_simd_vec_len.stderr
new file mode 100644
index 00000000000..184cc2b05e2
--- /dev/null
+++ b/tests/ui/asm/named_const_simd_vec_len.stderr
@@ -0,0 +1,10 @@
+error: cannot use value of type `Foo` for inline assembly
+  --> $DIR/named_const_simd_vec_len.rs:17:27
+   |
+LL |         src = in(xmm_reg) a,
+   |                           ^
+   |
+   = note: only integers, floats, SIMD vectors, pointers and function pointers can be used as arguments for inline assembly
+
+error: aborting due to 1 previous error
+