1f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant//===----------------------------------------------------------------------===// 2f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// 3f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// The LLVM Compiler Infrastructure 4f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// 5f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// 8f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant//===----------------------------------------------------------------------===// 98d86b2e6867297fb2109824c67c50de67f3a31f2Jonathan Roelofs// 108d86b2e6867297fb2109824c67c50de67f3a31f2Jonathan Roelofs// UNSUPPORTED: libcpp-has-no-threads 11f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 12f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// <atomic> 13f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 14f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// template <> 15f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// struct atomic<integral> 16f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// { 17f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool is_lock_free() const volatile; 18f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool is_lock_free() const; 19f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// void store(integral desr, memory_order m = memory_order_seq_cst) volatile; 20f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// void store(integral desr, memory_order m = memory_order_seq_cst); 21f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral load(memory_order m = memory_order_seq_cst) const volatile; 22f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral load(memory_order m = memory_order_seq_cst) const; 23f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// operator integral() const volatile; 24f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// operator integral() const; 25f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral exchange(integral desr, 26f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order m = memory_order_seq_cst) volatile; 27f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral exchange(integral desr, memory_order m = memory_order_seq_cst); 28f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_weak(integral& expc, integral desr, 29f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order s, memory_order f) volatile; 30f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_weak(integral& expc, integral desr, 31f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order s, memory_order f); 32f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_strong(integral& expc, integral desr, 33f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order s, memory_order f) volatile; 34f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_strong(integral& expc, integral desr, 35f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order s, memory_order f); 36f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_weak(integral& expc, integral desr, 37f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order m = memory_order_seq_cst) volatile; 38f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_weak(integral& expc, integral desr, 39f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order m = memory_order_seq_cst); 40f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_strong(integral& expc, integral desr, 41f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order m = memory_order_seq_cst) volatile; 42f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_strong(integral& expc, integral desr, 43f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order m = memory_order_seq_cst); 4484acb1ec3f7d5e0f37d7176697c2fa876c413407Eric Fiselier// 45f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral 46f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// fetch_add(integral op, memory_order m = memory_order_seq_cst) volatile; 47f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral fetch_add(integral op, memory_order m = memory_order_seq_cst); 48f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral 49f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// fetch_sub(integral op, memory_order m = memory_order_seq_cst) volatile; 50f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral fetch_sub(integral op, memory_order m = memory_order_seq_cst); 51f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral 52f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// fetch_and(integral op, memory_order m = memory_order_seq_cst) volatile; 53f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral fetch_and(integral op, memory_order m = memory_order_seq_cst); 54f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral 55f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// fetch_or(integral op, memory_order m = memory_order_seq_cst) volatile; 56f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral fetch_or(integral op, memory_order m = memory_order_seq_cst); 57f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral 58f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// fetch_xor(integral op, memory_order m = memory_order_seq_cst) volatile; 59f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral fetch_xor(integral op, memory_order m = memory_order_seq_cst); 6084acb1ec3f7d5e0f37d7176697c2fa876c413407Eric Fiselier// 61f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// atomic() = default; 62f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// constexpr atomic(integral desr); 63f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// atomic(const atomic&) = delete; 64f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// atomic& operator=(const atomic&) = delete; 65f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// atomic& operator=(const atomic&) volatile = delete; 66f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator=(integral desr) volatile; 67f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator=(integral desr); 6884acb1ec3f7d5e0f37d7176697c2fa876c413407Eric Fiselier// 69f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator++(int) volatile; 70f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator++(int); 71f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator--(int) volatile; 72f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator--(int); 73f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator++() volatile; 74f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator++(); 75f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator--() volatile; 76f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator--(); 77f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator+=(integral op) volatile; 78f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator+=(integral op); 79f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator-=(integral op) volatile; 80f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator-=(integral op); 81f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator&=(integral op) volatile; 82f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator&=(integral op); 83f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator|=(integral op) volatile; 84f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator|=(integral op); 85f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator^=(integral op) volatile; 86f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// integral operator^=(integral op); 87f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// }; 88f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 89f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant#include <atomic> 9074f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant#include <new> 91f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant#include <cassert> 92f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 937ba3c57565e6658d8265b028a61c5731cf899495Dan Albert#include <cmpxchg_loop.h> 947ba3c57565e6658d8265b028a61c5731cf899495Dan Albert 954775578c617a5a77d3eb82e38f636141088640cfEric Fiselier#include "test_macros.h" 964775578c617a5a77d3eb82e38f636141088640cfEric Fiselier 97f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnanttemplate <class A, class T> 98f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnantvoid 99f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnantdo_test() 100f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant{ 101f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant A obj(T(0)); 102f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(0)); 103f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::atomic_init(&obj, T(1)); 104f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(1)); 105f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::atomic_init(&obj, T(2)); 106f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(2)); 107f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant bool b0 = obj.is_lock_free(); 108462410703dd285473f9de1c782a5c6bd3fa9cf43Eric Fiselier ((void)b0); // mark as unused 109f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(T(0)); 110f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(0)); 111f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(T(1), std::memory_order_release); 112f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(1)); 113f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.load() == T(1)); 114f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.load(std::memory_order_acquire) == T(1)); 115f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.exchange(T(2)) == T(1)); 116f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(2)); 117f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.exchange(T(3), std::memory_order_relaxed) == T(2)); 118f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(3)); 119f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant T x = obj; 1207ba3c57565e6658d8265b028a61c5731cf899495Dan Albert assert(cmpxchg_weak_loop(obj, x, T(2)) == true); 121f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(2)); 122f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(x == T(3)); 123f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_weak(x, T(1)) == false); 124f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(2)); 125d3eca759a2ce3125613fb840287c77ee1f372b10David Chisnall assert(x == T(2)); 126f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant x = T(2); 127f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_strong(x, T(1)) == true); 128f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(1)); 129f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(x == T(2)); 130f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_strong(x, T(0)) == false); 131f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(1)); 132d3eca759a2ce3125613fb840287c77ee1f372b10David Chisnall assert(x == T(1)); 133f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert((obj = T(0)) == T(0)); 134f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(0)); 135f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj++ == T(0)); 136f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(1)); 137f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(++obj == T(2)); 138f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(2)); 139f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(--obj == T(1)); 140f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(1)); 141f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj-- == T(1)); 142f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(0)); 143f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj = T(2); 144f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert((obj += T(3)) == T(5)); 145f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(5)); 146f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert((obj -= T(3)) == T(2)); 147f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(2)); 148f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert((obj |= T(5)) == T(7)); 149f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(7)); 150f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert((obj &= T(0xF)) == T(7)); 151f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(7)); 152f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert((obj ^= T(0xF)) == T(8)); 153f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == T(8)); 15474f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant 15574f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant { 1564775578c617a5a77d3eb82e38f636141088640cfEric Fiselier TEST_ALIGNAS_TYPE(A) char storage[sizeof(A)] = {23}; 15784acb1ec3f7d5e0f37d7176697c2fa876c413407Eric Fiselier A& zero = *new (storage) A(); 15874f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant assert(zero == 0); 15974f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant zero.~A(); 16074f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant } 161f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant} 162f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 163f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnanttemplate <class A, class T> 164f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnantvoid test() 165f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant{ 166f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant do_test<A, T>(); 167f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant do_test<volatile A, T>(); 168f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant} 169f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 170f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 171f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnantint main() 172f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant{ 173f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_char, char>(); 174f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_schar, signed char>(); 175f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_uchar, unsigned char>(); 176f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_short, short>(); 177f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_ushort, unsigned short>(); 178f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_int, int>(); 179f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_uint, unsigned int>(); 180f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_long, long>(); 181f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_ulong, unsigned long>(); 182f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_llong, long long>(); 183f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_ullong, unsigned long long>(); 184f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS 185f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_char16_t, char16_t>(); 186f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_char32_t, char32_t>(); 187f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant#endif // _LIBCPP_HAS_NO_UNICODE_CHARS 188f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<std::atomic_wchar_t, wchar_t>(); 189f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 190ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<std::atomic_int8_t, int8_t>(); 191ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<std::atomic_uint8_t, uint8_t>(); 192ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<std::atomic_int16_t, int16_t>(); 193ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<std::atomic_uint16_t, uint16_t>(); 194ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<std::atomic_int32_t, int32_t>(); 195ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<std::atomic_uint32_t, uint32_t>(); 196ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<std::atomic_int64_t, int64_t>(); 197ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<std::atomic_uint64_t, uint64_t>(); 198e33c0b01f892f8919f66a066a9c4064010104e49Stephan T. Lavavej 199f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_char, char>(); 200f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_schar, signed char>(); 201f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_uchar, unsigned char>(); 202f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_short, short>(); 203f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_ushort, unsigned short>(); 204f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_int, int>(); 205f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_uint, unsigned int>(); 206f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_long, long>(); 207f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_ulong, unsigned long>(); 208f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_llong, long long>(); 209f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_ullong, unsigned long long>(); 210f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS 211f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_char16_t, char16_t>(); 212f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_char32_t, char32_t>(); 213f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant#endif // _LIBCPP_HAS_NO_UNICODE_CHARS 214f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant test<volatile std::atomic_wchar_t, wchar_t>(); 215ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow 216ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<volatile std::atomic_int8_t, int8_t>(); 217ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<volatile std::atomic_uint8_t, uint8_t>(); 218ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<volatile std::atomic_int16_t, int16_t>(); 219ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<volatile std::atomic_uint16_t, uint16_t>(); 220ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<volatile std::atomic_int32_t, int32_t>(); 221ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<volatile std::atomic_uint32_t, uint32_t>(); 222ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<volatile std::atomic_int64_t, int64_t>(); 223ca894508f9e7324c3d3386e08b5eb69ae08b34f6Marshall Clow test<volatile std::atomic_uint64_t, uint64_t>(); 224f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant} 225