82 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// 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; // uninitialized25 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