xref: /llvm-project/libcxx/test/std/atomics/atomics.flag/atomic_flag_test_explicit.pass.cpp (revision f033bf88b4e22795dba19235b299ceebd34449b7)
1fc4bff0cSOlivier Giroux //===----------------------------------------------------------------------===//
2fc4bff0cSOlivier Giroux //
3fc4bff0cSOlivier Giroux // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fc4bff0cSOlivier Giroux // See https://llvm.org/LICENSE.txt for license information.
5fc4bff0cSOlivier Giroux // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fc4bff0cSOlivier Giroux //
7fc4bff0cSOlivier Giroux //===----------------------------------------------------------------------===//
8fc4bff0cSOlivier Giroux 
9fc4bff0cSOlivier Giroux // <atomic>
10fc4bff0cSOlivier Giroux 
11fc4bff0cSOlivier Giroux // struct atomic_flag
12fc4bff0cSOlivier Giroux 
13fc4bff0cSOlivier Giroux // bool atomic_flag_test_explicit(volatile atomic_flag*, memory_order);
14fc4bff0cSOlivier Giroux // bool atomic_flag_test_explicit(atomic_flag*, memory_order);
15fc4bff0cSOlivier Giroux 
16fc4bff0cSOlivier Giroux #include <atomic>
17fc4bff0cSOlivier Giroux #include <cassert>
18fc4bff0cSOlivier Giroux 
19fc4bff0cSOlivier Giroux #include "test_macros.h"
20fc4bff0cSOlivier Giroux 
main(int,char **)21fc4bff0cSOlivier Giroux int main(int, char**)
22fc4bff0cSOlivier Giroux {
23fc4bff0cSOlivier Giroux     {
24fc4bff0cSOlivier Giroux         std::atomic_flag f;
25fc4bff0cSOlivier Giroux         f.clear();
26*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_relaxed) == 0);
27fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
28*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_relaxed) == 1);
29fc4bff0cSOlivier Giroux     }
30fc4bff0cSOlivier Giroux     {
31fc4bff0cSOlivier Giroux         std::atomic_flag f;
32fc4bff0cSOlivier Giroux         f.clear();
33*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_consume) == 0);
34fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
35*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_consume) == 1);
36fc4bff0cSOlivier Giroux     }
37fc4bff0cSOlivier Giroux     {
38fc4bff0cSOlivier Giroux         std::atomic_flag f;
39fc4bff0cSOlivier Giroux         f.clear();
40*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_acquire) == 0);
41fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
42*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_acquire) == 1);
43fc4bff0cSOlivier Giroux     }
4487776657SCasey Carter #ifdef _LIBCPP_VERSION // Don't violate precondition [atomics.flag]/6
45fc4bff0cSOlivier Giroux     {
46fc4bff0cSOlivier Giroux         std::atomic_flag f;
47fc4bff0cSOlivier Giroux         f.clear();
48*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_release) == 0);
49fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
50*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_release) == 1);
51fc4bff0cSOlivier Giroux     }
52fc4bff0cSOlivier Giroux     {
53fc4bff0cSOlivier Giroux         std::atomic_flag f;
54fc4bff0cSOlivier Giroux         f.clear();
55*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_acq_rel) == 0);
56fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
57*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_acq_rel) == 1);
58fc4bff0cSOlivier Giroux     }
5987776657SCasey Carter #endif // _LIBCPP_VERSION
60fc4bff0cSOlivier Giroux     {
61fc4bff0cSOlivier Giroux         std::atomic_flag f;
62fc4bff0cSOlivier Giroux         f.clear();
63*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_seq_cst) == 0);
64fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
65*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_seq_cst) == 1);
66fc4bff0cSOlivier Giroux     }
67fc4bff0cSOlivier Giroux     {
68fc4bff0cSOlivier Giroux         volatile std::atomic_flag f;
69fc4bff0cSOlivier Giroux         f.clear();
70*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_relaxed) == 0);
71fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
72*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_relaxed) == 1);
73fc4bff0cSOlivier Giroux     }
74fc4bff0cSOlivier Giroux     {
75fc4bff0cSOlivier Giroux         volatile std::atomic_flag f;
76fc4bff0cSOlivier Giroux         f.clear();
77*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_consume) == 0);
78fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
79*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_consume) == 1);
80fc4bff0cSOlivier Giroux     }
81fc4bff0cSOlivier Giroux     {
82fc4bff0cSOlivier Giroux         volatile std::atomic_flag f;
83fc4bff0cSOlivier Giroux         f.clear();
84*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_acquire) == 0);
85fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
86*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_acquire) == 1);
87fc4bff0cSOlivier Giroux     }
8887776657SCasey Carter #ifdef _LIBCPP_VERSION // Don't violate precondition [atomics.flag]/6
89fc4bff0cSOlivier Giroux     {
90fc4bff0cSOlivier Giroux         volatile std::atomic_flag f;
91fc4bff0cSOlivier Giroux         f.clear();
92*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_release) == 0);
93fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
94*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_release) == 1);
95fc4bff0cSOlivier Giroux     }
96fc4bff0cSOlivier Giroux     {
97fc4bff0cSOlivier Giroux         volatile std::atomic_flag f;
98fc4bff0cSOlivier Giroux         f.clear();
99*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_acq_rel) == 0);
100fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
101*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_acq_rel) == 1);
102fc4bff0cSOlivier Giroux     }
10387776657SCasey Carter #endif // _LIBCPP_VERSION
104fc4bff0cSOlivier Giroux     {
105fc4bff0cSOlivier Giroux         volatile std::atomic_flag f;
106fc4bff0cSOlivier Giroux         f.clear();
107*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_seq_cst) == 0);
108fc4bff0cSOlivier Giroux         assert(f.test_and_set() == 0);
109*f033bf88SArthur O'Dwyer         assert(std::atomic_flag_test_explicit(&f, std::memory_order_seq_cst) == 1);
110fc4bff0cSOlivier Giroux     }
111fc4bff0cSOlivier Giroux 
112fc4bff0cSOlivier Giroux     return 0;
113fc4bff0cSOlivier Giroux }
114