File tree Expand file tree Collapse file tree 1 file changed +44
-0
lines changed Expand file tree Collapse file tree 1 file changed +44
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments