Home | History | Annotate | Download | only in atomics.types.operations.req
      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 //  ... assertion fails line 31
     12 
     13 // <atomic>
     14 
     15 // template <class T>
     16 //     T
     17 //     atomic_load_explicit(const volatile atomic<T>* obj, memory_order m);
     18 //
     19 // template <class T>
     20 //     T
     21 //     atomic_load_explicit(const atomic<T>* obj, memory_order m);
     22 
     23 #include <atomic>
     24 #include <type_traits>
     25 #include <cassert>
     26 
     27 template <class T>
     28 void
     29 test()
     30 {
     31     typedef std::atomic<T> A;
     32     A t;
     33     std::atomic_init(&t, T(1));
     34     assert(std::atomic_load_explicit(&t, std::memory_order_seq_cst) == T(1));
     35     volatile A vt;
     36     std::atomic_init(&vt, T(2));
     37     assert(std::atomic_load_explicit(&vt, std::memory_order_seq_cst) == T(2));
     38 }
     39 
     40 struct A
     41 {
     42     int i;
     43 
     44     explicit A(int d = 0) noexcept {i=d;}
     45 
     46     friend bool operator==(const A& x, const A& y)
     47         {return x.i == y.i;}
     48 };
     49 
     50 int main()
     51 {
     52     test<A>();
     53     test<char>();
     54     test<signed char>();
     55     test<unsigned char>();
     56     test<short>();
     57     test<unsigned short>();
     58     test<int>();
     59     test<unsigned int>();
     60     test<long>();
     61     test<unsigned long>();
     62     test<long long>();
     63     test<unsigned long long>();
     64     test<wchar_t>();
     65 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     66     test<char16_t>();
     67     test<char32_t>();
     68 #endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
     69     test<int*>();
     70     test<const int*>();
     71 }
     72