]> git.lizzy.rs Git - rust.git/blob - src/tools/miri/tests/fail/data_race/atomic_write_na_read_race2.rs
Rollup merge of #101717 - Pointerbender:unsafecell-memory-layout, r=Amanieu
[rust.git] / src / tools / miri / tests / fail / data_race / atomic_write_na_read_race2.rs
1 // We want to control preemption here.
2 //@compile-flags: -Zmiri-preemption-rate=0
3
4 use std::sync::atomic::{AtomicUsize, Ordering};
5 use std::thread::spawn;
6
7 #[derive(Copy, Clone)]
8 struct EvilSend<T>(pub T);
9
10 unsafe impl<T> Send for EvilSend<T> {}
11 unsafe impl<T> Sync for EvilSend<T> {}
12
13 pub fn main() {
14     let mut a = AtomicUsize::new(0);
15     let b = &mut a as *mut AtomicUsize;
16     let c = EvilSend(b);
17     unsafe {
18         let j1 = spawn(move || {
19             let _val = *(c.0 as *mut usize);
20         });
21
22         let j2 = spawn(move || {
23             (&*c.0).store(32, Ordering::SeqCst); //~ ERROR: Data race detected between Atomic Store on thread `<unnamed>` and Read on thread `<unnamed>`
24         });
25
26         j1.join().unwrap();
27         j2.join().unwrap();
28     }
29 }