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