From: Patrick Palka Date: Thu, 12 Feb 2026 02:35:21 +0000 (-0500) Subject: libstdc++: Clear padding bits in std::atomic ctor in C++11 [PR114865] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=48f2e8aa6ddad72955781728bdf515eb50411d24;p=thirdparty%2Fgcc.git libstdc++: Clear padding bits in std::atomic ctor in C++11 [PR114865] After the front end change r16-7199 both GCC and Clang allow non-empty constexpr constructor bodies in C++11 as an extension, so we can now unconditionally enable the __builtin_clear_padding logic in std::atomic's constructor. PR libstdc++/114865 libstdc++-v3/ChangeLog: * include/std/atomic (atomic<_Tp>::atomic(_Tp)) [C++11]: Enable __builtin_clear_padding logic. * testsuite/29_atomics/atomic/compare_exchange_padding.cc: Enable this test in earlier modes, including C++11. * testsuite/29_atomics/atomic/cons/zero_padding.cc [C++11]: Enable tests verifying cleared padding bits for a non-static-init std::atomic object. Reviewed-by: Tomasz KamiƄski Reviewed-by: Jonathan Wakely --- diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic index 56dbe7bf5b9..306667e3c63 100644 --- a/libstdc++-v3/include/std/atomic +++ b/libstdc++-v3/include/std/atomic @@ -247,14 +247,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION atomic& operator=(const atomic&) = delete; atomic& operator=(const atomic&) volatile = delete; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wc++14-extensions" // constexpr ctor body constexpr atomic(_Tp __i) noexcept : _M_i(__i) { -#if __cplusplus >= 201402L && __has_builtin(__builtin_clear_padding) +#if __has_builtin(__builtin_clear_padding) if _GLIBCXX17_CONSTEXPR (__atomic_impl::__maybe_has_padding<_Tp>()) if (!std::__is_constant_evaluated()) __builtin_clear_padding(std::__addressof(_M_i)); #endif } +#pragma GCC diagnostic pop operator _Tp() const noexcept { return load(); } diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/compare_exchange_padding.cc b/libstdc++-v3/testsuite/29_atomics/atomic/compare_exchange_padding.cc index a6081968ca8..d9c7b90c1a5 100644 --- a/libstdc++-v3/testsuite/29_atomics/atomic/compare_exchange_padding.cc +++ b/libstdc++-v3/testsuite/29_atomics/atomic/compare_exchange_padding.cc @@ -1,4 +1,4 @@ -// { dg-do run { target c++20 } } +// { dg-do run { target c++11 } } // { dg-require-atomic-cmpxchg-word "" } // { dg-add-options libatomic } // { dg-additional-options "-fno-tree-sra" } diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/cons/zero_padding.cc b/libstdc++-v3/testsuite/29_atomics/atomic/cons/zero_padding.cc index 0d6579b5ab6..ad48d66de3a 100644 --- a/libstdc++-v3/testsuite/29_atomics/atomic/cons/zero_padding.cc +++ b/libstdc++-v3/testsuite/29_atomics/atomic/cons/zero_padding.cc @@ -57,15 +57,11 @@ void test_struct(std::atomic& g, const T& zp) std::atomic l(T{1, 2}); std::memcpy(&t, &zp, sizeof(T)); -#if __cplusplus >= 201402L // Remove once PR114865 is fixed VERIFY( l.compare_exchange_strong(t, d) ); -#endif std::atomic* h = new std::atomic(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 cl(T{1, 2});