Add test cases for creating atomic types for trivially copyable types.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@214406 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
15269a8796
commit
c5eb69601b
@ -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.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
// <atomic>
|
||||||
|
|
||||||
|
// template <class T>
|
||||||
|
// 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 <atomic>
|
||||||
|
#include <new>
|
||||||
|
#include <cassert>
|
||||||
|
#include <thread> // for thread_id
|
||||||
|
#include <chrono> // for nanoseconds
|
||||||
|
|
||||||
|
struct NotTriviallyCopyable {
|
||||||
|
NotTriviallyCopyable ( int i ) : i_(i) {}
|
||||||
|
NotTriviallyCopyable ( const NotTriviallyCopyable &rhs) : i_(rhs.i_) {}
|
||||||
|
int i_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void test ( T t ) {
|
||||||
|
std::atomic<T> t0(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test(NotTriviallyCopyable(42));
|
||||||
|
}
|
@ -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.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
// <atomic>
|
||||||
|
|
||||||
|
// template <class T>
|
||||||
|
// 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 <atomic>
|
||||||
|
#include <new>
|
||||||
|
#include <cassert>
|
||||||
|
#include <thread> // for thread_id
|
||||||
|
#include <chrono> // for nanoseconds
|
||||||
|
|
||||||
|
struct TriviallyCopyable {
|
||||||
|
TriviallyCopyable ( int i ) : i_(i) {}
|
||||||
|
int i_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void test ( T t ) {
|
||||||
|
std::atomic<T> t0(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test(TriviallyCopyable(42));
|
||||||
|
test(std::this_thread::get_id());
|
||||||
|
test(std::chrono::nanoseconds(2));
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user