| // Test that dropping values works in match arms, which is nontrivial | 
 | // because each match arm needs its own scope. | 
 |  | 
 | //@ run-pass | 
 |  | 
 | #![allow(incomplete_features)] | 
 | #![feature(loop_match)] | 
 |  | 
 | use std::sync::atomic::{AtomicBool, Ordering}; | 
 |  | 
 | fn main() { | 
 |     assert_eq!(helper(), 1); | 
 |     assert!(DROPPED.load(Ordering::Relaxed)); | 
 | } | 
 |  | 
 | static DROPPED: AtomicBool = AtomicBool::new(false); | 
 |  | 
 | struct X; | 
 |  | 
 | impl Drop for X { | 
 |     fn drop(&mut self) { | 
 |         DROPPED.store(true, Ordering::Relaxed); | 
 |     } | 
 | } | 
 |  | 
 | #[no_mangle] | 
 | #[inline(never)] | 
 | fn helper() -> i32 { | 
 |     let mut state = 0; | 
 |     #[loop_match] | 
 |     'a: loop { | 
 |         state = 'blk: { | 
 |             match state { | 
 |                 0 => match X { | 
 |                     _ => { | 
 |                         assert!(!DROPPED.load(Ordering::Relaxed)); | 
 |                         break 'blk 1; | 
 |                     } | 
 |                 }, | 
 |                 _ => { | 
 |                     assert!(DROPPED.load(Ordering::Relaxed)); | 
 |                     break 'a state; | 
 |                 } | 
 |             } | 
 |         }; | 
 |     } | 
 | } |