3 #![feature(generators, generator_trait)]
5 use std::ops::{Generator, GeneratorState};
7 use std::sync::atomic::{AtomicUsize, Ordering};
9 static DROP: AtomicUsize = AtomicUsize::new(0);
11 #[derive(PartialEq, Eq, Debug)]
12 struct Dropper(String);
14 impl Drop for Dropper {
16 DROP.fetch_add(1, Ordering::SeqCst);
21 let mut g = |mut _d| {
26 let mut g = Pin::new(&mut g);
29 g.as_mut().resume(Dropper(String::from("Hello world!"))),
30 GeneratorState::Yielded(())
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");
38 assert_eq!(DROP.load(Ordering::Acquire), 2);
44 assert_eq!(DROP.load(Ordering::Acquire), 2);