aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2024-04-11 19:12:48 +0100
committerJonathan Wakely <jwakely@redhat.com>2024-05-15 10:18:14 +0100
commit99dd1be14172445795f0012b935359e7014a2215 (patch)
tree3f8b6c596ca70dfb775f80fc512e20ef14769aa6
parent642f31d6286b8a342130fbface51530befd975fd (diff)
downloadgcc-99dd1be14172445795f0012b935359e7014a2215.zip
gcc-99dd1be14172445795f0012b935359e7014a2215.tar.gz
gcc-99dd1be14172445795f0012b935359e7014a2215.tar.bz2
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.
-rw-r--r--libstdc++-v3/include/bits/atomic_base.h4
-rw-r--r--libstdc++-v3/testsuite/29_atomics/atomic/89624.cc9
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 dd36030..062f154 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 0000000..480f7c6
--- /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");