3 // revisions: default nomiropt
4 //[nomiropt]compile-flags: -Z mir-opt-level=0
6 #![feature(generators, generator_trait)]
9 use std::marker::Unpin;
12 GeneratorState::{self, *},
15 use std::sync::atomic::{AtomicUsize, Ordering};
17 fn drain<G: Generator<R, Yield = Y> + Unpin, R, Y>(
19 inout: Vec<(R, GeneratorState<Y, G::Return>)>,
22 G::Return: Debug + PartialEq,
24 let mut gen = Pin::new(gen);
26 for (input, out) in inout {
27 assert_eq!(gen.as_mut().resume(input), out);
31 static DROPS: AtomicUsize = AtomicUsize::new(0);
33 #[derive(Debug, PartialEq)]
36 impl Drop for DropMe {
38 DROPS.fetch_add(1, Ordering::SeqCst);
42 fn expect_drops<T>(expected_drops: usize, f: impl FnOnce() -> T) -> T {
43 DROPS.store(0, Ordering::SeqCst);
47 let actual_drops = DROPS.load(Ordering::SeqCst);
48 assert_eq!(actual_drops, expected_drops);
60 vec![(1, Yielded(2)), (-45, Yielded(-44)), (500, Yielded(501)), (0, Complete(-1))],
63 expect_drops(2, || drain(&mut |a| yield a, vec![(DropMe, Yielded(DropMe))]));
67 &mut |a| yield yield a,
68 vec![(DropMe, Yielded(DropMe)), (DropMe, Yielded(DropMe)), (DropMe, Complete(DropMe))],
72 #[allow(unreachable_code)]
73 expect_drops(2, || drain(&mut |a| yield return a, vec![(DropMe, Complete(DropMe))]));
78 if false { yield () } else { a }
80 vec![(DropMe, Complete(DropMe))],
86 #[allow(unused_assignments, unused_variables)]
87 &mut |mut a: DropMe| {
93 (DropMe, Yielded(())),
94 (DropMe, Yielded(())),
95 (DropMe, Yielded(())),
96 (DropMe, Complete(())),