https://gcc.gnu.org/g:99dd1be14172445795f0012b935359e7014a2215
commit r15-502-g99dd1be14172445795f0012b935359e7014a2215 Author: Jonathan Wakely <jwak...@redhat.com> Date: Thu Apr 11 19:12:48 2024 +0100 libstdc++: Give std::memory_order a fixed underlying type [PR89624] Prior to C++20 this enum type doesn't have a fixed underlying type, which means it can be modified by -fshort-enums, which then means the HLE bits are outside the range of valid values for the type. As it has a fixed type of int in C++20 and later, do the same for earlier standards too. This is technically a change for C++17 down, because the implicit underlying type (without -fshort-enums) was unsigned before. I doubt it matters in practice. That incompatibility already exists between C++17 and C++20 and nobody has noticed or complained. Now at least the underlying type will be int for all -std modes. libstdc++-v3/ChangeLog: PR libstdc++/89624 * include/bits/atomic_base.h (memory_order): Use int as underlying type. * testsuite/29_atomics/atomic/89624.cc: New test. Diff: --- libstdc++-v3/include/bits/atomic_base.h | 4 ++-- libstdc++-v3/testsuite/29_atomics/atomic/89624.cc | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/include/bits/atomic_base.h b/libstdc++-v3/include/bits/atomic_base.h index dd360302f801..062f15497403 100644 --- a/libstdc++-v3/include/bits/atomic_base.h +++ b/libstdc++-v3/include/bits/atomic_base.h @@ -78,7 +78,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline constexpr memory_order memory_order_acq_rel = memory_order::acq_rel; inline constexpr memory_order memory_order_seq_cst = memory_order::seq_cst; #else - typedef enum memory_order + enum memory_order : int { memory_order_relaxed, memory_order_consume, @@ -86,7 +86,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION memory_order_release, memory_order_acq_rel, memory_order_seq_cst - } memory_order; + }; #endif /// @cond undocumented diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/89624.cc b/libstdc++-v3/testsuite/29_atomics/atomic/89624.cc new file mode 100644 index 000000000000..480f7c65e2d7 --- /dev/null +++ b/libstdc++-v3/testsuite/29_atomics/atomic/89624.cc @@ -0,0 +1,9 @@ +// { dg-options "-fshort-enums" } +// { dg-do compile { target c++11 } } + +// Bug 89624 HLE bits don't work with -fshort-enums or -fstrict-enums + +#include <atomic> + +static_assert((std::memory_order_acquire | std::__memory_order_hle_acquire) + != std::memory_order_acquire, "HLE acquire sets a bit");