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//===----------------------------------------------------------------------===//
991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant
1091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// <atomic>
1191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant
1291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// template <class Integral>
1391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//     Integral
1491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//     atomic_fetch_xor(volatile atomic<Integral>* obj, Integral op);
1591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//
1691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// template <class Integral>
1791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//     Integral
1891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant//     atomic_fetch_xor(atomic<Integral>* obj, Integral op);
1991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant
2091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant#include <atomic>
219efdc0bd5f22b3d6815862ddb14dbd4aed5042f0Richard Smith#include <type_traits>
2291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant#include <cassert>
2391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant
2491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnanttemplate <class T>
2591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnantvoid
2691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnanttest()
2791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant{
2891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    {
2991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        typedef std::atomic<T> A;
3091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        A t;
3191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        std::atomic_init(&t, T(1));
3291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        assert(std::atomic_fetch_xor(&t, T(2)) == T(1));
3391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        assert(t == T(3));
3491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    }
3591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    {
3691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        typedef std::atomic<T> A;
3791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        volatile A t;
3891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        std::atomic_init(&t, T(3));
3991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        assert(std::atomic_fetch_xor(&t, T(2)) == T(3));
4091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant        assert(t == T(1));
4191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    }
4291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant}
4391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant
4491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnantint main()
4591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant{
4691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<char>();
4791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<signed char>();
4891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<unsigned char>();
4991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<short>();
5091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<unsigned short>();
5191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<int>();
5291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<unsigned int>();
5391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<long>();
5491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<unsigned long>();
5591e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<long long>();
5691e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<unsigned long long>();
5791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<wchar_t>();
5891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
5991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<char16_t>();
6091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant    test<char32_t>();
6191e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant#endif  // _LIBCPP_HAS_NO_UNICODE_CHARS
6291e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant}
63