// ignore-wasm32 // revisions: mir thir // [thir]compile-flags: -Z thir-unsafeck #![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::local_impl::Key = std::thread::local_impl::Key::new(); #[cfg(not(target_thread_local))] static __KEY: std::thread::local_impl::Key = std::thread::local_impl::Key::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 `Key::::get` } 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())); }