Index: include/atomic =================================================================== --- include/atomic +++ include/atomic @@ -584,9 +584,18 @@ _LIBCPP_BEGIN_NAMESPACE_STD +// Figure out what the underlying type for `memory_order` would be if it were +// declared as an unscoped enum (accounting for -fshort-enums). Use this result +// to pin the underlying type in C++20. +struct __legacy_memory_order { + enum __enum_type { __v1, __v2, __v3, __v4, __v5, __v6 }; +}; + +typedef underlying_type<__legacy_memory_order::__enum_type>::type __memory_order_underlying_t; + #if _LIBCPP_STD_VER > 17 -enum class memory_order { +enum class memory_order : __memory_order_underlying_t { relaxed, consume, acquire, release, acq_rel, seq_cst }; @@ -606,8 +615,8 @@ #endif // _LIBCPP_STD_VER > 17 -typedef underlying_type::type __memory_order_underlying_t; - +static_assert(is_same::type, __memory_order_underlying_t>::value, + "unexpected underlying type for std::memory_order"); #if defined(_LIBCPP_HAS_GCC_ATOMIC_IMP) || \ defined(_LIBCPP_ATOMIC_ONLY_USE_BUILTINS)