1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// <atomic>
10
11// struct atomic_flag
12
13// void clear(memory_order = memory_order_seq_cst);
14// void clear(memory_order = memory_order_seq_cst) volatile;
15
16#include <atomic>
17#include <cassert>
18
19#include "test_macros.h"
20
21int main(int, char**)
22{
23 {
24 std::atomic_flag f; // uninitialized
25 f.clear();
26 assert(f.test_and_set() == 0);
27 f.clear();
28 assert(f.test_and_set() == 0);
29 }
30 {
31 std::atomic_flag f;
32 f.clear(m: std::memory_order_relaxed);
33 assert(f.test_and_set() == 0);
34 f.clear(m: std::memory_order_relaxed);
35 assert(f.test_and_set() == 0);
36 }
37 {
38 std::atomic_flag f;
39 f.clear(m: std::memory_order_release);
40 assert(f.test_and_set() == 0);
41 f.clear(m: std::memory_order_release);
42 assert(f.test_and_set() == 0);
43 }
44 {
45 std::atomic_flag f;
46 f.clear(m: std::memory_order_seq_cst);
47 assert(f.test_and_set() == 0);
48 f.clear(m: std::memory_order_seq_cst);
49 assert(f.test_and_set() == 0);
50 }
51 {
52 volatile std::atomic_flag f;
53 f.clear();
54 assert(f.test_and_set() == 0);
55 f.clear();
56 assert(f.test_and_set() == 0);
57 }
58 {
59 volatile std::atomic_flag f;
60 f.clear(m: std::memory_order_relaxed);
61 assert(f.test_and_set() == 0);
62 f.clear(m: std::memory_order_relaxed);
63 assert(f.test_and_set() == 0);
64 }
65 {
66 volatile std::atomic_flag f;
67 f.clear(m: std::memory_order_release);
68 assert(f.test_and_set() == 0);
69 f.clear(m: std::memory_order_release);
70 assert(f.test_and_set() == 0);
71 }
72 {
73 volatile std::atomic_flag f;
74 f.clear(m: std::memory_order_seq_cst);
75 assert(f.test_and_set() == 0);
76 f.clear(m: std::memory_order_seq_cst);
77 assert(f.test_and_set() == 0);
78 }
79
80 return 0;
81}
82

source code of libcxx/test/std/atomics/atomics.flag/clear.pass.cpp