2 use std::sync::atomic::{AtomicIsize, Ordering};
5 // `fetch_update` testing
6 let x = AtomicIsize::new(0);
8 // Allowed ordering combos
9 let _ = x.fetch_update(Ordering::Relaxed, Ordering::Relaxed, |old| Some(old + 1));
10 let _ = x.fetch_update(Ordering::Relaxed, Ordering::Acquire, |old| Some(old + 1));
11 let _ = x.fetch_update(Ordering::Relaxed, Ordering::SeqCst, |old| Some(old + 1));
12 let _ = x.fetch_update(Ordering::Acquire, Ordering::Relaxed, |old| Some(old + 1));
13 let _ = x.fetch_update(Ordering::Acquire, Ordering::Acquire, |old| Some(old + 1));
14 let _ = x.fetch_update(Ordering::Acquire, Ordering::SeqCst, |old| Some(old + 1));
15 let _ = x.fetch_update(Ordering::Release, Ordering::Relaxed, |old| Some(old + 1));
16 let _ = x.fetch_update(Ordering::Release, Ordering::Acquire, |old| Some(old + 1));
17 let _ = x.fetch_update(Ordering::Release, Ordering::SeqCst, |old| Some(old + 1));
18 let _ = x.fetch_update(Ordering::AcqRel, Ordering::Relaxed, |old| Some(old + 1));
19 let _ = x.fetch_update(Ordering::AcqRel, Ordering::Acquire, |old| Some(old + 1));
20 let _ = x.fetch_update(Ordering::AcqRel, Ordering::SeqCst, |old| Some(old + 1));
21 let _ = x.fetch_update(Ordering::SeqCst, Ordering::Relaxed, |old| Some(old + 1));
22 let _ = x.fetch_update(Ordering::SeqCst, Ordering::Acquire, |old| Some(old + 1));
23 let _ = x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |old| Some(old + 1));
25 // AcqRel is always forbidden as a failure ordering
26 let _ = x.fetch_update(Ordering::Relaxed, Ordering::AcqRel, |old| Some(old + 1));
27 //~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
28 let _ = x.fetch_update(Ordering::Acquire, Ordering::AcqRel, |old| Some(old + 1));
29 //~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
30 let _ = x.fetch_update(Ordering::Release, Ordering::AcqRel, |old| Some(old + 1));
31 //~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
32 let _ = x.fetch_update(Ordering::AcqRel, Ordering::AcqRel, |old| Some(old + 1));
33 //~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
34 let _ = x.fetch_update(Ordering::SeqCst, Ordering::AcqRel, |old| Some(old + 1));
35 //~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
37 // Release is always forbidden as a failure ordering
38 let _ = x.fetch_update(Ordering::Relaxed, Ordering::Release, |old| Some(old + 1));
39 //~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
40 let _ = x.fetch_update(Ordering::Acquire, Ordering::Release, |old| Some(old + 1));
41 //~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
42 let _ = x.fetch_update(Ordering::Release, Ordering::Release, |old| Some(old + 1));
43 //~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
44 let _ = x.fetch_update(Ordering::AcqRel, Ordering::Release, |old| Some(old + 1));
45 //~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
46 let _ = x.fetch_update(Ordering::SeqCst, Ordering::Release, |old| Some(old + 1));
47 //~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`