25 lines
534 B
Rust
25 lines
534 B
Rust
// Tests that C++ double unwinding through Rust code will be properly guarded
|
|
// against instead of exhibiting undefined behaviour.
|
|
|
|
extern "C-unwind" {
|
|
fn throw_cxx_exception();
|
|
fn cxx_catch_callback(cb: extern "C-unwind" fn());
|
|
}
|
|
|
|
struct ThrowOnDrop;
|
|
|
|
impl Drop for ThrowOnDrop {
|
|
fn drop(&mut self) {
|
|
unsafe { throw_cxx_exception() };
|
|
}
|
|
}
|
|
|
|
extern "C-unwind" fn test_double_unwind() {
|
|
let _a = ThrowOnDrop;
|
|
let _b = ThrowOnDrop;
|
|
}
|
|
|
|
fn main() {
|
|
unsafe { cxx_catch_callback(test_double_unwind) };
|
|
}
|