// We want to control preemption here. //@compile-flags: -Zmiri-preemption-rate=0 //@ignore-target-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) = 32; }); let j2 = spawn(move || { //Equivalent to: (&*c.0).store(64, Ordering::SeqCst) atomic_store(c.0 as *mut usize, 64); //~ ERROR: Data race detected between Atomic Store on thread `` and Write on thread `` }); j1.join().unwrap(); j2.join().unwrap(); } }