diff --git a/stl/inc/ranges b/stl/inc/ranges index 383ac8a3ace..0033e663051 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -1160,16 +1160,20 @@ namespace ranges { constexpr _Iterator& operator+=(difference_type _Off) noexcept /* strengthened */ { #if _ITERATOR_DEBUG_LEVEL != 0 - if constexpr (sizeof(difference_type) > sizeof(_Index_type)) { - _STL_VERIFY(static_cast<_Index_type>(_Off) == _Off, - _Off > 0 ? "cannot advance repeat_view iterator past end (integer overflow)" - : "cannot advance repeat_view iterator before begin (integer overflow)"); - } - if (_Off > 0) { + if constexpr (sizeof(difference_type) > sizeof(_Index_type)) { + _STL_VERIFY(static_cast<_Index_type>(_Off) == _Off, + "cannot advance repeat_view iterator past end (integer overflow)"); + } + _STL_VERIFY(_Current <= (numeric_limits<_Index_type>::max)() - static_cast<_Index_type>(_Off), "cannot advance repeat_view iterator past end (integer overflow)"); } else { + if constexpr (sizeof(difference_type) > sizeof(_Index_type)) { + _STL_VERIFY(static_cast<_Index_type>(_Off) == _Off, + "cannot advance repeat_view iterator before begin (integer overflow)"); + } + _STL_VERIFY(_Current >= (numeric_limits<_Index_type>::min)() - static_cast<_Index_type>(_Off), "cannot advance repeat_view iterator before begin (integer overflow)"); } @@ -1183,16 +1187,20 @@ namespace ranges { } constexpr _Iterator& operator-=(difference_type _Off) noexcept /* strengthened */ { #if _ITERATOR_DEBUG_LEVEL != 0 - if constexpr (sizeof(difference_type) > sizeof(_Index_type)) { - _STL_VERIFY(static_cast<_Index_type>(_Off) == _Off, - _Off < 0 ? "cannot advance repeat_view iterator past end (integer overflow)" - : "cannot advance repeat_view iterator before begin (integer overflow)"); - } - if (_Off < 0) { + if constexpr (sizeof(difference_type) > sizeof(_Index_type)) { + _STL_VERIFY(static_cast<_Index_type>(_Off) == _Off, + "cannot advance repeat_view iterator past end (integer overflow)"); + } + _STL_VERIFY(_Current <= (numeric_limits<_Index_type>::max)() + static_cast<_Index_type>(_Off), "cannot advance repeat_view iterator past end (integer overflow)"); } else { + if constexpr (sizeof(difference_type) > sizeof(_Index_type)) { + _STL_VERIFY(static_cast<_Index_type>(_Off) == _Off, + "cannot advance repeat_view iterator before begin (integer overflow)"); + } + _STL_VERIFY(_Current >= (numeric_limits<_Index_type>::min)() + static_cast<_Index_type>(_Off), "cannot advance repeat_view iterator before begin (integer overflow)"); } diff --git a/stl/inc/yvals.h b/stl/inc/yvals.h index c8cfa973615..f6c6d4a2288 100644 --- a/stl/inc/yvals.h +++ b/stl/inc/yvals.h @@ -242,12 +242,16 @@ _EMIT_STL_ERROR(STL1008, "_STL_CALL_ABORT_INSTEAD_OF_INVALID_PARAMETER has been // a non-void function, etc.), but it will not attempt to replace undefined behavior with implementation-defined // behavior. (For example, we will not transform `pop_back()` of an empty `vector` to be a no-op.) #ifndef _MSVC_STL_DOOM_FUNCTION -#ifdef _MSVC_STL_USE_ABORT_AS_DOOM_FUNCTION +#ifdef _MSVC_STL_USE_ABORT_AS_DOOM_FUNCTION // The user wants to use abort(): #define _MSVC_STL_DOOM_FUNCTION(mesg) _CSTD abort() -#else // ^^^ defined(_MSVC_STL_USE_ABORT_AS_DOOM_FUNCTION) / !defined(_MSVC_STL_USE_ABORT_AS_DOOM_FUNCTION) vvv -// TRANSITION, GH-4858: after dropping Win7 support, we can directly call __fastfail(FAST_FAIL_INVALID_ARG). +#elif defined(__clang__) // Use the Clang intrinsic: +#define _MSVC_STL_DOOM_FUNCTION(mesg) __builtin_verbose_trap("MSVC STL error", mesg) +#elif defined(_M_CEE) // TRANSITION, VSO-2457624 (/clr silent bad codegen for __fastfail); /clr:pure lacks __fastfail #define _MSVC_STL_DOOM_FUNCTION(mesg) ::_invoke_watson(nullptr, nullptr, nullptr, 0, 0) -#endif // ^^^ !defined(_MSVC_STL_USE_ABORT_AS_DOOM_FUNCTION) ^^^ +#else // Use the MSVC __fastfail intrinsic: +extern "C" __declspec(noreturn) void __fastfail(unsigned int); // declared by +#define _MSVC_STL_DOOM_FUNCTION(mesg) __fastfail(5) // __fastfail(FAST_FAIL_INVALID_ARG), value defined by +#endif // choose "doom function" #endif // ^^^ !defined(_MSVC_STL_DOOM_FUNCTION) ^^^ #define _STL_REPORT_ERROR(mesg) \ @@ -494,7 +498,7 @@ class _CRTIMP2_PURE_IMPORT _EmptyLockit { // empty lock class used for bin compa } \ } -#define _RAISE(x) ::_invoke_watson(nullptr, nullptr, nullptr, 0, 0) +#define _RAISE(x) _MSVC_STL_DOOM_FUNCTION("_RAISE was called with !_HAS_EXCEPTIONS") #define _RERAISE #define _THROW(...) (__VA_ARGS__)._Raise()