| // Test that a nested `#[loop_match]` works as expected, and that e.g. a | |
| // `#[const_continue]` of the inner `#[loop_match]` does not interact with the | |
| // outer `#[loop_match]`. | |
| //@ run-pass | |
| #![allow(incomplete_features)] | |
| #![feature(loop_match)] | |
| enum State1 { | |
| A, | |
| B, | |
| C, | |
| } | |
| enum State2 { | |
| X, | |
| Y, | |
| Z, | |
| } | |
| fn main() { | |
| assert_eq!(run(), concat!("ab", "xyz", "xyz", "c")) | |
| } | |
| fn run() -> String { | |
| let mut accum = String::new(); | |
| let mut state1 = State1::A; | |
| let mut state2 = State2::X; | |
| let mut first = true; | |
| #[loop_match] | |
| 'a: loop { | |
| state1 = 'blk1: { | |
| match state1 { | |
| State1::A => { | |
| accum.push('a'); | |
| #[const_continue] | |
| break 'blk1 State1::B; | |
| } | |
| State1::B => { | |
| accum.push('b'); | |
| #[loop_match] | |
| loop { | |
| state2 = 'blk2: { | |
| match state2 { | |
| State2::X => { | |
| accum.push('x'); | |
| #[const_continue] | |
| break 'blk2 State2::Y; | |
| } | |
| State2::Y => { | |
| accum.push('y'); | |
| #[const_continue] | |
| break 'blk2 State2::Z; | |
| } | |
| State2::Z => { | |
| accum.push('z'); | |
| if first { | |
| first = false; | |
| #[const_continue] | |
| break 'blk2 State2::X; | |
| } else { | |
| #[const_continue] | |
| break 'blk1 State1::C; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| State1::C => { | |
| accum.push('c'); | |
| break 'a; | |
| } | |
| } | |
| } | |
| } | |
| accum | |
| } |