[gcc r16-7460] libstdc++: Add test for atomic with padding on heap [PR123875]
Tomasz Kaminski
tkaminsk@gcc.gnu.org
Wed Feb 11 14:41:38 GMT 2026
https://gcc.gnu.org/g:682c95b808724e6f876ea709b873ac6771704d7b
commit r16-7460-g682c95b808724e6f876ea709b873ac6771704d7b
Author: Tomasz Kamiński <tkaminsk@redhat.com>
Date: Wed Feb 11 15:05:00 2026 +0100
libstdc++: Add test for atomic with padding on heap [PR123875]
C++26 makes the values of uninitialized stack object erroneous,
de-facto requiring their initialization, so adding a test for
variable on heap.
PR libstdc++/123875
libstdc++-v3/ChangeLog:
* testsuite/29_atomics/atomic/cons/static_zero_padding.cc: Move to...
* testsuite/29_atomics/atomic/cons/zero_padding.cc: ...here and
added heap tests. Also fixed trailing whitespaces.
Diff:
---
.../{static_zero_padding.cc => zero_padding.cc} | 28 +++++++++++++++-------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/cons/static_zero_padding.cc b/libstdc++-v3/testsuite/29_atomics/atomic/cons/zero_padding.cc
similarity index 79%
rename from libstdc++-v3/testsuite/29_atomics/atomic/cons/static_zero_padding.cc
rename to libstdc++-v3/testsuite/29_atomics/atomic/cons/zero_padding.cc
index 506513647c6c..0d6579b5ab6e 100644
--- a/libstdc++-v3/testsuite/29_atomics/atomic/cons/static_zero_padding.cc
+++ b/libstdc++-v3/testsuite/29_atomics/atomic/cons/zero_padding.cc
@@ -44,15 +44,15 @@ void test_struct(std::atomic<T>& g, const T& zp)
T const d{3, 4};
T t;
- std::memcpy(&t, &zp, sizeof(T));
+ std::memcpy(&t, &zp, sizeof(T));
VERIFY( g.compare_exchange_strong(t, d) );
static std::atomic<T> st(T{1, 2});
- std::memcpy(&t, &zp, sizeof(T));
+ std::memcpy(&t, &zp, sizeof(T));
VERIFY( st.compare_exchange_strong(t, d) );
thread_local std::atomic<T> tl(T{1, 2});
- std::memcpy(&t, &zp, sizeof(T));
+ std::memcpy(&t, &zp, sizeof(T));
VERIFY( tl.compare_exchange_strong(t, d) );
std::atomic<T> l(T{1, 2});
@@ -61,6 +61,13 @@ void test_struct(std::atomic<T>& g, const T& zp)
VERIFY( l.compare_exchange_strong(t, d) );
#endif
+ std::atomic<T>* h = new std::atomic<T>(T{1, 2});
+ std::memcpy(&t, &zp, sizeof(T));
+#if __cplusplus >= 201402L // Remove once PR114865 is fixed
+ VERIFY( h->compare_exchange_strong(t, d) );
+#endif
+ delete h;
+
constexpr std::atomic<T> cl(T{1, 2});
}
@@ -75,21 +82,26 @@ void test_floating(std::atomic<T>& g, const T& zp)
T const d = T(7.5);
T t;
- std::memcpy(&t, &zp, sizeof(T));
+ std::memcpy(&t, &zp, sizeof(T));
VERIFY( g.compare_exchange_strong(t, d) );
static std::atomic<T> st(T(10.5));
- std::memcpy(&t, &zp, sizeof(T));
+ std::memcpy(&t, &zp, sizeof(T));
VERIFY( st.compare_exchange_strong(t, d) );
thread_local std::atomic<T> tl(T(10.5));
- std::memcpy(&t, &zp, sizeof(T));
+ std::memcpy(&t, &zp, sizeof(T));
VERIFY( tl.compare_exchange_strong(t, d) );
std::atomic<T> l(T(10.5));
- std::memcpy(&t, &zp, sizeof(T));
+ std::memcpy(&t, &zp, sizeof(T));
VERIFY( l.compare_exchange_strong(t, d) );
-
+
+ std::atomic<T>* h = new std::atomic<T>(T(10.5));
+ std::memcpy(&t, &zp, sizeof(T));
+ VERIFY( h->compare_exchange_strong(t, d) );
+ delete h;
+
constexpr std::atomic<T> cl(T(10.5));
}
#endif
More information about the Libstdc++-cvs
mailing list