https://gcc.gnu.org/g:e309e09187c07589901df1d3913e4def4afb5817
commit r17-808-ge309e09187c07589901df1d3913e4def4afb5817 Author: Jonathan Wakely <[email protected]> Date: Thu May 21 17:09:47 2026 +0100 libstdc++: Deprecate std::memory_order::consume 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. gcc/testsuite/ChangeLog: * g++.dg/warn/Winvalid-memory-model-2.C: Disable deprecated warnings for C++26 and up. * g++.dg/warn/Winvalid-memory-model.C: Likewise. Reviewed-by: Tomasz KamiĆski <[email protected]> Diff: --- .../g++.dg/warn/Winvalid-memory-model-2.C | 3 ++- gcc/testsuite/g++.dg/warn/Winvalid-memory-model.C | 3 ++- libstdc++-v3/include/bits/atomic_base.h | 29 ++++++++++++++++------ libstdc++-v3/include/c_compatibility/stdatomic.h | 3 +++ .../requirements/compare_exchange_lowering.cc | 2 ++ .../atomic_flag/test_and_set/explicit-hle.cc | 2 ++ .../29_atomics/headers/atomic/types_std_c++0x.cc | 2 +- .../29_atomics/headers/stdatomic.h/c_compat.cc | 4 ++- 8 files changed, 37 insertions(+), 11 deletions(-) diff --git a/gcc/testsuite/g++.dg/warn/Winvalid-memory-model-2.C b/gcc/testsuite/g++.dg/warn/Winvalid-memory-model-2.C index a15706159aaf..05d5c4eda21d 100644 --- a/gcc/testsuite/g++.dg/warn/Winvalid-memory-model-2.C +++ b/gcc/testsuite/g++.dg/warn/Winvalid-memory-model-2.C @@ -2,7 +2,8 @@ -Wsystem-headers Verify warnings for atomic functions with optimization. { dg-do compile { target c++11 } } - { dg-options "-O1" } */ + { dg-options "-O1" } + { dg-additional-options "-Wno-deprecated-declarations" { target c++26 } } */ #include <atomic> diff --git a/gcc/testsuite/g++.dg/warn/Winvalid-memory-model.C b/gcc/testsuite/g++.dg/warn/Winvalid-memory-model.C index 0ef2c75dee76..509ce280534c 100644 --- a/gcc/testsuite/g++.dg/warn/Winvalid-memory-model.C +++ b/gcc/testsuite/g++.dg/warn/Winvalid-memory-model.C @@ -2,7 +2,8 @@ -Wsystem-headers Verify warnings for basic atomic functions with no optimization. { dg-do compile { target c++11 } } - { dg-options "-O0 -Wall" } */ + { dg-options "-O0 -Wall" } + { dg-additional-options "-Wno-deprecated-declarations" { target c++26 } } */ #include <atomic> 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 };
