| // 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) }; | |
| } |