mirror of
https://github.com/rust-lang/rust
synced 2024-11-05 20:45:15 +00:00
aef0f4024a
And suggest adding the `#[coroutine]` to the closure
35 lines
775 B
Rust
35 lines
775 B
Rust
#![allow(unused_mut)]
|
|
#![feature(coroutines, coroutine_trait)]
|
|
|
|
use std::marker::Unpin;
|
|
use std::ops::Coroutine;
|
|
use std::ops::CoroutineState::Yielded;
|
|
use std::pin::Pin;
|
|
|
|
pub struct GenIter<G>(G);
|
|
|
|
impl <G> Iterator for GenIter<G>
|
|
where
|
|
G: Coroutine + Unpin,
|
|
{
|
|
type Item = G::Yield;
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
match Pin::new(&mut self.0).resume(()) {
|
|
Yielded(y) => Some(y),
|
|
_ => None
|
|
}
|
|
}
|
|
}
|
|
|
|
fn bug<'a>() -> impl Iterator<Item = &'a str> {
|
|
GenIter(#[coroutine] move || {
|
|
let mut s = String::new();
|
|
yield &s[..] //~ ERROR cannot yield value referencing local variable `s` [E0515]
|
|
//~| ERROR borrow may still be in use when coroutine yields
|
|
})
|
|
}
|
|
|
|
fn main() {
|
|
bug();
|
|
}
|