//@ 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() } }