// compile-flags: -Zmiri-disable-validation #![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 dereferenced after this allocation got freed } } 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 = Box::new(GeneratorIteratorAdapter(firstn())); generator_iterator.next(); // pin it Box::new(*generator_iterator) // move it }; // *deallocate* generator_iterator generator_iterator_2.next(); // and use moved value }