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//===----------------------------------------------------------------------===// 9f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 10f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// <atomic> 11f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 12f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// template <class T> 13f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// struct atomic 14f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// { 15f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool is_lock_free() const volatile; 16f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool is_lock_free() const; 17f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// void store(T desr, memory_order m = memory_order_seq_cst) volatile; 18f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// void store(T desr, memory_order m = memory_order_seq_cst); 19f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// T load(memory_order m = memory_order_seq_cst) const volatile; 20f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// T load(memory_order m = memory_order_seq_cst) const; 21f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// operator T() const volatile; 22f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// operator T() const; 23f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// T exchange(T desr, memory_order m = memory_order_seq_cst) volatile; 24f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// T exchange(T desr, memory_order m = memory_order_seq_cst); 25f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_weak(T& expc, T desr, 26f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order s, memory_order f) volatile; 27f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f); 28f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_strong(T& expc, T desr, 29f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order s, memory_order f) volatile; 30f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_strong(T& expc, T desr, 31f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order s, memory_order f); 32f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_weak(T& expc, T desr, 33f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order m = memory_order_seq_cst) volatile; 34f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_weak(T& expc, T desr, 35f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order m = memory_order_seq_cst); 36f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_strong(T& expc, T desr, 37f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order m = memory_order_seq_cst) volatile; 38f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// bool compare_exchange_strong(T& expc, T desr, 39f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// memory_order m = memory_order_seq_cst); 40f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// 41f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// atomic() = default; 42f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// constexpr atomic(T desr); 43f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// atomic(const atomic&) = delete; 44f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// atomic& operator=(const atomic&) = delete; 45f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// atomic& operator=(const atomic&) volatile = delete; 46f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// T operator=(T) volatile; 47f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// T operator=(T); 48f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant// }; 496ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant// 506ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant// typedef atomic<bool> atomic_bool; 51f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 52f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant#include <atomic> 5374f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant#include <new> 54f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant#include <cassert> 55f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant 56f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnantint main() 57f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant{ 58f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant { 59f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant volatile std::atomic<bool> _; 60f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant volatile std::atomic<bool> obj(true); 61f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == true); 62f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::atomic_init(&obj, false); 63f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 64f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::atomic_init(&obj, true); 65f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == true); 66f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant bool b0 = obj.is_lock_free(); 67f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(false); 68f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 69f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(true, std::memory_order_release); 70f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == true); 71f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.load() == true); 72f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.load(std::memory_order_acquire) == true); 73f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.exchange(false) == true); 74f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 75f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.exchange(true, std::memory_order_relaxed) == false); 76f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == true); 77f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant bool x = obj; 78f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_weak(x, false) == true); 79f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 80f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(x == true); 81f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_weak(x, true, 82f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst) == false); 83f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 84d3eca759a2ce3125613fb840287c77ee1f372b10David Chisnall assert(x == false); 85f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(true); 86d3eca759a2ce3125613fb840287c77ee1f372b10David Chisnall x = true; 87f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_weak(x, false, 88f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst, 89f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst) == true); 90f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 91f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(x == true); 92f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant x = true; 93f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(true); 94f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_strong(x, false) == true); 95f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 96f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(x == true); 97f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_strong(x, true, 98f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst) == false); 99f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 100d3eca759a2ce3125613fb840287c77ee1f372b10David Chisnall assert(x == false); 101f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant x = true; 102f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(true); 103f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_strong(x, false, 104f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst, 105f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst) == true); 106f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 107f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(x == true); 108f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert((obj = false) == false); 109f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 110f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert((obj = true) == true); 111f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == true); 112f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant } 113f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant { 114f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::atomic<bool> _; 115f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::atomic<bool> obj(true); 1166ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == true); 1176ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant std::atomic_init(&obj, false); 1186ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == false); 1196ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant std::atomic_init(&obj, true); 1206ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == true); 1216ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant bool b0 = obj.is_lock_free(); 1226ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant obj.store(false); 1236ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == false); 1246ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant obj.store(true, std::memory_order_release); 1256ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == true); 1266ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj.load() == true); 1276ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj.load(std::memory_order_acquire) == true); 1286ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj.exchange(false) == true); 1296ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == false); 1306ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj.exchange(true, std::memory_order_relaxed) == false); 1316ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == true); 1326ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant bool x = obj; 1336ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj.compare_exchange_weak(x, false) == true); 1346ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == false); 1356ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(x == true); 1366ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj.compare_exchange_weak(x, true, 1376ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant std::memory_order_seq_cst) == false); 1386ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == false); 1396ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(x == false); 1406ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant obj.store(true); 1416ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant x = true; 1426ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj.compare_exchange_weak(x, false, 1436ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant std::memory_order_seq_cst, 1446ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant std::memory_order_seq_cst) == true); 1456ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == false); 1466ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(x == true); 1476ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant x = true; 1486ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant obj.store(true); 1496ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj.compare_exchange_strong(x, false) == true); 1506ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == false); 1516ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(x == true); 1526ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj.compare_exchange_strong(x, true, 1536ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant std::memory_order_seq_cst) == false); 1546ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == false); 1556ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(x == false); 1566ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant x = true; 1576ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant obj.store(true); 1586ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj.compare_exchange_strong(x, false, 1596ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant std::memory_order_seq_cst, 1606ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant std::memory_order_seq_cst) == true); 1616ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == false); 1626ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(x == true); 1636ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert((obj = false) == false); 1646ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == false); 1656ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert((obj = true) == true); 1666ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant assert(obj == true); 1676ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant } 1686ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant { 1696ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant std::atomic_bool _; 1706ae47055f958b95e1ab941b5209d6f6b91c3aed1Howard Hinnant std::atomic_bool obj(true); 171f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == true); 172f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::atomic_init(&obj, false); 173f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 174f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::atomic_init(&obj, true); 175f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == true); 176f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant bool b0 = obj.is_lock_free(); 177f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(false); 178f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 179f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(true, std::memory_order_release); 180f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == true); 181f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.load() == true); 182f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.load(std::memory_order_acquire) == true); 183f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.exchange(false) == true); 184f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 185f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.exchange(true, std::memory_order_relaxed) == false); 186f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == true); 187f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant bool x = obj; 188f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_weak(x, false) == true); 189f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 190f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(x == true); 191f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_weak(x, true, 192f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst) == false); 193f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 194d3eca759a2ce3125613fb840287c77ee1f372b10David Chisnall assert(x == false); 195f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(true); 196d3eca759a2ce3125613fb840287c77ee1f372b10David Chisnall x = true; 197f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_weak(x, false, 198f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst, 199f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst) == true); 200f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 201f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(x == true); 202f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant x = true; 203f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(true); 204f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_strong(x, false) == true); 205f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 206f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(x == true); 207f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_strong(x, true, 208f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst) == false); 209f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 210d3eca759a2ce3125613fb840287c77ee1f372b10David Chisnall assert(x == false); 211f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant x = true; 212f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant obj.store(true); 213f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj.compare_exchange_strong(x, false, 214f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst, 215f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant std::memory_order_seq_cst) == true); 216f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 217f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(x == true); 218f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert((obj = false) == false); 219f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == false); 220f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert((obj = true) == true); 221f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant assert(obj == true); 222f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant } 22374f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant { 22474f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant typedef std::atomic<bool> A; 22574f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant _ALIGNAS_TYPE(A) char storage[sizeof(A)] = {1}; 22674f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant A& zero = *new (storage) A(); 22774f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant assert(zero == false); 22874f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant zero.~A(); 22974f4da7219100afcff4baab33d12910d29eb127eHoward Hinnant } 230f02417b600ee58299effa60b5ffd9d58b8bc3129Howard Hinnant} 231