]>
Commit | Line | Data |
---|---|---|
74b04a01 XL |
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 | } |