110 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// <atomic>10 11// struct atomic_flag12 13// bool test_and_set(memory_order = memory_order_seq_cst);14// bool test_and_set(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;25 f.clear();26 assert(f.test_and_set() == 0);27 assert(f.test_and_set() == 1);28 }29 {30 std::atomic_flag f;31 f.clear();32 assert(f.test_and_set(std::memory_order_relaxed) == 0);33 assert(f.test_and_set(std::memory_order_relaxed) == 1);34 }35 {36 std::atomic_flag f;37 f.clear();38 assert(f.test_and_set(std::memory_order_consume) == 0);39 assert(f.test_and_set(std::memory_order_consume) == 1);40 }41 {42 std::atomic_flag f;43 f.clear();44 assert(f.test_and_set(std::memory_order_acquire) == 0);45 assert(f.test_and_set(std::memory_order_acquire) == 1);46 }47 {48 std::atomic_flag f;49 f.clear();50 assert(f.test_and_set(std::memory_order_release) == 0);51 assert(f.test_and_set(std::memory_order_release) == 1);52 }53 {54 std::atomic_flag f;55 f.clear();56 assert(f.test_and_set(std::memory_order_acq_rel) == 0);57 assert(f.test_and_set(std::memory_order_acq_rel) == 1);58 }59 {60 std::atomic_flag f;61 f.clear();62 assert(f.test_and_set(std::memory_order_seq_cst) == 0);63 assert(f.test_and_set(std::memory_order_seq_cst) == 1);64 }65 {66 volatile std::atomic_flag f;67 f.clear();68 assert(f.test_and_set() == 0);69 assert(f.test_and_set() == 1);70 }71 {72 volatile std::atomic_flag f;73 f.clear();74 assert(f.test_and_set(std::memory_order_relaxed) == 0);75 assert(f.test_and_set(std::memory_order_relaxed) == 1);76 }77 {78 volatile std::atomic_flag f;79 f.clear();80 assert(f.test_and_set(std::memory_order_consume) == 0);81 assert(f.test_and_set(std::memory_order_consume) == 1);82 }83 {84 volatile std::atomic_flag f;85 f.clear();86 assert(f.test_and_set(std::memory_order_acquire) == 0);87 assert(f.test_and_set(std::memory_order_acquire) == 1);88 }89 {90 volatile std::atomic_flag f;91 f.clear();92 assert(f.test_and_set(std::memory_order_release) == 0);93 assert(f.test_and_set(std::memory_order_release) == 1);94 }95 {96 volatile std::atomic_flag f;97 f.clear();98 assert(f.test_and_set(std::memory_order_acq_rel) == 0);99 assert(f.test_and_set(std::memory_order_acq_rel) == 1);100 }101 {102 volatile std::atomic_flag f;103 f.clear();104 assert(f.test_and_set(std::memory_order_seq_cst) == 0);105 assert(f.test_and_set(std::memory_order_seq_cst) == 1);106 }107 108 return 0;109}110