| // Test that macros can be defined in the labeled block. This should not trigger an error about |
| // statements not being allowed in that position, and should of course work as expected. |
| |
| //@ run-pass |
| |
| #![allow(incomplete_features)] |
| #![feature(loop_match)] |
| |
| enum State { |
| A, |
| B, |
| C, |
| } |
| |
| fn main() { |
| let mut state = State::A; |
| #[loop_match] |
| 'a: loop { |
| state = 'blk: { |
| macro_rules! const_continue { |
| ($e:expr) => { |
| #[const_continue] |
| break 'blk $e; |
| }; |
| } |
| match state { |
| State::A => { |
| const_continue!(State::B); |
| } |
| State::B => { |
| // Without special logic, the compiler believes this is a |
| // reassignment to an immutable variable because of the |
| // `loop`. So this tests that local variables work. |
| let _a = 0; |
| |
| if true { |
| const_continue!(State::C); |
| } else { |
| const_continue!(State::A); |
| } |
| } |
| State::C => break 'a, |
| } |
| }; |
| } |
| |
| assert!(matches!(state, State::C)) |
| } |