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