#![feature(generators, generator_trait)] use std::{ ops::{Generator, GeneratorState}, pin::Pin, }; fn firstn() -> impl Generator { static move || { let mut num = 0; let num = &mut num; yield *num; *num += 1; //~ ERROR dangling pointer was dereferenced } } struct GeneratorIteratorAdapter(G); impl Iterator for GeneratorIteratorAdapter where G: Generator, { type Item = G::Yield; fn next(&mut self) -> Option { let me = unsafe { Pin::new_unchecked(&mut self.0) }; match me.resume() { GeneratorState::Yielded(x) => Some(x), GeneratorState::Complete(_) => None, } } } fn main() { let mut generator_iterator_2 = { let mut generator_iterator = GeneratorIteratorAdapter(firstn()); generator_iterator.next(); // pin it generator_iterator // move it }; // *deallocate* generator_iterator generator_iterator_2.next(); // and use moved value }