blob: e389285b06917a031490106e075ed327ffdc5d64 [file] [log] [blame]
/*! 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) {
}