From 79101aec3ad3070ad1378ca1450b72edf8ed67da Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Thu, 30 Sep 2010 21:05:29 +0000 Subject: [PATCH] [atomics.flag] completed. Initialization is not working on clang and can't be made to work without defaulted default constructors. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@115207 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/atomic | 2 +- .../atomics.flag/atomic_flag_clear.pass.cpp | 34 +++++++ .../atomic_flag_clear_explicit.pass.cpp | 70 ++++++++++++++ .../atomic_flag_test_and_set.pass.cpp | 34 +++++++ ...atomic_flag_test_and_set_explicit.pass.cpp | 94 +++++++++++++++++++ test/atomics/atomics.flag/clear.pass.cpp | 82 ++++++++++++++++ .../atomics/atomics.flag/copy_assign.fail.cpp | 24 +++++ test/atomics/atomics.flag/copy_ctor.fail.cpp | 23 +++++ .../copy_volatile_assign.fail.cpp | 24 +++++ test/atomics/atomics.flag/default.pass.cpp | 22 +++++ test/atomics/atomics.flag/init.pass.cpp | 23 +++++ .../atomics.flag/test_and_set.pass.cpp | 87 ++++++++++++++++- 12 files changed, 515 insertions(+), 4 deletions(-) create mode 100644 test/atomics/atomics.flag/atomic_flag_clear.pass.cpp create mode 100644 test/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp create mode 100644 test/atomics/atomics.flag/atomic_flag_test_and_set.pass.cpp create mode 100644 test/atomics/atomics.flag/atomic_flag_test_and_set_explicit.pass.cpp create mode 100644 test/atomics/atomics.flag/clear.pass.cpp create mode 100644 test/atomics/atomics.flag/copy_assign.fail.cpp create mode 100644 test/atomics/atomics.flag/copy_ctor.fail.cpp create mode 100644 test/atomics/atomics.flag/copy_volatile_assign.fail.cpp create mode 100644 test/atomics/atomics.flag/default.pass.cpp create mode 100644 test/atomics/atomics.flag/init.pass.cpp diff --git a/include/atomic b/include/atomic index 644c65c8..ee372fae 100644 --- a/include/atomic +++ b/include/atomic @@ -2556,7 +2556,7 @@ typedef struct _LIBCPP_VISIBLE atomic_flag atomic_flag() = default; #else _LIBCPP_INLINE_VISIBILITY - atomic_flag() : __flg_(false) {}; + atomic_flag() {}; #endif #ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS diff --git a/test/atomics/atomics.flag/atomic_flag_clear.pass.cpp b/test/atomics/atomics.flag/atomic_flag_clear.pass.cpp new file mode 100644 index 00000000..9c52bcc2 --- /dev/null +++ b/test/atomics/atomics.flag/atomic_flag_clear.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// struct atomic_flag + +// void atomic_flag_clear(volatile atomic_flag*); +// void atomic_flag_clear(atomic_flag*); + +#include +#include + +int main() +{ + { + std::atomic_flag f; + f.test_and_set(); + atomic_flag_clear(&f); + assert(f.test_and_set() == 0); + } + { + volatile std::atomic_flag f; + f.test_and_set(); + atomic_flag_clear(&f); + assert(f.test_and_set() == 0); + } +} diff --git a/test/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp b/test/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp new file mode 100644 index 00000000..af3573bf --- /dev/null +++ b/test/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp @@ -0,0 +1,70 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// struct atomic_flag + +// void atomic_flag_clear_explicit(volatile atomic_flag*, memory_order); +// void atomic_flag_clear_explicit(atomic_flag*, memory_order); + +#include +#include + +int main() +{ + { + std::atomic_flag f; + f.test_and_set(); + atomic_flag_clear_explicit(&f, std::memory_order_relaxed); + assert(f.test_and_set() == 0); + } + { + std::atomic_flag f; + f.test_and_set(); + atomic_flag_clear_explicit(&f, std::memory_order_consume); + assert(f.test_and_set() == 0); + } + { + std::atomic_flag f; + f.test_and_set(); + atomic_flag_clear_explicit(&f, std::memory_order_release); + assert(f.test_and_set() == 0); + } + { + std::atomic_flag f; + f.test_and_set(); + atomic_flag_clear_explicit(&f, std::memory_order_seq_cst); + assert(f.test_and_set() == 0); + } + { + volatile std::atomic_flag f; + f.test_and_set(); + atomic_flag_clear_explicit(&f, std::memory_order_relaxed); + assert(f.test_and_set() == 0); + } + { + volatile std::atomic_flag f; + f.test_and_set(); + atomic_flag_clear_explicit(&f, std::memory_order_consume); + assert(f.test_and_set() == 0); + } + { + volatile std::atomic_flag f; + f.test_and_set(); + atomic_flag_clear_explicit(&f, std::memory_order_release); + assert(f.test_and_set() == 0); + } + { + volatile std::atomic_flag f; + f.test_and_set(); + atomic_flag_clear_explicit(&f, std::memory_order_seq_cst); + assert(f.test_and_set() == 0); + } +} diff --git a/test/atomics/atomics.flag/atomic_flag_test_and_set.pass.cpp b/test/atomics/atomics.flag/atomic_flag_test_and_set.pass.cpp new file mode 100644 index 00000000..e89e5607 --- /dev/null +++ b/test/atomics/atomics.flag/atomic_flag_test_and_set.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// struct atomic_flag + +// bool atomic_flag_test_and_set(volatile atomic_flag*); +// bool atomic_flag_test_and_set(atomic_flag*); + +#include +#include + +int main() +{ + { + std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set(&f) == 0); + assert(f.test_and_set() == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set(&f) == 0); + assert(f.test_and_set() == 1); + } +} diff --git a/test/atomics/atomics.flag/atomic_flag_test_and_set_explicit.pass.cpp b/test/atomics/atomics.flag/atomic_flag_test_and_set_explicit.pass.cpp new file mode 100644 index 00000000..f98a4cf4 --- /dev/null +++ b/test/atomics/atomics.flag/atomic_flag_test_and_set_explicit.pass.cpp @@ -0,0 +1,94 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// struct atomic_flag + +// bool atomic_flag_test_and_set_explicit(volatile atomic_flag*, memory_order); +// bool atomic_flag_test_and_set_explicit(atomic_flag*, memory_order); + +#include +#include + +int main() +{ + { + std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_relaxed) == 0); + assert(f.test_and_set() == 1); + } + { + std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_consume) == 0); + assert(f.test_and_set() == 1); + } + { + std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acquire) == 0); + assert(f.test_and_set() == 1); + } + { + std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_release) == 0); + assert(f.test_and_set() == 1); + } + { + std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acq_rel) == 0); + assert(f.test_and_set() == 1); + } + { + std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_seq_cst) == 0); + assert(f.test_and_set() == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_relaxed) == 0); + assert(f.test_and_set() == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_consume) == 0); + assert(f.test_and_set() == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acquire) == 0); + assert(f.test_and_set() == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_release) == 0); + assert(f.test_and_set() == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_acq_rel) == 0); + assert(f.test_and_set() == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(atomic_flag_test_and_set_explicit(&f, std::memory_order_seq_cst) == 0); + assert(f.test_and_set() == 1); + } +} diff --git a/test/atomics/atomics.flag/clear.pass.cpp b/test/atomics/atomics.flag/clear.pass.cpp new file mode 100644 index 00000000..59c86a93 --- /dev/null +++ b/test/atomics/atomics.flag/clear.pass.cpp @@ -0,0 +1,82 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// struct atomic_flag + +// void clear(memory_order = memory_order_seq_cst); +// void clear(memory_order = memory_order_seq_cst) volatile; + +#include +#include + +int main() +{ + { + std::atomic_flag f; + f.test_and_set(); + f.clear(); + assert(f.test_and_set() == 0); + } + { + std::atomic_flag f; + f.test_and_set(); + f.clear(std::memory_order_relaxed); + assert(f.test_and_set() == 0); + } + { + std::atomic_flag f; + f.test_and_set(); + f.clear(std::memory_order_consume); + assert(f.test_and_set() == 0); + } + { + std::atomic_flag f; + f.test_and_set(); + f.clear(std::memory_order_release); + assert(f.test_and_set() == 0); + } + { + std::atomic_flag f; + f.test_and_set(); + f.clear(std::memory_order_seq_cst); + assert(f.test_and_set() == 0); + } + { + volatile std::atomic_flag f; + f.test_and_set(); + f.clear(); + assert(f.test_and_set() == 0); + } + { + volatile std::atomic_flag f; + f.test_and_set(); + f.clear(std::memory_order_relaxed); + assert(f.test_and_set() == 0); + } + { + volatile std::atomic_flag f; + f.test_and_set(); + f.clear(std::memory_order_consume); + assert(f.test_and_set() == 0); + } + { + volatile std::atomic_flag f; + f.test_and_set(); + f.clear(std::memory_order_release); + assert(f.test_and_set() == 0); + } + { + volatile std::atomic_flag f; + f.test_and_set(); + f.clear(std::memory_order_seq_cst); + assert(f.test_and_set() == 0); + } +} diff --git a/test/atomics/atomics.flag/copy_assign.fail.cpp b/test/atomics/atomics.flag/copy_assign.fail.cpp new file mode 100644 index 00000000..9d64a506 --- /dev/null +++ b/test/atomics/atomics.flag/copy_assign.fail.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// struct atomic_flag + +// atomic_flag& operator=(const atomic_flag&) = delete; + +#include +#include + +int main() +{ + std::atomic_flag f0; + std::atomic_flag f; + f = f0; +} diff --git a/test/atomics/atomics.flag/copy_ctor.fail.cpp b/test/atomics/atomics.flag/copy_ctor.fail.cpp new file mode 100644 index 00000000..169ace6d --- /dev/null +++ b/test/atomics/atomics.flag/copy_ctor.fail.cpp @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// struct atomic_flag + +// atomic_flag(const atomic_flag&) = delete; + +#include +#include + +int main() +{ + std::atomic_flag f0; + std::atomic_flag f(f0); +} diff --git a/test/atomics/atomics.flag/copy_volatile_assign.fail.cpp b/test/atomics/atomics.flag/copy_volatile_assign.fail.cpp new file mode 100644 index 00000000..3ceacb67 --- /dev/null +++ b/test/atomics/atomics.flag/copy_volatile_assign.fail.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// struct atomic_flag + +// atomic_flag& operator=(const atomic_flag&) = delete; + +#include +#include + +int main() +{ + std::atomic_flag f0; + volatile std::atomic_flag f; + f = f0; +} diff --git a/test/atomics/atomics.flag/default.pass.cpp b/test/atomics/atomics.flag/default.pass.cpp new file mode 100644 index 00000000..c882e03d --- /dev/null +++ b/test/atomics/atomics.flag/default.pass.cpp @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// struct atomic_flag + +// atomic_flag() = default; + +#include +#include + +int main() +{ + std::atomic_flag f; +} diff --git a/test/atomics/atomics.flag/init.pass.cpp b/test/atomics/atomics.flag/init.pass.cpp new file mode 100644 index 00000000..24cb8547 --- /dev/null +++ b/test/atomics/atomics.flag/init.pass.cpp @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// struct atomic_flag + +// atomic_flag() = ATOMIC_FLAG_INIT; + +#include +#include + +int main() +{ + std::atomic_flag f = ATOMIC_FLAG_INIT; + assert(f.test_and_set() == 0); +} diff --git a/test/atomics/atomics.flag/test_and_set.pass.cpp b/test/atomics/atomics.flag/test_and_set.pass.cpp index cf2b5d70..5bdd32da 100644 --- a/test/atomics/atomics.flag/test_and_set.pass.cpp +++ b/test/atomics/atomics.flag/test_and_set.pass.cpp @@ -19,7 +19,88 @@ int main() { - std::atomic_flag f; - assert(f.test_and_set() == 0); - assert(f.test_and_set() == 1); + { + std::atomic_flag f; + f.clear(); + assert(f.test_and_set() == 0); + assert(f.test_and_set() == 1); + } + { + std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_relaxed) == 0); + assert(f.test_and_set(std::memory_order_relaxed) == 1); + } + { + std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_consume) == 0); + assert(f.test_and_set(std::memory_order_consume) == 1); + } + { + std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_acquire) == 0); + assert(f.test_and_set(std::memory_order_acquire) == 1); + } + { + std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_release) == 0); + assert(f.test_and_set(std::memory_order_release) == 1); + } + { + std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_acq_rel) == 0); + assert(f.test_and_set(std::memory_order_acq_rel) == 1); + } + { + std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_seq_cst) == 0); + assert(f.test_and_set(std::memory_order_seq_cst) == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(f.test_and_set() == 0); + assert(f.test_and_set() == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_relaxed) == 0); + assert(f.test_and_set(std::memory_order_relaxed) == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_consume) == 0); + assert(f.test_and_set(std::memory_order_consume) == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_acquire) == 0); + assert(f.test_and_set(std::memory_order_acquire) == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_release) == 0); + assert(f.test_and_set(std::memory_order_release) == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_acq_rel) == 0); + assert(f.test_and_set(std::memory_order_acq_rel) == 1); + } + { + volatile std::atomic_flag f; + f.clear(); + assert(f.test_and_set(std::memory_order_seq_cst) == 0); + assert(f.test_and_set(std::memory_order_seq_cst) == 1); + } }