14777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//===----------------------------------------------------------------------===//
24777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//
34777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//                     The LLVM Compiler Infrastructure
44777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//
54777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
64777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
74777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//
84777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//===----------------------------------------------------------------------===//
97112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
107112dae6acac544a0271a85d95342c583441e2d1Dan Albert// UNSUPPORTED: libcpp-has-no-threads
117112dae6acac544a0271a85d95342c583441e2d1Dan Albert//  ... assertion fails line 32
124777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
134777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant// <atomic>
144777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
154777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant// template <class T>
164777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//     T
174777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//     atomic_exchange_explicit(volatile atomic<T>* obj, T desr, memory_order m);
184777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//
194777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant// template <class T>
204777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//     T
214777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant//     atomic_exchange_explicit(atomic<T>* obj, T desr, memory_order m);
224777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
234777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant#include <atomic>
249efdc0bd5f22b3d6815862ddb14dbd4aed5042f0Richard Smith#include <type_traits>
254777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant#include <cassert>
264777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
274777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnanttemplate <class T>
284777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnantvoid
294777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnanttest()
304777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant{
314777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    typedef std::atomic<T> A;
324777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    A t;
334777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    std::atomic_init(&t, T(1));
344777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    assert(std::atomic_exchange_explicit(&t, T(2), std::memory_order_seq_cst)
354777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant           == T(1));
364777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    assert(t == T(2));
374777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    volatile A vt;
384777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    std::atomic_init(&vt, T(3));
394777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    assert(std::atomic_exchange_explicit(&vt, T(4), std::memory_order_seq_cst)
404777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant           == T(3));
414777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    assert(vt == T(4));
424777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant}
434777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
444777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnantstruct A
454777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant{
464777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    int i;
474777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
487112dae6acac544a0271a85d95342c583441e2d1Dan Albert    explicit A(int d = 0) noexcept {i=d;}
494777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
504777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    friend bool operator==(const A& x, const A& y)
514777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant        {return x.i == y.i;}
524777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant};
534777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant
544777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnantint main()
554777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant{
564777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<A>();
574777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<char>();
584777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<signed char>();
594777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<unsigned char>();
604777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<short>();
614777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<unsigned short>();
624777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<int>();
634777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<unsigned int>();
644777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<long>();
654777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<unsigned long>();
664777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<long long>();
674777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<unsigned long long>();
684777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<wchar_t>();
694777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
704777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<char16_t>();
714777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<char32_t>();
724777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
734777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<int*>();
744777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant    test<const int*>();
754777bf2799c59a847691094ae2c43df986ab55ceHoward Hinnant}
76