diff --git a/stl/inc/optional b/stl/inc/optional index 14cf3f65127..8e8e0a4745a 100644 --- a/stl/inc/optional +++ b/stl/inc/optional @@ -952,8 +952,19 @@ _NODISCARD constexpr bool operator>=(const _Ty1& _Left, const optional<_Ty2>& _R } #if _HAS_CXX20 +#ifdef __EDG__ // TRANSITION, DevCom-10880933 +template +void _Derived_from_optional_impl(const optional<_Ty>&); + +template +concept _Derived_from_optional = requires(const _Ty& __obj) { _STD _Derived_from_optional_impl(__obj); }; +#else // ^^^ workaround / no workaround vvv +template +concept _Derived_from_optional = requires(const _Ty& __obj) { [](const optional<_Uty>&) {}(__obj); }; +#endif // ^^^ no workaround ^^^ + _EXPORT_STD template - requires (!_Derived_from_specialization_of<_Ty2, optional>) && three_way_comparable_with<_Ty1, _Ty2> + requires (!_Derived_from_optional<_Ty2>) && three_way_comparable_with<_Ty1, _Ty2> _NODISCARD constexpr compare_three_way_result_t<_Ty1, _Ty2> operator<=>(const optional<_Ty1>& _Left, const _Ty2& _Right) noexcept(noexcept(*_Left <=> _Right)) /* strengthened */ { if (_Left) { diff --git a/stl/inc/xutility b/stl/inc/xutility index fbce0c9df7c..cd756384c6b 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -824,14 +824,6 @@ using _Algorithm_int_t = conditional_t, _Ty, ptrdiff_t>; template concept _Destructible_object = is_object_v<_Ty> && destructible<_Ty>; -template