//@ run-pass //@ needs-threads use std::cell::Cell; use std::thread; #[derive(Default)] struct Foo { ptr: Cell<*const Foo>, } impl Foo { fn touch(&self) { if self.ptr.get().is_null() { self.ptr.set(self); } else { assert!(self.ptr.get() == self); } } } impl Drop for Foo { fn drop(&mut self) { self.touch(); } } thread_local!(static FOO: Foo = Foo::default()); fn main() { thread::spawn(|| { FOO.with(|foo| foo.touch()); FOO.with(|foo| foo.touch()); }) .join() .unwrap(); }