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