loop_match
The tracking issue for this feature is: #132306
The #[loop_match] and #[const_continue] attributes can be used to improve the code
generation of logic that fits this shape:
loop {
state = 'blk: {
match state {
State::A => {
break 'blk State::B
}
State::B => { /* ... */ }
/* ... */
}
}
}
Here the loop itself can be annotated with #[loop_match], and any break 'blk with
#[const_continue] if the value is know at compile time:
#[loop_match]
loop {
state = 'blk: {
match state {
State::A => {
#[const_continue]
break 'blk State::B
}
State::B => { /* ... */ }
/* ... */
}
}
}
The observable behavior of this loop is exactly the same as without the extra attributes.
The difference is in the generated output: normally, when the state is A, control flow
moves from the A branch, back to the top of the loop, then to the B branch. With the
attributes, The A branch will immediately jump to the B branch.
Removing the indirection can be beneficial for stack usage and branch prediction, and enables other optimizations by clearly splitting out the control flow paths that your program will actually use.