| //@ 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(); | |
| } |