Skip to content

Commit beba8c4

Browse files
committed
Auto merge of #782 - RalfJung:generator, r=RalfJung
add a failing test where an immovable generator gets moved Test courtesy of @shepmaster
2 parents deccfa4 + 5472755 commit beba8c4

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#![feature(generators, generator_trait)]
2+
3+
use std::{
4+
ops::{Generator, GeneratorState},
5+
pin::Pin,
6+
};
7+
8+
fn firstn() -> impl Generator<Yield = u64, Return = ()> {
9+
static move || {
10+
let mut num = 0;
11+
let num = &mut num;
12+
13+
yield *num;
14+
*num += 1; //~ ERROR dangling pointer was dereferenced
15+
}
16+
}
17+
18+
struct GeneratorIteratorAdapter<G>(G);
19+
20+
impl<G> Iterator for GeneratorIteratorAdapter<G>
21+
where
22+
G: Generator<Return = ()>,
23+
{
24+
type Item = G::Yield;
25+
26+
fn next(&mut self) -> Option<Self::Item> {
27+
let me = unsafe { Pin::new_unchecked(&mut self.0) };
28+
match me.resume() {
29+
GeneratorState::Yielded(x) => Some(x),
30+
GeneratorState::Complete(_) => None,
31+
}
32+
}
33+
}
34+
35+
fn main() {
36+
let mut generator_iterator_2 = {
37+
let mut generator_iterator = GeneratorIteratorAdapter(firstn());
38+
generator_iterator.next(); // pin it
39+
40+
generator_iterator // move it
41+
}; // *deallocate* generator_iterator
42+
43+
generator_iterator_2.next(); // and use moved value
44+
}

0 commit comments

Comments
 (0)