diff --git a/test/atomics/atomics.types.generic/trivially_copyable.fail.cpp b/test/atomics/atomics.types.generic/trivially_copyable.fail.cpp new file mode 100644 index 00000000..49ec0694 --- /dev/null +++ b/test/atomics/atomics.types.generic/trivially_copyable.fail.cpp @@ -0,0 +1,70 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template +// struct atomic +// { +// bool is_lock_free() const volatile noexcept; +// bool is_lock_free() const noexcept; +// void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; +// void store(T desr, memory_order m = memory_order_seq_cst) noexcept; +// T load(memory_order m = memory_order_seq_cst) const volatile noexcept; +// T load(memory_order m = memory_order_seq_cst) const noexcept; +// operator T() const volatile noexcept; +// operator T() const noexcept; +// T exchange(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; +// T exchange(T desr, memory_order m = memory_order_seq_cst) noexcept; +// bool compare_exchange_weak(T& expc, T desr, +// memory_order s, memory_order f) volatile noexcept; +// bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f) noexcept; +// bool compare_exchange_strong(T& expc, T desr, +// memory_order s, memory_order f) volatile noexcept; +// bool compare_exchange_strong(T& expc, T desr, +// memory_order s, memory_order f) noexcept; +// bool compare_exchange_weak(T& expc, T desr, +// memory_order m = memory_order_seq_cst) volatile noexcept; +// bool compare_exchange_weak(T& expc, T desr, +// memory_order m = memory_order_seq_cst) noexcept; +// bool compare_exchange_strong(T& expc, T desr, +// memory_order m = memory_order_seq_cst) volatile noexcept; +// bool compare_exchange_strong(T& expc, T desr, +// memory_order m = memory_order_seq_cst) noexcept; +// +// atomic() noexcept = default; +// constexpr atomic(T desr) noexcept; +// atomic(const atomic&) = delete; +// atomic& operator=(const atomic&) = delete; +// atomic& operator=(const atomic&) volatile = delete; +// T operator=(T) volatile noexcept; +// T operator=(T) noexcept; +// }; + +#include +#include +#include +#include // for thread_id +#include // for nanoseconds + +struct NotTriviallyCopyable { + NotTriviallyCopyable ( int i ) : i_(i) {} + NotTriviallyCopyable ( const NotTriviallyCopyable &rhs) : i_(rhs.i_) {} + int i_; + }; + +template +void test ( T t ) { + std::atomic t0(t); + } + +int main() +{ + test(NotTriviallyCopyable(42)); +} diff --git a/test/atomics/atomics.types.generic/trivially_copyable.pass.cpp b/test/atomics/atomics.types.generic/trivially_copyable.pass.cpp new file mode 100644 index 00000000..8cdd0878 --- /dev/null +++ b/test/atomics/atomics.types.generic/trivially_copyable.pass.cpp @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template +// struct atomic +// { +// bool is_lock_free() const volatile noexcept; +// bool is_lock_free() const noexcept; +// void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; +// void store(T desr, memory_order m = memory_order_seq_cst) noexcept; +// T load(memory_order m = memory_order_seq_cst) const volatile noexcept; +// T load(memory_order m = memory_order_seq_cst) const noexcept; +// operator T() const volatile noexcept; +// operator T() const noexcept; +// T exchange(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; +// T exchange(T desr, memory_order m = memory_order_seq_cst) noexcept; +// bool compare_exchange_weak(T& expc, T desr, +// memory_order s, memory_order f) volatile noexcept; +// bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f) noexcept; +// bool compare_exchange_strong(T& expc, T desr, +// memory_order s, memory_order f) volatile noexcept; +// bool compare_exchange_strong(T& expc, T desr, +// memory_order s, memory_order f) noexcept; +// bool compare_exchange_weak(T& expc, T desr, +// memory_order m = memory_order_seq_cst) volatile noexcept; +// bool compare_exchange_weak(T& expc, T desr, +// memory_order m = memory_order_seq_cst) noexcept; +// bool compare_exchange_strong(T& expc, T desr, +// memory_order m = memory_order_seq_cst) volatile noexcept; +// bool compare_exchange_strong(T& expc, T desr, +// memory_order m = memory_order_seq_cst) noexcept; +// +// atomic() noexcept = default; +// constexpr atomic(T desr) noexcept; +// atomic(const atomic&) = delete; +// atomic& operator=(const atomic&) = delete; +// atomic& operator=(const atomic&) volatile = delete; +// T operator=(T) volatile noexcept; +// T operator=(T) noexcept; +// }; + +#include +#include +#include +#include // for thread_id +#include // for nanoseconds + +struct TriviallyCopyable { + TriviallyCopyable ( int i ) : i_(i) {} + int i_; + }; + +template +void test ( T t ) { + std::atomic t0(t); + } + +int main() +{ + test(TriviallyCopyable(42)); + test(std::this_thread::get_id()); + test(std::chrono::nanoseconds(2)); +}