rust/tests/ui/loop-match/nested.rs

84 lines
2.3 KiB
Rust

// 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
}