]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/29_atomics/atomic_ref/integral.cc
1 // Copyright (C) 2019-2024 Free Software Foundation, Inc.
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
18 // { dg-do run { target c++20 } }
19 // { dg-require-atomic-cmpxchg-word "" }
20 // { dg-add-options libatomic }
24 #include <testsuite_hooks.h>
32 const auto mo
= std::memory_order_relaxed
;
33 std::atomic_ref
<int> a(value
);
34 bool ok
= a
.is_lock_free();
35 if constexpr (std::atomic_ref
<int>::is_always_lock_free
)
38 VERIFY( a
.load() == 0 );
39 VERIFY( a
.load(mo
) == 0 );
41 VERIFY( a
.load() == 1 );
42 auto v
= a
.exchange(2);
45 v
= a
.exchange(3, mo
);
49 auto expected
= a
.load();
50 while (!a
.compare_exchange_weak(expected
, 4, mo
, mo
))
51 { /* weak form can fail spuriously */ }
52 VERIFY( a
.load() == 4 );
53 VERIFY( expected
== 3 );
55 ok
= a
.compare_exchange_weak(expected
, 5, mo
, mo
);
56 VERIFY( !ok
&& a
.load() == 4 && expected
== 4 );
57 ok
= a
.compare_exchange_strong(expected
, 5, mo
, mo
);
58 VERIFY( ok
&& a
.load() == 5 && expected
== 4 );
60 ok
= a
.compare_exchange_strong(expected
, 3, mo
, mo
);
61 VERIFY( !ok
&& a
.load() == 5 && expected
== 5 );
63 while (!a
.compare_exchange_weak(expected
, 4))
64 { /* weak form can fail spuriously */ }
65 VERIFY( a
.load() == 4 && expected
== 5 );
67 while (!a
.compare_exchange_weak(expected
, 6, mo
))
68 { /* weak form can fail spuriously */ }
69 VERIFY( a
.load() == 6 && expected
== 4 );
70 expected
= a
.load() + 1;
71 ok
= a
.compare_exchange_weak(expected
, -8);
72 VERIFY( !ok
&& a
.load() == 6 && expected
== 6 );
73 expected
= a
.load() + 1;
74 ok
= a
.compare_exchange_weak(expected
, 8, mo
);
75 VERIFY( !ok
&& a
.load() == 6 && expected
== 6 );
77 ok
= a
.compare_exchange_strong(expected
, -6);
78 VERIFY( ok
&& a
.load() == -6 && expected
== 6 );
80 ok
= a
.compare_exchange_strong(expected
, 7, mo
);
81 VERIFY( ok
&& a
.load() == 7 && expected
== -6 );
82 expected
= a
.load() + 1;
83 ok
= a
.compare_exchange_strong(expected
, 2);
84 VERIFY( !ok
&& a
.load() == 7 && expected
== 7 );
85 expected
= a
.load() + 1;
86 ok
= a
.compare_exchange_strong(expected
, 2, mo
);
87 VERIFY( !ok
&& a
.load() == 7 && expected
== 7 );
92 v
= a
.fetch_add(-30, mo
);
99 v
= a
.fetch_sub(-41, mo
);
103 v
= a
.fetch_and(0x101);
107 v
= a
.fetch_and(0x23, mo
);
111 v
= a
.fetch_or(0x101);
113 VERIFY( a
== 0x103 );
114 v
= a
.fetch_or(0x23, mo
);
115 VERIFY( v
== 0x103 );
116 VERIFY( a
== 0x123 );
118 v
= a
.fetch_xor(0x101);
119 VERIFY( v
== 0x123 );
120 VERIFY( a
== 0x022 );
121 v
= a
.fetch_xor(0x123, mo
);
122 VERIFY( v
== 0x022 );
123 VERIFY( a
== 0x101 );
126 VERIFY( v
== 0x101 );
127 VERIFY( a
== 0x102 );
129 VERIFY( v
== 0x102 );
130 VERIFY( a
== 0x101 );
132 VERIFY( v
== 0x102 );
133 VERIFY( a
== 0x102 );
135 VERIFY( v
== 0x101 );
136 VERIFY( a
== 0x101 );
152 VERIFY( v
== 0x103 );
153 VERIFY( a
== 0x103 );
156 VERIFY( v
== 0x022 );
157 VERIFY( a
== 0x022 );
160 VERIFY( value
== 0x022 );
166 unsigned short value
;
169 const auto mo
= std::memory_order_relaxed
;
170 std::atomic_ref
<unsigned short> a(value
);
171 bool ok
= a
.is_lock_free();
172 if constexpr (std::atomic_ref
<unsigned short>::is_always_lock_free
)
175 VERIFY( a
.load() == 0 );
176 VERIFY( a
.load(mo
) == 0 );
178 VERIFY( a
.load() == 1 );
179 auto v
= a
.exchange(2);
182 v
= a
.exchange(3, mo
);
186 auto expected
= a
.load();
187 while (!a
.compare_exchange_weak(expected
, 4, mo
, mo
))
188 { /* weak form can fail spuriously */ }
189 VERIFY( a
.load() == 4 );
190 VERIFY( expected
== 3 );
192 ok
= a
.compare_exchange_weak(expected
, 5, mo
, mo
);
193 VERIFY( !ok
&& a
.load() == 4 && expected
== 4 );
194 ok
= a
.compare_exchange_strong(expected
, 5, mo
, mo
);
195 VERIFY( ok
&& a
.load() == 5 && expected
== 4 );
197 ok
= a
.compare_exchange_strong(expected
, 3, mo
, mo
);
198 VERIFY( !ok
&& a
.load() == 5 && expected
== 5 );
200 while (!a
.compare_exchange_weak(expected
, 4))
201 { /* weak form can fail spuriously */ }
202 VERIFY( a
.load() == 4 && expected
== 5 );
204 while (!a
.compare_exchange_weak(expected
, 6, mo
))
205 { /* weak form can fail spuriously */ }
206 VERIFY( a
.load() == 6 && expected
== 4 );
207 expected
= a
.load() + 1;
208 ok
= a
.compare_exchange_weak(expected
, -8);
209 VERIFY( !ok
&& a
.load() == 6 && expected
== 6 );
210 expected
= a
.load() + 1;
211 ok
= a
.compare_exchange_weak(expected
, 8, mo
);
212 VERIFY( !ok
&& a
.load() == 6 && expected
== 6 );
214 ok
= a
.compare_exchange_strong(expected
, -6);
215 VERIFY( ok
&& a
.load() == (unsigned short)-6 && expected
== 6 );
217 ok
= a
.compare_exchange_strong(expected
, 7, mo
);
218 VERIFY( ok
&& a
.load() == 7 && expected
== (unsigned short)-6 );
219 expected
= a
.load() + 1;
220 ok
= a
.compare_exchange_strong(expected
, 2);
221 VERIFY( !ok
&& a
.load() == 7 && expected
== 7 );
222 expected
= a
.load() + 1;
223 ok
= a
.compare_exchange_strong(expected
, 2, mo
);
224 VERIFY( !ok
&& a
.load() == 7 && expected
== 7 );
229 v
= a
.fetch_add(-30, mo
);
231 VERIFY( a
== (unsigned short)-21 );
234 VERIFY( v
== (unsigned short)-21 );
235 VERIFY( a
== (unsigned short)-24 );
236 v
= a
.fetch_sub((unsigned short)-41, mo
);
237 VERIFY( v
== (unsigned short)-24 );
240 v
= a
.fetch_and(0x21);
244 v
= a
.fetch_and(0x23, mo
);
248 v
= a
.fetch_or(0x21);
251 v
= a
.fetch_or(0x44, mo
);
255 v
= a
.fetch_xor(0x21);
258 v
= a
.fetch_xor(0x12, mo
);
297 VERIFY( value
== 0x24 );
303 std::atomic_ref
<int> a0(i
);
304 std::atomic_ref
<int> a1(i
);
305 std::atomic_ref
<int> a2(a0
);
315 std::atomic_ref
<int> a(i
);
317 VERIFY( a
== INT_MAX
);
319 VERIFY( a
== INT_MIN
);