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_or_explicit(volatile atomic<Integral>* obj, Integral op); 1791e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// 1891e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// template <class Integral> 1991e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// Integral 2091e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant// atomic_fetch_or_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_or_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_or_explicit(&t, T(2), 4391e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant std::memory_order_seq_cst) == T(3)); 4491e2f26fec72dfbd0cc39d5e5e8e7c0c25b6e155Howard Hinnant assert(t == T(3)); 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