https://gcc.gnu.org/g:682c95b808724e6f876ea709b873ac6771704d7b
commit r16-7460-g682c95b808724e6f876ea709b873ac6771704d7b Author: Tomasz KamiĆski <[email protected]> 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
