rust/tests/codegen/catch-unwind.rs

34 lines
722 B
Rust

//@ compile-flags: -O
// On x86 the closure is inlined in foo() producing something like
// define i32 @foo() [...] {
// tail call void @bar() [...]
// ret i32 0
// }
// On riscv the closure is another function, placed before fn foo so CHECK can't
// find it
//@ ignore-riscv64 FIXME
// On s390x the closure is also in another function
//@ ignore-s390x FIXME
// On loongarch64 the closure is also in another function
//@ ignore-loongarch64 FIXME
#![crate_type = "lib"]
#![feature(c_unwind)]
extern "C" {
fn bar();
}
// CHECK-LABEL: @foo
#[no_mangle]
pub unsafe fn foo() -> i32 {
// CHECK: call void @bar
// CHECK: ret i32 0
std::panic::catch_unwind(|| {
bar();
0
})
.unwrap()
}