2021-11-13 20:08:12 -06:00
|
|
|
// only-aarch64
|
|
|
|
// run-pass
|
|
|
|
// needs-asm-support
|
2023-06-14 05:19:21 -05:00
|
|
|
// needs-unwind
|
2021-11-13 20:08:12 -06:00
|
|
|
|
2022-10-17 16:38:37 -05:00
|
|
|
#![feature(asm_unwind)]
|
2021-11-13 20:08:12 -06:00
|
|
|
|
2021-12-09 18:15:33 -06:00
|
|
|
use std::arch::asm;
|
2021-11-13 20:08:12 -06:00
|
|
|
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);
|
2021-11-28 14:52:27 -06:00
|
|
|
unsafe {
|
|
|
|
asm!(
|
|
|
|
"bl {}",
|
|
|
|
sym panicky,
|
|
|
|
clobber_abi("C"),
|
|
|
|
options(may_unwind)
|
|
|
|
);
|
|
|
|
}
|
2021-11-13 20:08:12 -06:00
|
|
|
}))
|
|
|
|
.expect_err("expected a panic");
|
|
|
|
assert_eq!(*flag, false);
|
|
|
|
}
|