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