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 main(int,char **)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(std::memory_order_relaxed); 33 assert(f.test_and_set() == 0); 34 f.clear(std::memory_order_relaxed); 35 assert(f.test_and_set() == 0); 36 } 37 { 38 std::atomic_flag f; 39 f.clear(std::memory_order_release); 40 assert(f.test_and_set() == 0); 41 f.clear(std::memory_order_release); 42 assert(f.test_and_set() == 0); 43 } 44 { 45 std::atomic_flag f; 46 f.clear(std::memory_order_seq_cst); 47 assert(f.test_and_set() == 0); 48 f.clear(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(std::memory_order_relaxed); 61 assert(f.test_and_set() == 0); 62 f.clear(std::memory_order_relaxed); 63 assert(f.test_and_set() == 0); 64 } 65 { 66 volatile std::atomic_flag f; 67 f.clear(std::memory_order_release); 68 assert(f.test_and_set() == 0); 69 f.clear(std::memory_order_release); 70 assert(f.test_and_set() == 0); 71 } 72 { 73 volatile std::atomic_flag f; 74 f.clear(std::memory_order_seq_cst); 75 assert(f.test_and_set() == 0); 76 f.clear(std::memory_order_seq_cst); 77 assert(f.test_and_set() == 0); 78 } 79 80 return 0; 81 } 82