39 lines
722 B
Rust
39 lines
722 B
Rust
// only-x86_64
|
|
// run-pass
|
|
// needs-asm-support
|
|
// needs-unwind
|
|
|
|
#![feature(asm_unwind)]
|
|
|
|
use std::arch::asm;
|
|
use std::panic::{catch_unwind, resume_unwind, AssertUnwindSafe};
|
|
|
|
struct Foo<'a>(&'a mut bool);
|
|
|
|
impl Drop for Foo<'_> {
|
|
fn drop(&mut self) {
|
|
*self.0 = false;
|
|
}
|
|
}
|
|
|
|
extern "C" fn panicky() {
|
|
resume_unwind(Box::new(()));
|
|
}
|
|
|
|
fn main() {
|
|
let flag = &mut true;
|
|
catch_unwind(AssertUnwindSafe(|| {
|
|
let _foo = Foo(flag);
|
|
unsafe {
|
|
asm!(
|
|
"call {}",
|
|
sym panicky,
|
|
clobber_abi("C"),
|
|
options(may_unwind)
|
|
);
|
|
}
|
|
}))
|
|
.expect_err("expected a panic");
|
|
assert_eq!(*flag, false);
|
|
}
|