1 // only-x86_64
2 use std::sync::atomic::{AtomicPtr, Ordering};
3
main()4 fn main() {
5 let ptr = &mut 5;
6 let ptr2 = &mut 10;
7 // `compare_exchange_weak` testing
8 let x = AtomicPtr::new(ptr);
9
10 // Allowed ordering combos
11 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::Relaxed);
12 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Acquire, Ordering::Acquire);
13 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Acquire, Ordering::Relaxed);
14 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Release, Ordering::Relaxed);
15 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::AcqRel, Ordering::Acquire);
16 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::AcqRel, Ordering::Relaxed);
17 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::Relaxed);
18 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::Acquire);
19 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::SeqCst);
20
21 // AcqRel is always forbidden as a failure ordering
22 let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Relaxed, Ordering::AcqRel);
23 //~^ ERROR compare_exchange_weak's failure ordering may not be `Release` or `AcqRel`
24 let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Acquire, Ordering::AcqRel);
25 //~^ ERROR compare_exchange_weak's failure ordering may not be `Release` or `AcqRel`
26 let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::AcqRel);
27 //~^ ERROR compare_exchange_weak's failure ordering may not be `Release` or `AcqRel`
28 let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::AcqRel, Ordering::AcqRel);
29 //~^ ERROR compare_exchange_weak's failure ordering may not be `Release` or `AcqRel`
30 let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::SeqCst, Ordering::AcqRel);
31 //~^ ERROR compare_exchange_weak's failure ordering may not be `Release` or `AcqRel`
32
33 // Release is always forbidden as a failure ordering
34 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::Release);
35 //~^ ERROR compare_exchange_weak's failure ordering may not be `Release` or `AcqRel`
36 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Acquire, Ordering::Release);
37 //~^ ERROR compare_exchange_weak's failure ordering may not be `Release` or `AcqRel`
38 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Release, Ordering::Release);
39 //~^ ERROR compare_exchange_weak's failure ordering may not be `Release` or `AcqRel`
40 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::AcqRel, Ordering::Release);
41 //~^ ERROR compare_exchange_weak's failure ordering may not be `Release` or `AcqRel`
42 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::Release);
43 //~^ ERROR compare_exchange_weak's failure ordering may not be `Release` or `AcqRel`
44
45 // Release success order forbids failure order of Acquire or SeqCst
46 let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::Acquire);
47 //~^ ERROR compare_exchange_weak's failure ordering may not be stronger
48 let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::SeqCst);
49 //~^ ERROR compare_exchange_weak's failure ordering may not be stronger
50
51 // Relaxed success order also forbids failure order of Acquire or SeqCst
52 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::SeqCst);
53 //~^ ERROR compare_exchange_weak's failure ordering may not be stronger
54 let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::Acquire);
55 //~^ ERROR compare_exchange_weak's failure ordering may not be stronger
56
57 // Acquire/AcqRel forbids failure order of SeqCst
58 let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Acquire, Ordering::SeqCst);
59 //~^ ERROR compare_exchange_weak's failure ordering may not be stronger
60 let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::AcqRel, Ordering::SeqCst);
61 //~^ ERROR compare_exchange_weak's failure ordering may not be stronger
62 }
63