This implements P3475R2, "Defang and deprecate memory_order::consume",
approved in Hagenberg, 2025.

It looks like the using-declaration for memory_order_consume in
<stdatomic.h> was not deprecated by the paper, but I don't think we can
implement that if we warn for the name in <atomic>. It doesn't make
sense to me for it to be deprecated in C++ but still usable in the C/C++
compatibility header. It's still just as useless in common C/C++
headers, so we should warn.

libstdc++-v3/ChangeLog:

        * include/bits/atomic_base.h (memory_order::consume): Add
        deprecate attribute.
        (memory_order_consume): Likewise.
        (kill_dependency): Likewise.
        (atomic_flag::clear): Disable warning with pragmas.
        (__atomic_base::store, __atomic_base<T*>::store): Likewise.
        * include/c_compatibility/stdatomic.h (memory_order_consume):
        Likewise.
        * testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc:
        Ignore deprecation warnings.
        * testsuite/29_atomics/atomic_flag/test_and_set/explicit-hle.cc:
        Likewise.
        * testsuite/29_atomics/headers/atomic/types_std_c++0x.cc: Add
        dg-warning directives.
        * testsuite/29_atomics/headers/stdatomic.h/c_compat.cc:
        Likewise.
---

Tested x86_64-linux.

 libstdc++-v3/include/bits/atomic_base.h       | 29 ++++++++++++++-----
 .../include/c_compatibility/stdatomic.h       |  3 ++
 .../requirements/compare_exchange_lowering.cc |  2 ++
 .../atomic_flag/test_and_set/explicit-hle.cc  |  2 ++
 .../headers/atomic/types_std_c++0x.cc         |  2 +-
 .../headers/stdatomic.h/c_compat.cc           |  4 ++-
 6 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/libstdc++-v3/include/bits/atomic_base.h 
b/libstdc++-v3/include/bits/atomic_base.h
index e9cf174e4607..3a8e9a7b4c1f 100644
--- a/libstdc++-v3/include/bits/atomic_base.h
+++ b/libstdc++-v3/include/bits/atomic_base.h
@@ -64,20 +64,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #if __cplusplus > 201703L
   enum class memory_order : int
     {
-      relaxed,
-      consume,
-      acquire,
-      release,
-      acq_rel,
-      seq_cst
+      relaxed = 0,
+      consume _GLIBCXX26_DEPRECATED = 1,
+      acquire = 2,
+      release = 3,
+      acq_rel = 4,
+      seq_cst = 5
     };
 
   inline constexpr memory_order memory_order_relaxed = memory_order::relaxed;
-  inline constexpr memory_order memory_order_consume = memory_order::consume;
   inline constexpr memory_order memory_order_acquire = memory_order::acquire;
   inline constexpr memory_order memory_order_release = memory_order::release;
   inline constexpr memory_order memory_order_acq_rel = memory_order::acq_rel;
   inline constexpr memory_order memory_order_seq_cst = memory_order::seq_cst;
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+  _GLIBCXX26_DEPRECATED
+  inline constexpr memory_order memory_order_consume = memory_order::consume;
+#pragma GCC diagnostic pop
 #else
   enum memory_order : int
     {
@@ -152,6 +157,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   /// kill_dependency
   template<typename _Tp>
+    _GLIBCXX26_DEPRECATED
     inline _Tp
     kill_dependency(_Tp __y) noexcept
     {
@@ -278,6 +284,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     // TODO add const volatile overload
 #endif // __glibcxx_atomic_wait
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
     _GLIBCXX_ALWAYS_INLINE void
     clear(memory_order __m = memory_order_seq_cst) noexcept
     {
@@ -301,6 +309,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       __atomic_clear (&_M_i, int(__m));
     }
+#pragma GCC diagnostic pop
 
   private:
     static constexpr __atomic_flag_data_type
@@ -482,6 +491,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
            reinterpret_cast<void *>(-_S_alignment));
       }
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
       _GLIBCXX_ALWAYS_INLINE void
       store(__int_type __i, memory_order __m = memory_order_seq_cst) noexcept
       {
@@ -506,6 +517,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
        __atomic_store_n(&_M_i, __i, int(__m));
       }
+#pragma GCC diagnostic pop
 
       _GLIBCXX_ALWAYS_INLINE __int_type
       load(memory_order __m = memory_order_seq_cst) const noexcept
@@ -831,6 +843,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
            reinterpret_cast<void *>(-__alignof(_M_p)));
       }
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
       _GLIBCXX_ALWAYS_INLINE void
       store(__pointer_type __p,
            memory_order __m = memory_order_seq_cst) noexcept
@@ -857,6 +871,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
        __atomic_store_n(&_M_p, __p, int(__m));
       }
+#pragma GCC diagnostic pop
 
       _GLIBCXX_ALWAYS_INLINE __pointer_type
       load(memory_order __m = memory_order_seq_cst) const noexcept
diff --git a/libstdc++-v3/include/c_compatibility/stdatomic.h 
b/libstdc++-v3/include/c_compatibility/stdatomic.h
index 72b9446eb170..c118d880bac3 100644
--- a/libstdc++-v3/include/c_compatibility/stdatomic.h
+++ b/libstdc++-v3/include/c_compatibility/stdatomic.h
@@ -39,7 +39,10 @@
 
 using std::memory_order;
 using std::memory_order_relaxed;
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 using std::memory_order_consume;
+#pragma GCC diagnostic pop
 using std::memory_order_acquire;
 using std::memory_order_release;
 using std::memory_order_acq_rel;
diff --git 
a/libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc
 
b/libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc
index fa69558e7239..089e4bdf48d0 100644
--- 
a/libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc
+++ 
b/libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc
@@ -20,6 +20,8 @@
 #include <atomic>
 #include <testsuite_common_types.h>
 
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
 #define TEST_ALL_ORDERS()                       \
   do {                                          \
     ORDER_TEST(std::memory_order_relaxed);      \
diff --git 
a/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/explicit-hle.cc 
b/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/explicit-hle.cc
index 587e3eea127d..f7bccfe498d5 100644
--- a/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/explicit-hle.cc
+++ b/libstdc++-v3/testsuite/29_atomics/atomic_flag/test_and_set/explicit-hle.cc
@@ -25,6 +25,8 @@
 
 #include <atomic>
 
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
 const auto ACQ = std::memory_order_acquire | std::__memory_order_hle_acquire;
 const auto REL = std::memory_order_release | std::__memory_order_hle_release;
 
diff --git 
a/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x.cc 
b/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x.cc
index 2b0685345c33..ce6e0728c4bc 100644
--- a/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x.cc
+++ b/libstdc++-v3/testsuite/29_atomics/headers/atomic/types_std_c++0x.cc
@@ -33,7 +33,7 @@ void test01()
 #if __cplusplus >= 202002L
   using std::memory_order;
   constexpr auto relaxed = memory_order::relaxed;
-  constexpr auto consume = memory_order::consume;
+  constexpr auto consume = memory_order::consume; // { dg-warning "deprecated" 
"" { target c++26 } }
   constexpr auto acquire = memory_order::acquire;
   constexpr auto release = memory_order::release;
   constexpr auto acq_rel = memory_order::acq_rel;
diff --git a/libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/c_compat.cc 
b/libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/c_compat.cc
index bcdb969b0c0f..ed980a50b353 100644
--- a/libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/c_compat.cc
+++ b/libstdc++-v3/testsuite/29_atomics/headers/stdatomic.h/c_compat.cc
@@ -41,7 +41,9 @@
 #endif
 
 constexpr const memory_order* orders[] = {
-  &memory_order_relaxed, &memory_order_consume, &memory_order_acquire,
+  &memory_order_relaxed,
+  &memory_order_consume, // { dg-warning "deprecated" "" { target c++26 } }
+  &memory_order_acquire,
   &memory_order_release, &memory_order_acq_rel, &memory_order_seq_cst
 };
 
-- 
2.54.0

Reply via email to