1 #![warn(clippy::invalid_atomic_ordering)]
3 use std::sync::atomic::{AtomicIsize, Ordering};
6 // `fetch_update` testing
7 let x = AtomicIsize::new(0);
9 // Allowed ordering combos
10 let _ = x.fetch_update(Ordering::Relaxed, Ordering::Relaxed, |old| Some(old + 1));
11 let _ = x.fetch_update(Ordering::Acquire, Ordering::Acquire, |old| Some(old + 1));
12 let _ = x.fetch_update(Ordering::Acquire, Ordering::Relaxed, |old| Some(old + 1));
13 let _ = x.fetch_update(Ordering::Release, Ordering::Relaxed, |old| Some(old + 1));
14 let _ = x.fetch_update(Ordering::AcqRel, Ordering::Acquire, |old| Some(old + 1));
15 let _ = x.fetch_update(Ordering::AcqRel, Ordering::Relaxed, |old| Some(old + 1));
16 let _ = x.fetch_update(Ordering::SeqCst, Ordering::Relaxed, |old| Some(old + 1));
17 let _ = x.fetch_update(Ordering::SeqCst, Ordering::Acquire, |old| Some(old + 1));
18 let _ = x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |old| Some(old + 1));
20 // AcqRel is always forbidden as a failure ordering
21 let _ = x.fetch_update(Ordering::Relaxed, Ordering::AcqRel, |old| Some(old + 1));
22 let _ = x.fetch_update(Ordering::Acquire, Ordering::AcqRel, |old| Some(old + 1));
23 let _ = x.fetch_update(Ordering::Release, Ordering::AcqRel, |old| Some(old + 1));
24 let _ = x.fetch_update(Ordering::AcqRel, Ordering::AcqRel, |old| Some(old + 1));
25 let _ = x.fetch_update(Ordering::SeqCst, Ordering::AcqRel, |old| Some(old + 1));
27 // Release is always forbidden as a failure ordering
28 let _ = x.fetch_update(Ordering::Relaxed, Ordering::Release, |old| Some(old + 1));
29 let _ = x.fetch_update(Ordering::Acquire, Ordering::Release, |old| Some(old + 1));
30 let _ = x.fetch_update(Ordering::Release, Ordering::Release, |old| Some(old + 1));
31 let _ = x.fetch_update(Ordering::AcqRel, Ordering::Release, |old| Some(old + 1));
32 let _ = x.fetch_update(Ordering::SeqCst, Ordering::Release, |old| Some(old + 1));
34 // Release success order forbids failure order of Acquire or SeqCst
35 let _ = x.fetch_update(Ordering::Release, Ordering::Acquire, |old| Some(old + 1));
36 let _ = x.fetch_update(Ordering::Release, Ordering::SeqCst, |old| Some(old + 1));
38 // Relaxed success order also forbids failure order of Acquire or SeqCst
39 let _ = x.fetch_update(Ordering::Relaxed, Ordering::SeqCst, |old| Some(old + 1));
40 let _ = x.fetch_update(Ordering::Relaxed, Ordering::Acquire, |old| Some(old + 1));
42 // Acquire/AcqRel forbids failure order of SeqCst
43 let _ = x.fetch_update(Ordering::Acquire, Ordering::SeqCst, |old| Some(old + 1));
44 let _ = x.fetch_update(Ordering::AcqRel, Ordering::SeqCst, |old| Some(old + 1));