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