1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- #![no_std]
- #![feature(start)]
- extern crate alloc;
- extern crate unwinding;
- use alloc::{borrow::ToOwned, string::String};
- use unwinding::print::*;
- #[link(name = "c")]
- extern "C" {}
- struct PrintOnDrop(String);
- impl Drop for PrintOnDrop {
- fn drop(&mut self) {
- eprintln!("dropped: {:?}", self.0);
- }
- }
- struct PanicOnDrop;
- impl Drop for PanicOnDrop {
- fn drop(&mut self) {
- panic!("panic on drop");
- }
- }
- #[track_caller]
- fn foo() {
- panic!("panic");
- }
- fn bar() {
- let _p = PrintOnDrop("string".to_owned());
- foo()
- }
- fn main() {
- let _ = unwinding::panic::catch_unwind(|| {
- bar();
- eprintln!("done");
- });
- eprintln!("caught");
- let _p = PanicOnDrop;
- foo();
- }
- #[start]
- fn start(_argc: isize, _argv: *const *const u8) -> isize {
- unwinding::panic::catch_unwind(|| {
- main();
- 0
- })
- .unwrap_or(101)
- }
|