]> git.proxmox.com Git - rustc.git/blame - src/test/ui/generator/resume-live-across-yield.rs
Update unsuspicious file list
[rustc.git] / src / test / ui / generator / resume-live-across-yield.rs
CommitLineData
74b04a01
XL
1// run-pass
2
3#![feature(generators, generator_trait)]
4
5use std::ops::{Generator, GeneratorState};
6use std::pin::Pin;
7use std::sync::atomic::{AtomicUsize, Ordering};
8
9static DROP: AtomicUsize = AtomicUsize::new(0);
10
11#[derive(PartialEq, Eq, Debug)]
12struct Dropper(String);
13
14impl Drop for Dropper {
15 fn drop(&mut self) {
16 DROP.fetch_add(1, Ordering::SeqCst);
17 }
18}
19
20fn 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}