| //@ edition:2018 |
| |
| fn is_unwindsafe(_: impl std::panic::UnwindSafe) {} |
| |
| fn main() { |
| // A normal future created by an async block takes a `&mut Context<'_>` argument. |
| // That should not leak through to the whole async block. |
| is_unwindsafe(async { |
| async {}.await; // this needs an inner await point |
| }); |
| |
| is_unwindsafe(async { |
| //~^ ERROR the type `&mut Context<'_>` may not be safely transferred across an unwind boundary |
| use std::ptr::null; |
| use std::task::{Context, RawWaker, RawWakerVTable, Waker}; |
| let waker = unsafe { |
| Waker::from_raw(RawWaker::new( |
| null(), |
| &RawWakerVTable::new(|_| todo!(), |_| todo!(), |_| todo!(), |_| todo!()), |
| )) |
| }; |
| let mut cx = Context::from_waker(&waker); |
| let cx_ref = &mut cx; |
| |
| async {}.await; // this needs an inner await point |
| |
| // in this case, `&mut Context<'_>` is *truly* alive across an await point |
| drop(cx_ref); |
| }); |
| } |