//===----------------------------------------------------------------------===// // // 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. // //===----------------------------------------------------------------------===// // // UNSUPPORTED: libcpp-has-no-threads // NOTE: atomic<> of a TriviallyCopyable class is wrongly rejected by older // clang versions. It was fixed right before the llvm 3.5 release. See PR18097. // XFAIL: apple-clang-6.0, clang-3.4, clang-3.3 // // 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)); }