]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/tests/ui/atomic_ordering_exchange.rs
Merge branch 'master' into hooks
[rust.git] / src / tools / clippy / tests / ui / atomic_ordering_exchange.rs
1 #![warn(clippy::invalid_atomic_ordering)]
2
3 use std::sync::atomic::{AtomicUsize, Ordering};
4
5 fn main() {
6     // `compare_exchange` (not weak) testing
7     let x = AtomicUsize::new(0);
8
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);
19
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);
26
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);
33
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);
37
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);
41
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);
45 }