1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is dual licensed under the MIT and the University of Illinois Open 6// Source Licenses. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10// <atomic> 11 12// template <class T> 13// struct atomic 14// { 15// bool is_lock_free() const volatile noexcept; 16// bool is_lock_free() const noexcept; 17// void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; 18// void store(T desr, memory_order m = memory_order_seq_cst) noexcept; 19// T load(memory_order m = memory_order_seq_cst) const volatile noexcept; 20// T load(memory_order m = memory_order_seq_cst) const noexcept; 21// operator T() const volatile noexcept; 22// operator T() const noexcept; 23// T exchange(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; 24// T exchange(T desr, memory_order m = memory_order_seq_cst) noexcept; 25// bool compare_exchange_weak(T& expc, T desr, 26// memory_order s, memory_order f) volatile noexcept; 27// bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f) noexcept; 28// bool compare_exchange_strong(T& expc, T desr, 29// memory_order s, memory_order f) volatile noexcept; 30// bool compare_exchange_strong(T& expc, T desr, 31// memory_order s, memory_order f) noexcept; 32// bool compare_exchange_weak(T& expc, T desr, 33// memory_order m = memory_order_seq_cst) volatile noexcept; 34// bool compare_exchange_weak(T& expc, T desr, 35// memory_order m = memory_order_seq_cst) noexcept; 36// bool compare_exchange_strong(T& expc, T desr, 37// memory_order m = memory_order_seq_cst) volatile noexcept; 38// bool compare_exchange_strong(T& expc, T desr, 39// memory_order m = memory_order_seq_cst) noexcept; 40// 41// atomic() noexcept = default; 42// constexpr atomic(T desr) noexcept; 43// atomic(const atomic&) = delete; 44// atomic& operator=(const atomic&) = delete; 45// atomic& operator=(const atomic&) volatile = delete; 46// T operator=(T) volatile noexcept; 47// T operator=(T) noexcept; 48// }; 49 50#include <atomic> 51#include <new> 52#include <cassert> 53#include <thread> // for thread_id 54#include <chrono> // for nanoseconds 55 56struct NotTriviallyCopyable { 57 NotTriviallyCopyable ( int i ) : i_(i) {} 58 NotTriviallyCopyable ( const NotTriviallyCopyable &rhs) : i_(rhs.i_) {} 59 int i_; 60}; 61 62template <class T, class > 63void test ( T t ) { 64 std::atomic<T> t0(t); 65} 66 67int main() 68{ 69 test(NotTriviallyCopyable(42)); 70} 71