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