| #![feature(coroutines, coroutine_trait, stmt_expr_attributes)] | |
| use std::ops::{Coroutine, CoroutineState}; | |
| use std::pin::Pin; | |
| struct SetToNone<'a: 'b, 'b>(&'b mut Option<&'a i32>); | |
| impl<'a, 'b> Drop for SetToNone<'a, 'b> { | |
| fn drop(&mut self) { | |
| *self.0 = None; | |
| } | |
| } | |
| fn drop_using_coroutine() -> i32 { | |
| let mut y = Some(&0); | |
| let z = &mut y; | |
| let r; | |
| { | |
| let mut g = #[coroutine] | |
| move |r| { | |
| let _s = SetToNone(r); | |
| yield; | |
| }; | |
| let mut g = Pin::new(&mut g); | |
| g.as_mut().resume(z); | |
| r = y.as_ref().unwrap(); | |
| //~^ ERROR cannot borrow `y` as immutable because it is also borrowed as mutable | |
| } | |
| **r | |
| } | |
| fn main() { | |
| println!("{}", drop_using_coroutine()); | |
| } |