diff options
Diffstat (limited to 'tests/ui/generator/control-flow.rs')
-rw-r--r-- | tests/ui/generator/control-flow.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/ui/generator/control-flow.rs b/tests/ui/generator/control-flow.rs new file mode 100644 index 000000000..4f69c7855 --- /dev/null +++ b/tests/ui/generator/control-flow.rs @@ -0,0 +1,53 @@ +// run-pass + +// revisions: default nomiropt +//[nomiropt]compile-flags: -Z mir-opt-level=0 + +#![feature(generators, generator_trait)] + +use std::marker::Unpin; +use std::ops::{GeneratorState, Generator}; +use std::pin::Pin; + +fn finish<T>(mut amt: usize, mut t: T) -> T::Return + where T: Generator<(), Yield = ()> + Unpin, +{ + loop { + match Pin::new(&mut t).resume(()) { + GeneratorState::Yielded(()) => amt = amt.checked_sub(1).unwrap(), + GeneratorState::Complete(ret) => { + assert_eq!(amt, 0); + return ret + } + } + } + +} + +fn main() { + finish(1, || yield); + finish(8, || { + for _ in 0..8 { + yield; + } + }); + finish(1, || { + if true { + yield; + } else { + } + }); + finish(1, || { + if false { + } else { + yield; + } + }); + finish(2, || { + if { yield; false } { + yield; + panic!() + } + yield + }); +} |