brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · f2a5632 Raw
114 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 atomic_flag_test_explicit(volatile atomic_flag*, memory_order);14// bool atomic_flag_test_explicit(atomic_flag*, memory_order);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(std::atomic_flag_test_explicit(&f, std::memory_order_relaxed) == 0);27        assert(f.test_and_set() == 0);28        assert(std::atomic_flag_test_explicit(&f, std::memory_order_relaxed) == 1);29    }30    {31        std::atomic_flag f;32        f.clear();33        assert(std::atomic_flag_test_explicit(&f, std::memory_order_consume) == 0);34        assert(f.test_and_set() == 0);35        assert(std::atomic_flag_test_explicit(&f, std::memory_order_consume) == 1);36    }37    {38        std::atomic_flag f;39        f.clear();40        assert(std::atomic_flag_test_explicit(&f, std::memory_order_acquire) == 0);41        assert(f.test_and_set() == 0);42        assert(std::atomic_flag_test_explicit(&f, std::memory_order_acquire) == 1);43    }44#ifdef _LIBCPP_VERSION // Don't violate precondition [atomics.flag]/645    {46        std::atomic_flag f;47        f.clear();48        assert(std::atomic_flag_test_explicit(&f, std::memory_order_release) == 0);49        assert(f.test_and_set() == 0);50        assert(std::atomic_flag_test_explicit(&f, std::memory_order_release) == 1);51    }52    {53        std::atomic_flag f;54        f.clear();55        assert(std::atomic_flag_test_explicit(&f, std::memory_order_acq_rel) == 0);56        assert(f.test_and_set() == 0);57        assert(std::atomic_flag_test_explicit(&f, std::memory_order_acq_rel) == 1);58    }59#endif // _LIBCPP_VERSION60    {61        std::atomic_flag f;62        f.clear();63        assert(std::atomic_flag_test_explicit(&f, std::memory_order_seq_cst) == 0);64        assert(f.test_and_set() == 0);65        assert(std::atomic_flag_test_explicit(&f, std::memory_order_seq_cst) == 1);66    }67    {68        volatile std::atomic_flag f;69        f.clear();70        assert(std::atomic_flag_test_explicit(&f, std::memory_order_relaxed) == 0);71        assert(f.test_and_set() == 0);72        assert(std::atomic_flag_test_explicit(&f, std::memory_order_relaxed) == 1);73    }74    {75        volatile std::atomic_flag f;76        f.clear();77        assert(std::atomic_flag_test_explicit(&f, std::memory_order_consume) == 0);78        assert(f.test_and_set() == 0);79        assert(std::atomic_flag_test_explicit(&f, std::memory_order_consume) == 1);80    }81    {82        volatile std::atomic_flag f;83        f.clear();84        assert(std::atomic_flag_test_explicit(&f, std::memory_order_acquire) == 0);85        assert(f.test_and_set() == 0);86        assert(std::atomic_flag_test_explicit(&f, std::memory_order_acquire) == 1);87    }88#ifdef _LIBCPP_VERSION // Don't violate precondition [atomics.flag]/689    {90        volatile std::atomic_flag f;91        f.clear();92        assert(std::atomic_flag_test_explicit(&f, std::memory_order_release) == 0);93        assert(f.test_and_set() == 0);94        assert(std::atomic_flag_test_explicit(&f, std::memory_order_release) == 1);95    }96    {97        volatile std::atomic_flag f;98        f.clear();99        assert(std::atomic_flag_test_explicit(&f, std::memory_order_acq_rel) == 0);100        assert(f.test_and_set() == 0);101        assert(std::atomic_flag_test_explicit(&f, std::memory_order_acq_rel) == 1);102    }103#endif // _LIBCPP_VERSION104    {105        volatile std::atomic_flag f;106        f.clear();107        assert(std::atomic_flag_test_explicit(&f, std::memory_order_seq_cst) == 0);108        assert(f.test_and_set() == 0);109        assert(std::atomic_flag_test_explicit(&f, std::memory_order_seq_cst) == 1);110    }111 112    return 0;113}114