mirror of https://github.com/rust-lang/rust.git
84 lines
2.3 KiB
Rust
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
|
|
}
|