<div dir="auto"><div><br><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Sat, 28 Mar 2026, 13:50 Tomasz Kamiński, <<a href="mailto:tkaminsk@redhat.com">tkaminsk@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This implements with P3936R1 Safer atomic_ref::address with<br>
the bump to __cpp_lib_atomic_ref feture test macro.<br>
<br>
libstdc++-v3/ChangeLog:<br>
<br>
* include/bits/atomic_base.h (__atomic_ref_base::_Address_return_t):<br>
Define.<br>
(__atomic_ref_base::address): Change return type to _Address_return_t.<br>
* include/bits/version.def (atomic_ref): Bump to 202503.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">The new value should be 202603.</div><div dir="auto"><br></div><div dir="auto">OK with that change.</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote gmail_quote_container"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
* include/bits/version.h: Regenerate.<br>
* testsuite/29_atomics/atomic_ref/address.cc: Update check for<br>
return type.<br>
---<br>
Tested *atomic_ref* on x86_64-linux.<br>
OK for trunk when full testsuite passes?<br>
<br>
libstdc++-v3/include/bits/atomic_base.h | 10 ++++++++--<br>
libstdc++-v3/include/bits/version.def | 2 +-<br>
libstdc++-v3/include/bits/version.h | 4 ++--<br>
.../testsuite/29_atomics/atomic_ref/address.cc | 12 ++++++------<br>
4 files changed, 17 insertions(+), 11 deletions(-)<br>
<br>
diff --git a/libstdc++-v3/include/bits/atomic_base.h b/libstdc++-v3/include/bits/atomic_base.h<br>
index 6c5b83a0818..62970108ea6 100644<br>
--- a/libstdc++-v3/include/bits/atomic_base.h<br>
+++ b/libstdc++-v3/include/bits/atomic_base.h<br>
@@ -1649,6 +1649,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
{<br>
private:<br>
using _Vt = remove_cv_t<_Tp>;<br>
+ using _Address_return_t = __conditional_t<is_volatile_v<_Tp>,<br>
+ const volatile void*, const void*>;<br>
<br>
static consteval bool<br>
_S_is_always_lock_free()<br>
@@ -1714,7 +1716,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
#endif // __glibcxx_atomic_wait<br>
<br>
#if __glibcxx_atomic_ref >= 202411L<br>
- _GLIBCXX_ALWAYS_INLINE constexpr const _Tp*<br>
+ _GLIBCXX_ALWAYS_INLINE constexpr const _Address_return_t<br>
address() const noexcept<br>
{ return _M_ptr; }<br>
#endif // __glibcxx_atomic_ref >= 202411L<br>
@@ -1727,6 +1729,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
struct __atomic_ref_base<br>
: __atomic_ref_base<const _Tp><br>
{<br>
+ using _Address_return_t = __conditional_t<is_volatile_v<_Tp>,<br>
+ volatile void*, void*>;<br>
+<br>
+ public:<br>
using value_type = typename __atomic_ref_base<const _Tp>::value_type;<br>
<br>
explicit<br>
@@ -1807,7 +1813,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION<br>
#endif // __glibcxx_atomic_wait<br>
<br>
#if __glibcxx_atomic_ref >= 202411L<br>
- _GLIBCXX_ALWAYS_INLINE constexpr _Tp*<br>
+ _GLIBCXX_ALWAYS_INLINE constexpr _Address_return_t<br>
address() const noexcept<br>
{ return this->_M_ptr; }<br>
#endif // __glibcxx_atomic_ref >= 202411L<br>
diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def<br>
index dd77524b5a9..5aaf1550829 100644<br>
--- a/libstdc++-v3/include/bits/version.def<br>
+++ b/libstdc++-v3/include/bits/version.def<br>
@@ -817,7 +817,7 @@ ftms = {<br>
ftms = {<br>
name = atomic_ref;<br>
values = {<br>
- v = 202411;<br>
+ v = 202503;<br>
cxxmin = 26;<br>
};<br>
values = {<br>
diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h<br>
index bef61baeba8..ed1f0028691 100644<br>
--- a/libstdc++-v3/include/bits/version.h<br>
+++ b/libstdc++-v3/include/bits/version.h<br>
@@ -910,9 +910,9 @@<br>
<br>
#if !defined(__cpp_lib_atomic_ref)<br>
# if (__cplusplus > 202302L)<br>
-# define __glibcxx_atomic_ref 202411L<br>
+# define __glibcxx_atomic_ref 202503L<br>
# if defined(__glibcxx_want_all) || defined(__glibcxx_want_atomic_ref)<br>
-# define __cpp_lib_atomic_ref 202411L<br>
+# define __cpp_lib_atomic_ref 202503L<br>
# endif<br>
# elif (__cplusplus >= 202002L)<br>
# define __glibcxx_atomic_ref 201806L<br>
diff --git a/libstdc++-v3/testsuite/29_atomics/atomic_ref/address.cc b/libstdc++-v3/testsuite/29_atomics/atomic_ref/address.cc<br>
index e2eda506efa..d4bb500185e 100644<br>
--- a/libstdc++-v3/testsuite/29_atomics/atomic_ref/address.cc<br>
+++ b/libstdc++-v3/testsuite/29_atomics/atomic_ref/address.cc<br>
@@ -8,26 +8,26 @@<br>
<br>
#include <testsuite_hooks.h><br>
<br>
-template <typename T><br>
+template <typename T, typename CVV><br>
void testAtomicRefAddress()<br>
{<br>
T x(T(42));<br>
const std::atomic_ref<T> a(x);<br>
<br>
static_assert( noexcept(a.address()) );<br>
- static_assert( std::is_same_v<decltype(a.address()), T*> );<br>
+ static_assert( std::is_same_v<decltype(a.address()), CVV*> );<br>
VERIFY( std::addressof(x) == a.address() );<br>
}<br>
<br>
template <typename T><br>
void testAtomicRefAddressForCV()<br>
{<br>
- testAtomicRefAddress<T>();<br>
- testAtomicRefAddress<const T>();<br>
+ testAtomicRefAddress<T, void>();<br>
+ testAtomicRefAddress<const T, const void>();<br>
if constexpr (std::atomic_ref<T>::is_always_lock_free)<br>
{<br>
- testAtomicRefAddress<volatile T>();<br>
- testAtomicRefAddress<const volatile T>();<br>
+ testAtomicRefAddress<volatile T, volatile void>();<br>
+ testAtomicRefAddress<const volatile T, const volatile void>();<br>
}<br>
}<br>
<br>
-- <br>
2.53.0<br>
<br>
</blockquote></div></div></div>