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 // UNSUPPORTED: libcpp-has-no-threads 11 12 // NOTE: atomic<> of a TriviallyCopyable class is wrongly rejected by older 13 // clang versions. It was fixed right before the llvm 3.5 release. See PR18097. 14 // XFAIL: apple-clang-6.0, clang-3.4, clang-3.3 15 16 // <atomic> 17 18 // template <class T> 19 // struct atomic 20 // { 21 // bool is_lock_free() const volatile noexcept; 22 // bool is_lock_free() const noexcept; 23 // void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; 24 // void store(T desr, memory_order m = memory_order_seq_cst) noexcept; 25 // T load(memory_order m = memory_order_seq_cst) const volatile noexcept; 26 // T load(memory_order m = memory_order_seq_cst) const noexcept; 27 // operator T() const volatile noexcept; 28 // operator T() const noexcept; 29 // T exchange(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; 30 // T exchange(T desr, memory_order m = memory_order_seq_cst) noexcept; 31 // bool compare_exchange_weak(T& expc, T desr, 32 // memory_order s, memory_order f) volatile noexcept; 33 // bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f) noexcept; 34 // bool compare_exchange_strong(T& expc, T desr, 35 // memory_order s, memory_order f) volatile noexcept; 36 // bool compare_exchange_strong(T& expc, T desr, 37 // memory_order s, memory_order f) noexcept; 38 // bool compare_exchange_weak(T& expc, T desr, 39 // memory_order m = memory_order_seq_cst) volatile noexcept; 40 // bool compare_exchange_weak(T& expc, T desr, 41 // memory_order m = memory_order_seq_cst) noexcept; 42 // bool compare_exchange_strong(T& expc, T desr, 43 // memory_order m = memory_order_seq_cst) volatile noexcept; 44 // bool compare_exchange_strong(T& expc, T desr, 45 // memory_order m = memory_order_seq_cst) noexcept; 46 // 47 // atomic() noexcept = default; 48 // constexpr atomic(T desr) noexcept; 49 // atomic(const atomic&) = delete; 50 // atomic& operator=(const atomic&) = delete; 51 // atomic& operator=(const atomic&) volatile = delete; 52 // T operator=(T) volatile noexcept; 53 // T operator=(T) noexcept; 54 // }; 55 56 #include <atomic> 57 #include <new> 58 #include <cassert> 59 #include <thread> // for thread_id 60 #include <chrono> // for nanoseconds 61 62 struct TriviallyCopyable { 63 TriviallyCopyable ( int i ) : i_(i) {} 64 int i_; 65 }; 66 67 template <class T> 68 void test ( T t ) { 69 std::atomic<T> t0(t); 70 } 71 72 int main() 73 { 74 test(TriviallyCopyable(42)); 75 test(std::this_thread::get_id()); 76 test(std::chrono::nanoseconds(2)); 77 } 78