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