Tested on x86_64-pc-linux-gnu with GLIBCXX_TESTSUITE_STDS=11,14,20,
does this look OK for trunk and backports (after r16-7199 gets
backported)?  Also tested with Clang 21.

-- >8 --

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 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/cons/static_zero_padding.cc
        [C++11]: Enable test verifying cleared padding bits for a
        std::atomic local variable.
---
 libstdc++-v3/include/std/atomic                              | 5 ++++-
 .../testsuite/29_atomics/atomic/cons/static_zero_padding.cc  | 2 --
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic
index 56dbe7bf5b95..306667e3c633 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/cons/static_zero_padding.cc 
b/libstdc++-v3/testsuite/29_atomics/atomic/cons/static_zero_padding.cc
index 506513647c6c..e3594fb1c8ea 100644
--- a/libstdc++-v3/testsuite/29_atomics/atomic/cons/static_zero_padding.cc
+++ b/libstdc++-v3/testsuite/29_atomics/atomic/cons/static_zero_padding.cc
@@ -57,9 +57,7 @@ void test_struct(std::atomic<T>& g, const T& zp)
 
   std::atomic<T> 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
 
   constexpr std::atomic<T> cl(T{1, 2});
 }
-- 
2.53.0.68.g864f55e190

Reply via email to