| #![feature(generators, generator_trait)] |
| |
| use std::ops::{GeneratorState, Generator}; |
| use std::cell::Cell; |
| use std::pin::Pin; |
| |
| fn yield_during_iter_owned_data(x: Vec<i32>) { |
| // The generator 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 = move || { |
| for p in &x { //~ ERROR |
| yield(); |
| } |
| }; |
| } |
| |
| fn yield_during_iter_borrowed_slice(x: &[i32]) { |
| let _b = move || { |
| for p in x { |
| yield(); |
| } |
| }; |
| } |
| |
| fn yield_during_iter_borrowed_slice_2() { |
| let mut x = vec![22_i32]; |
| let _b = || { |
| 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 = || { |
| 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 = || { |
| 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 = || { |
| 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() { } |