1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // UNSUPPORTED: libcpp-has-no-threads
11 
12 // <atomic>
13 
14 // struct atomic_flag
15 
16 // bool atomic_flag_test_and_set_explicit(volatile atomic_flag*, memory_order);
17 // bool atomic_flag_test_and_set_explicit(atomic_flag*, memory_order);
18 
19 #include <atomic>
20 #include <cassert>
21 
main()22 int main()
23 {
24     {
25         std::atomic_flag f;
26         f.clear();
27         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_relaxed) == 0);
28         assert(f.test_and_set() == 1);
29     }
30     {
31         std::atomic_flag f;
32         f.clear();
33         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_consume) == 0);
34         assert(f.test_and_set() == 1);
35     }
36     {
37         std::atomic_flag f;
38         f.clear();
39         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acquire) == 0);
40         assert(f.test_and_set() == 1);
41     }
42     {
43         std::atomic_flag f;
44         f.clear();
45         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_release) == 0);
46         assert(f.test_and_set() == 1);
47     }
48     {
49         std::atomic_flag f;
50         f.clear();
51         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acq_rel) == 0);
52         assert(f.test_and_set() == 1);
53     }
54     {
55         std::atomic_flag f;
56         f.clear();
57         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_seq_cst) == 0);
58         assert(f.test_and_set() == 1);
59     }
60     {
61         volatile std::atomic_flag f;
62         f.clear();
63         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_relaxed) == 0);
64         assert(f.test_and_set() == 1);
65     }
66     {
67         volatile std::atomic_flag f;
68         f.clear();
69         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_consume) == 0);
70         assert(f.test_and_set() == 1);
71     }
72     {
73         volatile std::atomic_flag f;
74         f.clear();
75         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acquire) == 0);
76         assert(f.test_and_set() == 1);
77     }
78     {
79         volatile std::atomic_flag f;
80         f.clear();
81         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_release) == 0);
82         assert(f.test_and_set() == 1);
83     }
84     {
85         volatile std::atomic_flag f;
86         f.clear();
87         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acq_rel) == 0);
88         assert(f.test_and_set() == 1);
89     }
90     {
91         volatile std::atomic_flag f;
92         f.clear();
93         assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_seq_cst) == 0);
94         assert(f.test_and_set() == 1);
95     }
96 }
97