blob: 1eafe60503809be79a5ee21cb08b2766464a673d [file] [log] [blame] [edit]
//@ compile-flags: -C panic=unwind -Copt-level=0
//@ needs-unwind
//@ only-wasm32
#![crate_type = "lib"]
// Test that `panic_in_cleanup` is called on webassembly targets when a panic
// occurs in a destructor during unwinding.
extern "Rust" {
fn may_panic();
}
struct PanicOnDrop;
impl Drop for PanicOnDrop {
fn drop(&mut self) {
unsafe { may_panic() }
}
}
// CHECK-LABEL: @double_panic
// CHECK: invoke void @may_panic()
// CHECK: invoke void @{{.+}}drop_in_place{{.+}}
// CHECK: unwind label %[[TERMINATE:.*]]
//
// CHECK: [[TERMINATE]]:
// CHECK: call void @{{.*panic_in_cleanup}}
// CHECK: unreachable
#[no_mangle]
pub fn double_panic() {
let _guard = PanicOnDrop;
unsafe { may_panic() }
}