]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/pass/stacked-borrows/generators-self-referential.rs
Rollup merge of #105784 - yanns:update_stdarch, r=Amanieu
[rust.git] / src / tools / miri / tests / pass / stacked-borrows / generators-self-referential.rs
1 // See https://github.com/rust-lang/unsafe-code-guidelines/issues/148:
2 // this fails when Stacked Borrows is strictly applied even to `!Unpin` types.
3 #![feature(generators, generator_trait)]
4
5 use std::{
6     ops::{Generator, GeneratorState},
7     pin::Pin,
8 };
9
10 fn firstn() -> impl Generator<Yield = u64, Return = ()> {
11     static move || {
12         let mut num = 0;
13         let num = &mut num;
14
15         yield *num;
16         *num += 1; // would fail here
17
18         yield *num;
19         *num += 1;
20
21         yield *num;
22         *num += 1;
23     }
24 }
25
26 fn main() {
27     let mut generator_iterator = firstn();
28     let mut pin = unsafe { Pin::new_unchecked(&mut generator_iterator) };
29     let mut sum = 0;
30     while let GeneratorState::Yielded(x) = pin.as_mut().resume(()) {
31         sum += x;
32     }
33     assert_eq!(sum, 3);
34 }