// revisions: mir thir // [thir]compile-flags: -Z thir-unsafeck // normalize-stderr-test: "__FastLocalKeyInner::::get" -> "$$LOCALKEYINNER::::get" // normalize-stderr-test: "__OsLocalKeyInner::::get" -> "$$LOCALKEYINNER::::get" #![feature(thread_local)] #![feature(cfg_target_thread_local, thread_local_internals)] use std::cell::RefCell; type Foo = std::cell::RefCell; #[cfg(target_thread_local)] #[thread_local] static __KEY: std::thread::__FastLocalKeyInner = std::thread::__FastLocalKeyInner::new(); #[cfg(not(target_thread_local))] static __KEY: std::thread::__OsLocalKeyInner = std::thread::__OsLocalKeyInner::new(); fn __getit(_: Option<&mut Option>>) -> std::option::Option<&'static Foo> { __KEY.get(Default::default) //[mir]~^ ERROR call to unsafe function is unsafe //[thir]~^^ ERROR call to unsafe function `__ } static FOO: std::thread::LocalKey = std::thread::LocalKey::new(__getit); //[mir]~^ ERROR call to unsafe function is unsafe //[thir]~^^ ERROR call to unsafe function `LocalKey::::new` fn main() { FOO.with(|foo| println!("{}", foo.borrow())); std::thread::spawn(|| { FOO.with(|foo| *foo.borrow_mut() += "foo"); }) .join() .unwrap(); FOO.with(|foo| println!("{}", foo.borrow())); }