//@ run-pass #![allow(stable_features)] //@ needs-threads #![feature(thread_local_try_with)] use std::sync::atomic::{AtomicUsize, Ordering}; use std::thread; struct Foo { cnt: usize, } thread_local!(static FOO: Foo = Foo::init()); static CNT: AtomicUsize = AtomicUsize::new(0); impl Foo { fn init() -> Foo { let cnt = CNT.fetch_add(1, Ordering::SeqCst); if cnt == 0 { FOO.with(|_| {}); } Foo { cnt: cnt } } } impl Drop for Foo { fn drop(&mut self) { if self.cnt == 1 { FOO.with(|foo| assert_eq!(foo.cnt, 0)); } else { assert_eq!(self.cnt, 0); if FOO.try_with(|_| ()).is_ok() { panic!("should not be in valid state"); } } } } fn main() { thread::spawn(|| { FOO.with(|_| {}); }) .join() .unwrap(); }