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