about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJubilee Young <workingjubilee@gmail.com>2025-06-26 18:03:00 -0700
committerJubilee Young <workingjubilee@gmail.com>2025-06-27 11:04:04 -0700
commit1045b70304ab6a875fc9fbf10cb7e7c010edd3ab (patch)
treefd6630ede9c3639893c229b484e580d52a4800e0
parent513999b936c37902120380f4171963d1f1d80347 (diff)
downloadrust-1045b70304ab6a875fc9fbf10cb7e7c010edd3ab.tar.gz
rust-1045b70304ab6a875fc9fbf10cb7e7c010edd3ab.zip
tests: add test for invalid interrupt signatures
-rw-r--r--tests/ui/abi/interrupt-invalid-signature.avr.stderr28
-rw-r--r--tests/ui/abi/interrupt-invalid-signature.i686.stderr15
-rw-r--r--tests/ui/abi/interrupt-invalid-signature.msp430.stderr28
-rw-r--r--tests/ui/abi/interrupt-invalid-signature.riscv32.stderr54
-rw-r--r--tests/ui/abi/interrupt-invalid-signature.riscv64.stderr54
-rw-r--r--tests/ui/abi/interrupt-invalid-signature.rs110
-rw-r--r--tests/ui/abi/interrupt-invalid-signature.x64.stderr15
7 files changed, 304 insertions, 0 deletions
diff --git a/tests/ui/abi/interrupt-invalid-signature.avr.stderr b/tests/ui/abi/interrupt-invalid-signature.avr.stderr
new file mode 100644
index 00000000000..91f5ca2022e
--- /dev/null
+++ b/tests/ui/abi/interrupt-invalid-signature.avr.stderr
@@ -0,0 +1,28 @@
+error: invalid signature for `extern "avr-interrupt"` function
+  --> $DIR/interrupt-invalid-signature.rs:44:35
+   |
+LL | extern "avr-interrupt" fn avr_arg(_byte: u8) {}
+   |                                   ^^^^^^^^^
+   |
+   = note: functions with the "avr-interrupt" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "avr-interrupt" fn avr_arg(_byte: u8) {}
+LL + extern "avr-interrupt" fn avr_arg() {}
+   |
+
+error: invalid signature for `extern "avr-interrupt"` function
+  --> $DIR/interrupt-invalid-signature.rs:59:40
+   |
+LL | extern "avr-interrupt" fn avr_ret() -> u8 {
+   |                                        ^^
+   |
+   = note: functions with the "avr-interrupt" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "avr-interrupt" fn avr_ret() -> u8 {
+LL + extern "avr-interrupt" fn avr_ret() {
+   |
+
+error: aborting due to 2 previous errors
+
diff --git a/tests/ui/abi/interrupt-invalid-signature.i686.stderr b/tests/ui/abi/interrupt-invalid-signature.i686.stderr
new file mode 100644
index 00000000000..06fd513df19
--- /dev/null
+++ b/tests/ui/abi/interrupt-invalid-signature.i686.stderr
@@ -0,0 +1,15 @@
+error: invalid signature for `extern "x86-interrupt"` function
+  --> $DIR/interrupt-invalid-signature.rs:83:40
+   |
+LL | extern "x86-interrupt" fn x86_ret() -> u8 {
+   |                                        ^^
+   |
+   = note: functions with the "custom" ABI cannot have a return type
+help: remove the return type
+  --> $DIR/interrupt-invalid-signature.rs:83:40
+   |
+LL | extern "x86-interrupt" fn x86_ret() -> u8 {
+   |                                        ^^
+
+error: aborting due to 1 previous error
+
diff --git a/tests/ui/abi/interrupt-invalid-signature.msp430.stderr b/tests/ui/abi/interrupt-invalid-signature.msp430.stderr
new file mode 100644
index 00000000000..38479f93de5
--- /dev/null
+++ b/tests/ui/abi/interrupt-invalid-signature.msp430.stderr
@@ -0,0 +1,28 @@
+error: invalid signature for `extern "msp430-interrupt"` function
+  --> $DIR/interrupt-invalid-signature.rs:40:41
+   |
+LL | extern "msp430-interrupt" fn msp430_arg(_byte: u8) {}
+   |                                         ^^^^^^^^^
+   |
+   = note: functions with the "msp430-interrupt" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "msp430-interrupt" fn msp430_arg(_byte: u8) {}
+LL + extern "msp430-interrupt" fn msp430_arg() {}
+   |
+
+error: invalid signature for `extern "msp430-interrupt"` function
+  --> $DIR/interrupt-invalid-signature.rs:65:46
+   |
+LL | extern "msp430-interrupt" fn msp430_ret() -> u8 {
+   |                                              ^^
+   |
+   = note: functions with the "msp430-interrupt" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "msp430-interrupt" fn msp430_ret() -> u8 {
+LL + extern "msp430-interrupt" fn msp430_ret() {
+   |
+
+error: aborting due to 2 previous errors
+
diff --git a/tests/ui/abi/interrupt-invalid-signature.riscv32.stderr b/tests/ui/abi/interrupt-invalid-signature.riscv32.stderr
new file mode 100644
index 00000000000..d632b17ab83
--- /dev/null
+++ b/tests/ui/abi/interrupt-invalid-signature.riscv32.stderr
@@ -0,0 +1,54 @@
+error: invalid signature for `extern "riscv-interrupt-m"` function
+  --> $DIR/interrupt-invalid-signature.rs:48:43
+   |
+LL | extern "riscv-interrupt-m" fn riscv_m_arg(_byte: u8) {}
+   |                                           ^^^^^^^^^
+   |
+   = note: functions with the "riscv-interrupt-m" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "riscv-interrupt-m" fn riscv_m_arg(_byte: u8) {}
+LL + extern "riscv-interrupt-m" fn riscv_m_arg() {}
+   |
+
+error: invalid signature for `extern "riscv-interrupt-s"` function
+  --> $DIR/interrupt-invalid-signature.rs:52:43
+   |
+LL | extern "riscv-interrupt-s" fn riscv_s_arg(_byte: u8) {}
+   |                                           ^^^^^^^^^
+   |
+   = note: functions with the "riscv-interrupt-s" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "riscv-interrupt-s" fn riscv_s_arg(_byte: u8) {}
+LL + extern "riscv-interrupt-s" fn riscv_s_arg() {}
+   |
+
+error: invalid signature for `extern "riscv-interrupt-m"` function
+  --> $DIR/interrupt-invalid-signature.rs:71:48
+   |
+LL | extern "riscv-interrupt-m" fn riscv_m_ret() -> u8 {
+   |                                                ^^
+   |
+   = note: functions with the "riscv-interrupt-m" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "riscv-interrupt-m" fn riscv_m_ret() -> u8 {
+LL + extern "riscv-interrupt-m" fn riscv_m_ret() {
+   |
+
+error: invalid signature for `extern "riscv-interrupt-s"` function
+  --> $DIR/interrupt-invalid-signature.rs:77:48
+   |
+LL | extern "riscv-interrupt-s" fn riscv_s_ret() -> u8 {
+   |                                                ^^
+   |
+   = note: functions with the "riscv-interrupt-s" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "riscv-interrupt-s" fn riscv_s_ret() -> u8 {
+LL + extern "riscv-interrupt-s" fn riscv_s_ret() {
+   |
+
+error: aborting due to 4 previous errors
+
diff --git a/tests/ui/abi/interrupt-invalid-signature.riscv64.stderr b/tests/ui/abi/interrupt-invalid-signature.riscv64.stderr
new file mode 100644
index 00000000000..d632b17ab83
--- /dev/null
+++ b/tests/ui/abi/interrupt-invalid-signature.riscv64.stderr
@@ -0,0 +1,54 @@
+error: invalid signature for `extern "riscv-interrupt-m"` function
+  --> $DIR/interrupt-invalid-signature.rs:48:43
+   |
+LL | extern "riscv-interrupt-m" fn riscv_m_arg(_byte: u8) {}
+   |                                           ^^^^^^^^^
+   |
+   = note: functions with the "riscv-interrupt-m" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "riscv-interrupt-m" fn riscv_m_arg(_byte: u8) {}
+LL + extern "riscv-interrupt-m" fn riscv_m_arg() {}
+   |
+
+error: invalid signature for `extern "riscv-interrupt-s"` function
+  --> $DIR/interrupt-invalid-signature.rs:52:43
+   |
+LL | extern "riscv-interrupt-s" fn riscv_s_arg(_byte: u8) {}
+   |                                           ^^^^^^^^^
+   |
+   = note: functions with the "riscv-interrupt-s" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "riscv-interrupt-s" fn riscv_s_arg(_byte: u8) {}
+LL + extern "riscv-interrupt-s" fn riscv_s_arg() {}
+   |
+
+error: invalid signature for `extern "riscv-interrupt-m"` function
+  --> $DIR/interrupt-invalid-signature.rs:71:48
+   |
+LL | extern "riscv-interrupt-m" fn riscv_m_ret() -> u8 {
+   |                                                ^^
+   |
+   = note: functions with the "riscv-interrupt-m" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "riscv-interrupt-m" fn riscv_m_ret() -> u8 {
+LL + extern "riscv-interrupt-m" fn riscv_m_ret() {
+   |
+
+error: invalid signature for `extern "riscv-interrupt-s"` function
+  --> $DIR/interrupt-invalid-signature.rs:77:48
+   |
+LL | extern "riscv-interrupt-s" fn riscv_s_ret() -> u8 {
+   |                                                ^^
+   |
+   = note: functions with the "riscv-interrupt-s" ABI cannot have any parameters or return type
+help: remove the parameters and return type
+   |
+LL - extern "riscv-interrupt-s" fn riscv_s_ret() -> u8 {
+LL + extern "riscv-interrupt-s" fn riscv_s_ret() {
+   |
+
+error: aborting due to 4 previous errors
+
diff --git a/tests/ui/abi/interrupt-invalid-signature.rs b/tests/ui/abi/interrupt-invalid-signature.rs
new file mode 100644
index 00000000000..e389285b069
--- /dev/null
+++ b/tests/ui/abi/interrupt-invalid-signature.rs
@@ -0,0 +1,110 @@
+/*! Tests interrupt ABIs have a constricted signature
+
+Most interrupt ABIs share a similar restriction in terms of not allowing most signatures.
+Specifically, they generally cannot have arguments or return types.
+So we test that they error in essentially all of the same places.
+A notable and interesting exception is x86.
+
+This test uses `cfg` because it is not testing whether these ABIs work on the platform.
+*/
+//@ add-core-stubs
+//@ revisions: x64 i686 riscv32 riscv64 avr msp430
+//
+//@ [x64] needs-llvm-components: x86
+//@ [x64] compile-flags: --target=x86_64-unknown-linux-gnu --crate-type=rlib
+//@ [i686] needs-llvm-components: x86
+//@ [i686] compile-flags: --target=i686-unknown-linux-gnu --crate-type=rlib
+//@ [riscv32] needs-llvm-components: riscv
+//@ [riscv32] compile-flags: --target=riscv32i-unknown-none-elf --crate-type=rlib
+//@ [riscv64] needs-llvm-components: riscv
+//@ [riscv64] compile-flags: --target=riscv64gc-unknown-none-elf --crate-type=rlib
+//@ [avr] needs-llvm-components: avr
+//@ [avr] compile-flags: --target=avr-none -C target-cpu=atmega328p --crate-type=rlib
+//@ [msp430] needs-llvm-components: msp430
+//@ [msp430] compile-flags: --target=msp430-none-elf --crate-type=rlib
+#![no_core]
+#![feature(
+    no_core,
+    abi_msp430_interrupt,
+    abi_avr_interrupt,
+    abi_x86_interrupt,
+    abi_riscv_interrupt
+)]
+
+extern crate minicore;
+use minicore::*;
+
+/* most extern "interrupt" definitions should not accept args */
+
+#[cfg(msp430)]
+extern "msp430-interrupt" fn msp430_arg(_byte: u8) {}
+//[msp430]~^ ERROR invalid signature
+
+#[cfg(avr)]
+extern "avr-interrupt" fn avr_arg(_byte: u8) {}
+//[avr]~^ ERROR invalid signature
+
+#[cfg(any(riscv32,riscv64))]
+extern "riscv-interrupt-m" fn riscv_m_arg(_byte: u8) {}
+//[riscv32,riscv64]~^ ERROR invalid signature
+
+#[cfg(any(riscv32,riscv64))]
+extern "riscv-interrupt-s" fn riscv_s_arg(_byte: u8) {}
+//[riscv32,riscv64]~^ ERROR invalid signature
+
+
+/* all extern "interrupt" definitions should not return non-1ZST values */
+
+#[cfg(avr)]
+extern "avr-interrupt" fn avr_ret() -> u8 {
+    //[avr]~^ ERROR invalid signature
+    1
+}
+
+#[cfg(msp430)]
+extern "msp430-interrupt" fn msp430_ret() -> u8 {
+    //[msp430]~^ ERROR invalid signature
+    1
+}
+
+#[cfg(any(riscv32,riscv64))]
+extern "riscv-interrupt-m" fn riscv_m_ret() -> u8 {
+    //[riscv32,riscv64]~^ ERROR invalid signature
+    1
+}
+
+#[cfg(any(riscv32,riscv64))]
+extern "riscv-interrupt-s" fn riscv_s_ret() -> u8 {
+    //[riscv32,riscv64]~^ ERROR invalid signature
+    1
+}
+
+#[cfg(any(x64,i686))]
+extern "x86-interrupt" fn x86_ret() -> u8 {
+    //[x64,i686]~^ ERROR invalid signature
+    1
+}
+
+
+
+/* extern "interrupt" fnptrs with invalid signatures */
+
+#[cfg(avr)]
+fn avr_ptr(_f: extern "avr-interrupt" fn(u8) -> u8) {
+}
+
+#[cfg(msp430)]
+fn msp430_ptr(_f: extern "msp430-interrupt" fn(u8) -> u8) {
+}
+
+#[cfg(any(riscv32,riscv64))]
+fn riscv_m_ptr(_f: extern "riscv-interrupt-m" fn(u8) -> u8) {
+}
+
+#[cfg(any(riscv32,riscv64))]
+fn riscv_s_ptr(_f: extern "riscv-interrupt-s" fn(u8) -> u8) {
+}
+
+#[cfg(any(x64,i686))]
+fn x86_ptr(_f: extern "x86-interrupt" fn() -> u8) {
+}
diff --git a/tests/ui/abi/interrupt-invalid-signature.x64.stderr b/tests/ui/abi/interrupt-invalid-signature.x64.stderr
new file mode 100644
index 00000000000..06fd513df19
--- /dev/null
+++ b/tests/ui/abi/interrupt-invalid-signature.x64.stderr
@@ -0,0 +1,15 @@
+error: invalid signature for `extern "x86-interrupt"` function
+  --> $DIR/interrupt-invalid-signature.rs:83:40
+   |
+LL | extern "x86-interrupt" fn x86_ret() -> u8 {
+   |                                        ^^
+   |
+   = note: functions with the "custom" ABI cannot have a return type
+help: remove the return type
+  --> $DIR/interrupt-invalid-signature.rs:83:40
+   |
+LL | extern "x86-interrupt" fn x86_ret() -> u8 {
+   |                                        ^^
+
+error: aborting due to 1 previous error
+