[gcc r16-8334] libstdc++: Change atomic_ref::address return type to cv void*.

Tomasz Kaminski tkaminsk@gcc.gnu.org
Mon Mar 30 16:02:53 GMT 2026


https://gcc.gnu.org/g:63ea5ff289575f3a909f1a157ece7f95c343069f

commit r16-8334-g63ea5ff289575f3a909f1a157ece7f95c343069f
Author: Tomasz Kamiński <tkaminsk@redhat.com>
Date:   Mon Mar 23 21:25:58 2026 +0100

    libstdc++: Change atomic_ref::address return type to cv void*.
    
    This implements with P3936R1 Safer atomic_ref::address with
    the bump to __cpp_lib_atomic_ref feture test macro.
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/atomic_base.h (__atomic_ref_base::_Address_return_t):
            Define.
            (__atomic_ref_base::address): Change return type to _Address_return_t.
            * include/bits/version.def (atomic_ref): Bump to 202603.
            * include/bits/version.h: Regenerate.
            * testsuite/29_atomics/atomic_ref/address.cc: Update check for
            return type.
    
    Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
    Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>

Diff:
---
 libstdc++-v3/include/bits/atomic_base.h                 | 14 ++++++++++----
 libstdc++-v3/include/bits/version.def                   |  2 +-
 libstdc++-v3/include/bits/version.h                     |  4 ++--
 libstdc++-v3/testsuite/29_atomics/atomic_ref/address.cc | 12 ++++++------
 4 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/libstdc++-v3/include/bits/atomic_base.h b/libstdc++-v3/include/bits/atomic_base.h
index 6c5b83a08182..e9cf174e4607 100644
--- a/libstdc++-v3/include/bits/atomic_base.h
+++ b/libstdc++-v3/include/bits/atomic_base.h
@@ -1649,6 +1649,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     {
     private:
       using _Vt = remove_cv_t<_Tp>;
+      using _Address_return_t = __conditional_t<is_volatile_v<_Tp>,
+						const volatile void*, const void*>;
 
       static consteval bool
       _S_is_always_lock_free()
@@ -1713,8 +1715,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       }
 #endif // __glibcxx_atomic_wait
 
-#if __glibcxx_atomic_ref >= 202411L
-      _GLIBCXX_ALWAYS_INLINE constexpr const _Tp*
+#if __glibcxx_atomic_ref >= 202603L
+      _GLIBCXX_ALWAYS_INLINE constexpr _Address_return_t
       address() const noexcept
       { return _M_ptr; }
 #endif // __glibcxx_atomic_ref >= 202411L
@@ -1727,6 +1729,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct __atomic_ref_base
       : __atomic_ref_base<const _Tp>
     {
+      using _Address_return_t = __conditional_t<is_volatile_v<_Tp>,
+						volatile void*, void*>;
+
+    public:
       using value_type = typename __atomic_ref_base<const _Tp>::value_type;
 
       explicit
@@ -1806,8 +1812,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       }
 #endif // __glibcxx_atomic_wait
 
-#if __glibcxx_atomic_ref >= 202411L
-      _GLIBCXX_ALWAYS_INLINE constexpr _Tp*
+#if __glibcxx_atomic_ref >= 202603L
+      _GLIBCXX_ALWAYS_INLINE constexpr _Address_return_t
       address() const noexcept
       { return this->_M_ptr; }
 #endif // __glibcxx_atomic_ref >= 202411L
diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def
index 4cc2f79b3673..bb513e391d76 100644
--- a/libstdc++-v3/include/bits/version.def
+++ b/libstdc++-v3/include/bits/version.def
@@ -817,7 +817,7 @@ ftms = {
 ftms = {
   name = atomic_ref;
   values = {
-    v = 202411;
+    v = 202603;
     cxxmin = 26;
   };
   values = {
diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h
index c19f53ce71f4..e469944208a7 100644
--- a/libstdc++-v3/include/bits/version.h
+++ b/libstdc++-v3/include/bits/version.h
@@ -910,9 +910,9 @@
 
 #if !defined(__cpp_lib_atomic_ref)
 # if (__cplusplus >  202302L)
-#  define __glibcxx_atomic_ref 202411L
+#  define __glibcxx_atomic_ref 202603L
 #  if defined(__glibcxx_want_all) || defined(__glibcxx_want_atomic_ref)
-#   define __cpp_lib_atomic_ref 202411L
+#   define __cpp_lib_atomic_ref 202603L
 #  endif
 # elif (__cplusplus >= 202002L)
 #  define __glibcxx_atomic_ref 201806L
diff --git a/libstdc++-v3/testsuite/29_atomics/atomic_ref/address.cc b/libstdc++-v3/testsuite/29_atomics/atomic_ref/address.cc
index e2eda506efa2..d4bb500185ea 100644
--- a/libstdc++-v3/testsuite/29_atomics/atomic_ref/address.cc
+++ b/libstdc++-v3/testsuite/29_atomics/atomic_ref/address.cc
@@ -8,26 +8,26 @@
 
 #include <testsuite_hooks.h>
 
-template <typename T>
+template <typename T, typename CVV>
 void testAtomicRefAddress()
 {
   T x(T(42));
   const std::atomic_ref<T> a(x);
 
   static_assert( noexcept(a.address()) );
-  static_assert( std::is_same_v<decltype(a.address()), T*> );
+  static_assert( std::is_same_v<decltype(a.address()), CVV*> );
   VERIFY( std::addressof(x) == a.address() );
 }
 
 template <typename T>
 void testAtomicRefAddressForCV()
 {
-  testAtomicRefAddress<T>();
-  testAtomicRefAddress<const T>();
+  testAtomicRefAddress<T, void>();
+  testAtomicRefAddress<const T, const void>();
   if constexpr (std::atomic_ref<T>::is_always_lock_free)
   {
-    testAtomicRefAddress<volatile T>();
-    testAtomicRefAddress<const volatile T>();
+    testAtomicRefAddress<volatile T, volatile void>();
+    testAtomicRefAddress<const volatile T, const volatile void>();
   }
 }


More information about the Libstdc++-cvs mailing list