191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//===----------------------------------------------------------------------===//
291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//
391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//                     The LLVM Compiler Infrastructure
491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//
591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//
891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//===----------------------------------------------------------------------===//
97112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
107112dae6acac544a0271a85d95342c583441e2d1Dan Albert// UNSUPPORTED: libcpp-has-no-threads
1191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant
1291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// <atomic>
1391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant
1491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// template <class Integral>
1591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//     Integral
1691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//     atomic_fetch_xor_explicit(volatile atomic<Integral>* obj, Integral op);
1791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//
1891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// template <class Integral>
1991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//     Integral
2091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//     atomic_fetch_xor_explicit(atomic<Integral>* obj, Integral op);
2191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant
2291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant#include <atomic>
239efdc0bd5f22b3d6815862ddb14dbd4aed5042f0Richard Smith#include <type_traits>
2491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant#include <cassert>
2591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant
2691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnanttemplate <class T>
2791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnantvoid
2891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnanttest()
2991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant{
3091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    {
3191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        typedef std::atomic<T> A;
3291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        A t;
3391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        std::atomic_init(&t, T(1));
3491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        assert(std::atomic_fetch_xor_explicit(&t, T(2),
3591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant               std::memory_order_seq_cst) == T(1));
3691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        assert(t == T(3));
3791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    }
3891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    {
3991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        typedef std::atomic<T> A;
4091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        volatile A t;
4191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        std::atomic_init(&t, T(3));
4291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        assert(std::atomic_fetch_xor_explicit(&t, T(2),
4391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant               std::memory_order_seq_cst) == T(3));
4491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        assert(t == T(1));
4591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    }
4691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant}
4791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant
4891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnantint main()
4991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant{
5091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<char>();
5191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<signed char>();
5291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<unsigned char>();
5391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<short>();
5491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<unsigned short>();
5591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<int>();
5691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<unsigned int>();
5791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<long>();
5891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<unsigned long>();
5991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<long long>();
6091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<unsigned long long>();
6191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<wchar_t>();
6291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
6391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<char16_t>();
6491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<char32_t>();
6591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
6691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant}
67