Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 20 additions & 12 deletions stl/inc/ranges
Original file line number Diff line number Diff line change
Expand Up @@ -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)");
}
Expand All @@ -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)");
}
Expand Down
14 changes: 9 additions & 5 deletions stl/inc/yvals.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <intrin.h>
#define _MSVC_STL_DOOM_FUNCTION(mesg) __fastfail(5) // __fastfail(FAST_FAIL_INVALID_ARG), value defined by <winnt.h>
#endif // choose "doom function"
#endif // ^^^ !defined(_MSVC_STL_DOOM_FUNCTION) ^^^

#define _STL_REPORT_ERROR(mesg) \
Expand Down Expand Up @@ -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()
Expand Down