| // Copied from https://github.com/rust-lang/rust/blob/46455dc65069387f2dc46612f13fd45452ab301a/tests/ui/coroutine/gen_block_iterate.rs |
| // revisions: next old |
| //compile-flags: --edition 2024 -Zunstable-options |
| //[next] compile-flags: -Znext-solver |
| // run-pass |
| #![feature(gen_blocks)] |
| |
| fn foo() -> impl Iterator<Item = u32> { |
| gen { yield 42; for x in 3..6 { yield x } } |
| } |
| |
| fn moved() -> impl Iterator<Item = u32> { |
| let mut x = "foo".to_string(); |
| gen move { |
| yield 42; |
| if x == "foo" { return } |
| x.clear(); |
| for x in 3..6 { yield x } |
| } |
| } |
| |
| fn main() { |
| let mut iter = foo(); |
| assert_eq!(iter.next(), Some(42)); |
| assert_eq!(iter.next(), Some(3)); |
| assert_eq!(iter.next(), Some(4)); |
| assert_eq!(iter.next(), Some(5)); |
| assert_eq!(iter.next(), None); |
| // `gen` blocks are fused |
| assert_eq!(iter.next(), None); |
| |
| let mut iter = moved(); |
| assert_eq!(iter.next(), Some(42)); |
| assert_eq!(iter.next(), None); |
| |
| } |