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 // <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 
     56 struct NotTriviallyCopyable {
     57     NotTriviallyCopyable ( int i ) : i_(i) {}
     58     NotTriviallyCopyable ( const NotTriviallyCopyable &rhs) : i_(rhs.i_) {}
     59     int i_;
     60 };
     61 
     62 template <class T, class >
     63 void test ( T t ) {
     64     std::atomic<T> t0(t);
     65 }
     66 
     67 int main()
     68 {
     69     test(NotTriviallyCopyable(42));
     70 }
     71