]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/fail/generator-pinned-moved.rs
Rollup merge of #101939 - zhaixiaojuan:loongarch64-abi, r=oli-obk
[rust.git] / src / tools / miri / tests / fail / generator-pinned-moved.rs
1 //@compile-flags: -Zmiri-disable-validation
2 #![feature(generators, generator_trait)]
3
4 use std::{
5     ops::{Generator, GeneratorState},
6     pin::Pin,
7 };
8
9 fn firstn() -> impl Generator<Yield = u64, Return = ()> {
10     static move || {
11         let mut num = 0;
12         let num = &mut num;
13
14         yield *num;
15         *num += 1; //~ ERROR: dereferenced after this allocation got freed
16     }
17 }
18
19 struct GeneratorIteratorAdapter<G>(G);
20
21 impl<G> Iterator for GeneratorIteratorAdapter<G>
22 where
23     G: Generator<Return = ()>,
24 {
25     type Item = G::Yield;
26
27     fn next(&mut self) -> Option<Self::Item> {
28         let me = unsafe { Pin::new_unchecked(&mut self.0) };
29         match me.resume(()) {
30             GeneratorState::Yielded(x) => Some(x),
31             GeneratorState::Complete(_) => None,
32         }
33     }
34 }
35
36 fn main() {
37     let mut generator_iterator_2 = {
38         let mut generator_iterator = Box::new(GeneratorIteratorAdapter(firstn()));
39         generator_iterator.next(); // pin it
40
41         Box::new(*generator_iterator) // move it
42     }; // *deallocate* generator_iterator
43
44     generator_iterator_2.next(); // and use moved value
45 }