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