// run-pass #![allow(unreachable_code)] use std::sync::atomic::{AtomicBool, Ordering, AtomicUsize}; struct Print(usize); impl Drop for Print { fn drop(&mut self) { println!("{}", self.0); FOO[self.0].store(true, Ordering::Relaxed); assert_eq!(BAR.fetch_sub(1, Ordering::Relaxed), self.0); } } const A: Print = Print(0); const B: Print = Print(1); static FOO: [AtomicBool; 3] = [AtomicBool::new(false), AtomicBool::new(false), AtomicBool::new(false)]; static BAR: AtomicUsize = AtomicUsize::new(2); fn main() { loop { std::mem::forget(({ A }, B, Print(2), break)); } for (i, b) in FOO.iter().enumerate() { assert!(b.load(Ordering::Relaxed), "{} not set", i); } assert_eq!(BAR.fetch_add(1, Ordering::Relaxed), usize::max_value()); }