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