From 5472755f1654f210d61c4f5003ff8e733b54f9a4 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Fri, 21 Jun 2019 21:48:27 +0200 Subject: [PATCH] add a failing test where an immovable generator gets moved --- tests/compile-fail/generator-pinned-moved.rs | 44 ++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 tests/compile-fail/generator-pinned-moved.rs diff --git a/tests/compile-fail/generator-pinned-moved.rs b/tests/compile-fail/generator-pinned-moved.rs new file mode 100644 index 00000000000..2ae98adad77 --- /dev/null +++ b/tests/compile-fail/generator-pinned-moved.rs @@ -0,0 +1,44 @@ +#![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 +} -- 2.44.0