| //@ revisions: next old |
| //@ edition: 2024 |
| //@[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); |
| |
| } |