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