#![feature(coroutines, coroutine_trait, stmt_expr_attributes)] use std::ops::{CoroutineState, Coroutine}; use std::cell::Cell; use std::pin::Pin; fn yield_during_iter_owned_data(x: Vec) { // The coroutine owns `x`, so we error out when yielding with a // reference to it. This winds up becoming a rather confusing // regionck error -- in particular, we would freeze with the // reference in scope, and it doesn't live long enough. let _b =#[coroutine] move || { for p in &x { //~ ERROR yield(); } }; } fn yield_during_iter_borrowed_slice(x: &[i32]) { let _b = #[coroutine] move || { for p in x { yield(); } }; } fn yield_during_iter_borrowed_slice_2() { let mut x = vec![22_i32]; let _b = #[coroutine] || { for p in &x { yield(); } }; println!("{:?}", x); } fn yield_during_iter_borrowed_slice_3() { // OK to take a mutable ref to `x` and yield // up pointers from it: let mut x = vec![22_i32]; let mut b = #[coroutine] || { for p in &mut x { yield p; } }; Pin::new(&mut b).resume(()); } fn yield_during_iter_borrowed_slice_4() { // ...but not OK to do that while reading // from `x` too let mut x = vec![22_i32]; let mut b = #[coroutine] || { for p in &mut x { yield p; } }; println!("{}", x[0]); //~ ERROR Pin::new(&mut b).resume(()); } fn yield_during_range_iter() { // Should be OK. let mut b = #[coroutine] || { let v = vec![1,2,3]; let len = v.len(); for i in 0..len { let x = v[i]; yield x; } }; Pin::new(&mut b).resume(()); } fn main() { }