// Copyright 2017 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. #![feature(const_fn)] #![feature(thread_local)] #![feature(cfg_target_thread_local, thread_local_internals)] 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() -> std::option::Option< &'static std::cell::UnsafeCell< std::option::Option>> { __KEY.get() //~ ERROR call to unsafe function requires unsafe } static FOO: std::thread::LocalKey = std::thread::LocalKey::new(__getit, Default::default); //~^ ERROR call to unsafe function requires unsafe 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())); }