|  | // Test that `#[const_continue]` correctly emits cleanup paths for drops. | 
|  | // | 
|  | // Here, we first drop `DropBomb`, causing an unwind. Then `ExitOnDrop` should | 
|  | // be dropped, causing us to exit with `0` rather than with some non-zero value | 
|  | // due to the panic, which is what causes the test to pass. | 
|  |  | 
|  | //@ run-pass | 
|  | //@ needs-unwind | 
|  |  | 
|  | #![allow(incomplete_features)] | 
|  | #![feature(loop_match)] | 
|  |  | 
|  | enum State { | 
|  | A, | 
|  | B, | 
|  | } | 
|  |  | 
|  | struct ExitOnDrop; | 
|  |  | 
|  | impl Drop for ExitOnDrop { | 
|  | fn drop(&mut self) { | 
|  | std::process::exit(0); | 
|  | } | 
|  | } | 
|  |  | 
|  | struct DropBomb; | 
|  |  | 
|  | impl Drop for DropBomb { | 
|  | fn drop(&mut self) { | 
|  | panic!("this must unwind"); | 
|  | } | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | let mut state = State::A; | 
|  | #[loop_match] | 
|  | 'a: loop { | 
|  | state = 'blk: { | 
|  | match state { | 
|  | State::A => { | 
|  | let _exit = ExitOnDrop; | 
|  | let _bomb = DropBomb; | 
|  |  | 
|  | #[const_continue] | 
|  | break 'blk State::B; | 
|  | } | 
|  | State::B => break 'a, | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | unreachable!(); | 
|  | } |