// Regression test for //@ run-pass //@ edition:2018 #![allow(dead_code)] use std::future::Future; use std::task::{Waker, Wake, Context}; use std::sync::Arc; struct DummyWaker; impl Wake for DummyWaker { fn wake(self: Arc) {} } struct Foo { a: usize, b: &'static u32, } #[inline(never)] fn nop(_: T) {} fn main() { let mut fut = Box::pin(async { let action = Foo { b: &42, a: async { 0 }.await, }; // An error in the coroutine transform caused `b` to be overwritten with `a` when `b` was // borrowed. nop(&action.b); assert_ne!(0usize, unsafe { std::mem::transmute(action.b) }); async {}.await; }); let waker = Waker::from(Arc::new(DummyWaker)); let mut cx = Context::from_waker(&waker); let _ = fut.as_mut().poll(&mut cx); }