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 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