// ignore-windows: Concurrency on Windows is not supported yet. #![feature(core_intrinsics)] use std::intrinsics::atomic_store; use std::sync::atomic::AtomicUsize; use std::thread::spawn; #[derive(Copy, Clone)] struct EvilSend(pub T); unsafe impl Send for EvilSend {} unsafe impl Sync for EvilSend {} pub fn main() { let mut a = AtomicUsize::new(0); let b = &mut a as *mut AtomicUsize; let c = EvilSend(b); unsafe { let j1 = spawn(move || *(c.0 as *mut usize)); let j2 = spawn(move || { //Equivalent to: (&*c.0).store(32, Ordering::SeqCst) atomic_store(c.0 as *mut usize, 32); //~ ERROR Data race detected between Atomic Store on Thread(id = 2) and Read on Thread(id = 1) }); j1.join().unwrap(); j2.join().unwrap(); } }