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// void atomic_flag_clear_explicit(volatile atomic_flag*, memory_order);
17// void atomic_flag_clear_explicit(atomic_flag*, memory_order);
18
19#include <atomic>
20#include <cassert>
21
22int main()
23{
24    {
25        std::atomic_flag f;
26        f.test_and_set();
27        atomic_flag_clear_explicit(&f, std::memory_order_relaxed);
28        assert(f.test_and_set() == 0);
29    }
30    {
31        std::atomic_flag f;
32        f.test_and_set();
33        atomic_flag_clear_explicit(&f, std::memory_order_release);
34        assert(f.test_and_set() == 0);
35    }
36    {
37        std::atomic_flag f;
38        f.test_and_set();
39        atomic_flag_clear_explicit(&f, std::memory_order_seq_cst);
40        assert(f.test_and_set() == 0);
41    }
42    {
43        volatile std::atomic_flag f;
44        f.test_and_set();
45        atomic_flag_clear_explicit(&f, std::memory_order_relaxed);
46        assert(f.test_and_set() == 0);
47    }
48    {
49        volatile std::atomic_flag f;
50        f.test_and_set();
51        atomic_flag_clear_explicit(&f, std::memory_order_release);
52        assert(f.test_and_set() == 0);
53    }
54    {
55        volatile std::atomic_flag f;
56        f.test_and_set();
57        atomic_flag_clear_explicit(&f, std::memory_order_seq_cst);
58        assert(f.test_and_set() == 0);
59    }
60}
61