Home | History | Annotate | Download | only in atomics.types.generic
      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