blob: 29713f2828ba211b195d93da8b488ff4cb59d371 [file] [log] [blame]
/*! Tests interrupt ABIs can return !
Most interrupt ABIs share a similar restriction in terms of not allowing most signatures,
but it makes sense to allow them to return ! because they could indeed be divergent.
This test uses `cfg` because it is not testing whether these ABIs work on the platform.
*/
//@ add-minicore
//@ revisions: x64 i686 riscv32 riscv64 avr msp430
//@ build-pass
//
//@ [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
//@ ignore-backends: gcc
#![no_core]
#![feature(
no_core,
abi_msp430_interrupt,
abi_avr_interrupt,
abi_x86_interrupt,
abi_riscv_interrupt
)]
extern crate minicore;
use minicore::*;
/* interrupts can return never */
#[cfg(avr)]
extern "avr-interrupt" fn avr_ret_never() -> ! {
loop {}
}
#[cfg(msp430)]
extern "msp430-interrupt" fn msp430_ret_never() -> ! {
loop {}
}
#[cfg(any(riscv32,riscv64))]
extern "riscv-interrupt-m" fn riscv_m_ret_never() -> ! {
loop {}
}
#[cfg(any(riscv32,riscv64))]
extern "riscv-interrupt-s" fn riscv_s_ret_never() -> ! {
loop {}
}
#[cfg(any(x64,i686))]
extern "x86-interrupt" fn x86_ret_never(_p: *const u8) -> ! {
loop {}
}
/* interrupts can return explicit () */
#[cfg(avr)]
extern "avr-interrupt" fn avr_ret_unit() -> () {
()
}
#[cfg(msp430)]
extern "msp430-interrupt" fn msp430_ret_unit() -> () {
()
}
#[cfg(any(riscv32,riscv64))]
extern "riscv-interrupt-m" fn riscv_m_ret_unit() -> () {
()
}
#[cfg(any(riscv32,riscv64))]
extern "riscv-interrupt-s" fn riscv_s_ret_unit() -> () {
()
}
#[cfg(any(x64,i686))]
extern "x86-interrupt" fn x86_ret_unit(_x: *const u8) -> () {
()
}
/* extern "interrupt" fnptrs can return ! too */
#[cfg(avr)]
fn avr_ptr(_f: extern "avr-interrupt" fn() -> !) {
}
#[cfg(msp430)]
fn msp430_ptr(_f: extern "msp430-interrupt" fn() -> !) {
}
#[cfg(any(riscv32,riscv64))]
fn riscv_m_ptr(_f: extern "riscv-interrupt-m" fn() -> !) {
}
#[cfg(any(riscv32,riscv64))]
fn riscv_s_ptr(_f: extern "riscv-interrupt-s" fn() -> !) {
}
#[cfg(any(x64,i686))]
fn x86_ptr(_f: extern "x86-interrupt" fn() -> !) {
}