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