diff options
12 files changed, 515 insertions, 4 deletions
diff --git a/libcxx/include/atomic b/libcxx/include/atomic index 644c65c8154..ee372fae361 100644 --- a/libcxx/include/atomic +++ b/libcxx/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/libcxx/test/atomics/atomics.flag/atomic_flag_clear.pass.cpp b/libcxx/test/atomics/atomics.flag/atomic_flag_clear.pass.cpp new file mode 100644 index 00000000000..9c52bcc2dd9 --- /dev/null +++ b/libcxx/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. +// +//===----------------------------------------------------------------------===// + +// <atomic> + +// struct atomic_flag + +// void atomic_flag_clear(volatile atomic_flag*); +// void atomic_flag_clear(atomic_flag*); + +#include <atomic> +#include <cassert> + +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/libcxx/test/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp b/libcxx/test/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp new file mode 100644 index 00000000000..af3573bf9fd --- /dev/null +++ b/libcxx/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. +// +//===----------------------------------------------------------------------===// + +// <atomic> + +// struct atomic_flag + +// void atomic_flag_clear_explicit(volatile atomic_flag*, memory_order); +// void atomic_flag_clear_explicit(atomic_flag*, memory_order); + +#include <atomic> +#include <cassert> + +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/libcxx/test/atomics/atomics.flag/atomic_flag_test_and_set.pass.cpp b/libcxx/test/atomics/atomics.flag/atomic_flag_test_and_set.pass.cpp new file mode 100644 index 00000000000..e89e5607c8b --- /dev/null +++ b/libcxx/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. +// +//===----------------------------------------------------------------------===// + +// <atomic> + +// struct atomic_flag + +// bool atomic_flag_test_and_set(volatile atomic_flag*); +// bool atomic_flag_test_and_set(atomic_flag*); + +#include <atomic> +#include <cassert> + +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/libcxx/test/atomics/atomics.flag/atomic_flag_test_and_set_explicit.pass.cpp b/libcxx/test/atomics/atomics.flag/atomic_flag_test_and_set_explicit.pass.cpp new file mode 100644 index 00000000000..f98a4cf4bfc --- /dev/null +++ b/libcxx/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. +// +//===----------------------------------------------------------------------===// + +// <atomic> + +// 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 <atomic> +#include <cassert> + +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/libcxx/test/atomics/atomics.flag/clear.pass.cpp b/libcxx/test/atomics/atomics.flag/clear.pass.cpp new file mode 100644 index 00000000000..59c86a9330c --- /dev/null +++ b/libcxx/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. +// +//===----------------------------------------------------------------------===// + +// <atomic> + +// struct atomic_flag + +// void clear(memory_order = memory_order_seq_cst); +// void clear(memory_order = memory_order_seq_cst) volatile; + +#include <atomic> +#include <cassert> + +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/libcxx/test/atomics/atomics.flag/copy_assign.fail.cpp b/libcxx/test/atomics/atomics.flag/copy_assign.fail.cpp new file mode 100644 index 00000000000..9d64a506717 --- /dev/null +++ b/libcxx/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. +// +//===----------------------------------------------------------------------===// + +// <atomic> + +// struct atomic_flag + +// atomic_flag& operator=(const atomic_flag&) = delete; + +#include <atomic> +#include <cassert> + +int main() +{ + std::atomic_flag f0; + std::atomic_flag f; + f = f0; +} diff --git a/libcxx/test/atomics/atomics.flag/copy_ctor.fail.cpp b/libcxx/test/atomics/atomics.flag/copy_ctor.fail.cpp new file mode 100644 index 00000000000..169ace6d59e --- /dev/null +++ b/libcxx/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. +// +//===----------------------------------------------------------------------===// + +// <atomic> + +// struct atomic_flag + +// atomic_flag(const atomic_flag&) = delete; + +#include <atomic> +#include <cassert> + +int main() +{ + std::atomic_flag f0; + std::atomic_flag f(f0); +} diff --git a/libcxx/test/atomics/atomics.flag/copy_volatile_assign.fail.cpp b/libcxx/test/atomics/atomics.flag/copy_volatile_assign.fail.cpp new file mode 100644 index 00000000000..3ceacb67d1c --- /dev/null +++ b/libcxx/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. +// +//===----------------------------------------------------------------------===// + +// <atomic> + +// struct atomic_flag + +// atomic_flag& operator=(const atomic_flag&) = delete; + +#include <atomic> +#include <cassert> + +int main() +{ + std::atomic_flag f0; + volatile std::atomic_flag f; + f = f0; +} diff --git a/libcxx/test/atomics/atomics.flag/default.pass.cpp b/libcxx/test/atomics/atomics.flag/default.pass.cpp new file mode 100644 index 00000000000..c882e03d67a --- /dev/null +++ b/libcxx/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. +// +//===----------------------------------------------------------------------===// + +// <atomic> + +// struct atomic_flag + +// atomic_flag() = default; + +#include <atomic> +#include <cassert> + +int main() +{ + std::atomic_flag f; +} diff --git a/libcxx/test/atomics/atomics.flag/init.pass.cpp b/libcxx/test/atomics/atomics.flag/init.pass.cpp new file mode 100644 index 00000000000..24cb85471fe --- /dev/null +++ b/libcxx/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. +// +//===----------------------------------------------------------------------===// + +// <atomic> + +// struct atomic_flag + +// atomic_flag() = ATOMIC_FLAG_INIT; + +#include <atomic> +#include <cassert> + +int main() +{ + std::atomic_flag f = ATOMIC_FLAG_INIT; + assert(f.test_and_set() == 0); +} diff --git a/libcxx/test/atomics/atomics.flag/test_and_set.pass.cpp b/libcxx/test/atomics/atomics.flag/test_and_set.pass.cpp index cf2b5d700d5..5bdd32da590 100644 --- a/libcxx/test/atomics/atomics.flag/test_and_set.pass.cpp +++ b/libcxx/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); + } } |

