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// <atomic>
11
12// struct atomic_flag
13
14// bool atomic_flag_test_and_set_explicit(volatile atomic_flag*, memory_order);
15// bool atomic_flag_test_and_set_explicit(atomic_flag*, memory_order);
16
17#include <atomic>
18#include <cassert>
19
20int main()
21{
22    {
23        std::atomic_flag f;
24        f.clear();
25        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_relaxed) == 0);
26        assert(f.test_and_set() == 1);
27    }
28    {
29        std::atomic_flag f;
30        f.clear();
31        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_consume) == 0);
32        assert(f.test_and_set() == 1);
33    }
34    {
35        std::atomic_flag f;
36        f.clear();
37        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acquire) == 0);
38        assert(f.test_and_set() == 1);
39    }
40    {
41        std::atomic_flag f;
42        f.clear();
43        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_release) == 0);
44        assert(f.test_and_set() == 1);
45    }
46    {
47        std::atomic_flag f;
48        f.clear();
49        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acq_rel) == 0);
50        assert(f.test_and_set() == 1);
51    }
52    {
53        std::atomic_flag f;
54        f.clear();
55        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_seq_cst) == 0);
56        assert(f.test_and_set() == 1);
57    }
58    {
59        volatile std::atomic_flag f;
60        f.clear();
61        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_relaxed) == 0);
62        assert(f.test_and_set() == 1);
63    }
64    {
65        volatile std::atomic_flag f;
66        f.clear();
67        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_consume) == 0);
68        assert(f.test_and_set() == 1);
69    }
70    {
71        volatile std::atomic_flag f;
72        f.clear();
73        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acquire) == 0);
74        assert(f.test_and_set() == 1);
75    }
76    {
77        volatile std::atomic_flag f;
78        f.clear();
79        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_release) == 0);
80        assert(f.test_and_set() == 1);
81    }
82    {
83        volatile std::atomic_flag f;
84        f.clear();
85        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acq_rel) == 0);
86        assert(f.test_and_set() == 1);
87    }
88    {
89        volatile std::atomic_flag f;
90        f.clear();
91        assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_seq_cst) == 0);
92        assert(f.test_and_set() == 1);
93    }
94}
95