diff --git a/stl/inc/atomic b/stl/inc/atomic index 9b6d178f195..a8d5ceecb73 100644 --- a/stl/inc/atomic +++ b/stl/inc/atomic @@ -161,7 +161,7 @@ _Ty kill_dependency(_Ty _Arg) noexcept { // "magic" template that kills dependen // FUNCTION _Check_memory_order inline void _Check_memory_order(const memory_order _Order) noexcept { // check that _Order is a valid memory_order - if (static_cast(_Order) > memory_order_seq_cst) { + if (static_cast(_Order) > static_cast(memory_order_seq_cst)) { _INVALID_MEMORY_ORDER; } } @@ -230,7 +230,7 @@ _NODISCARD inline memory_order _Combine_cas_memory_orders( _Check_memory_order(_Success); _Check_load_memory_order(_Failure); - return _Combined_memory_orders[_Success][_Failure]; + return _Combined_memory_orders[static_cast(_Success)][static_cast(_Failure)]; } // FUNCTION TEMPLATE _Atomic_reinterpret_as diff --git a/stl/inc/xatomic.h b/stl/inc/xatomic.h index 28357d8a313..1562df01000 100644 --- a/stl/inc/xatomic.h +++ b/stl/inc/xatomic.h @@ -55,6 +55,16 @@ _STL_DISABLE_CLANG_WARNINGS _STD_BEGIN +#if _HAS_CXX20 +// ENUM CLASS memory_order +enum class memory_order : int { relaxed, consume, acquire, release, acq_rel, seq_cst }; +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; +#else // _HAS_CXX20 // ENUM memory_order enum memory_order { memory_order_relaxed, @@ -64,6 +74,7 @@ enum memory_order { memory_order_acq_rel, memory_order_seq_cst }; +#endif // _HAS_CXX20 using _Atomic_counter_t = unsigned long; diff --git a/stl/inc/yvals_core.h b/stl/inc/yvals_core.h index 2a40f1bb0f9..84213b67189 100644 --- a/stl/inc/yvals_core.h +++ b/stl/inc/yvals_core.h @@ -22,6 +22,7 @@ // P0020R6 atomic, atomic, atomic // P0318R1 unwrap_reference, unwrap_ref_decay // P0325R4 to_array() +// P0439R0 enum class memory_order // P0457R2 starts_with()/ends_with() For basic_string/basic_string_view // P0458R2 contains() For Ordered And Unordered Associative Containers // P0463R1 endian