]> git.lizzy.rs Git - rust.git/blob - src/test/ui/generator/resume-live-across-yield.rs
Auto merge of #98051 - davidtwco:split-dwarf-stabilization, r=wesleywiser
[rust.git] / src / test / ui / generator / resume-live-across-yield.rs
1 // run-pass
2
3 #![feature(generators, generator_trait)]
4
5 use std::ops::{Generator, GeneratorState};
6 use std::pin::Pin;
7 use std::sync::atomic::{AtomicUsize, Ordering};
8
9 static DROP: AtomicUsize = AtomicUsize::new(0);
10
11 #[derive(PartialEq, Eq, Debug)]
12 struct Dropper(String);
13
14 impl Drop for Dropper {
15     fn drop(&mut self) {
16         DROP.fetch_add(1, Ordering::SeqCst);
17     }
18 }
19
20 fn main() {
21     let mut g = |mut _d| {
22         _d = yield;
23         _d
24     };
25
26     let mut g = Pin::new(&mut g);
27
28     assert_eq!(
29         g.as_mut().resume(Dropper(String::from("Hello world!"))),
30         GeneratorState::Yielded(())
31     );
32     assert_eq!(DROP.load(Ordering::Acquire), 0);
33     match g.as_mut().resume(Dropper(String::from("Number Two"))) {
34         GeneratorState::Complete(dropper) => {
35             assert_eq!(DROP.load(Ordering::Acquire), 1);
36             assert_eq!(dropper.0, "Number Two");
37             drop(dropper);
38             assert_eq!(DROP.load(Ordering::Acquire), 2);
39         }
40         _ => unreachable!(),
41     }
42
43     drop(g);
44     assert_eq!(DROP.load(Ordering::Acquire), 2);
45 }