gcc/libstdc++-v3/include
Jonathan Wakely f21f22d1ba libstdc++: Avoid overflow in ranges::advance(i, n, bound)
When (bound - i) or n is the most negative value of its type, the
negative of the value will overflow. Instead of abs(n) >= abs(bound - i)
use n >= (bound - i) when positive and n <= (bound - i) when negative.
The function has a precondition that they must have the same sign, so
this works correctly. The precondition check can be moved into the else
branch, and simplified.

The standard requires calling ranges::advance(i, bound) even if i==bound
is already true, which is technically observable, but that's pointless.
We can just return n in that case. Similarly, for i!=bound but n==0 we
are supposed to call ranges::advance(i, n), but that's pointless. An LWG
issue to allow omitting the pointless calls is expected to be filed.

libstdc++-v3/ChangeLog:

	* include/bits/ranges_base.h (ranges::advance): Avoid signed
	overflow. Do nothing if already equal to desired result.
	* testsuite/24_iterators/range_operations/advance_overflow.cc:
	New test.
2022-01-27 22:24:29 +00:00
..
backward libstdc++: Add attribute to features deprecated in C++17 [PR91260] 2022-01-14 11:27:50 +00:00
bits libstdc++: Avoid overflow in ranges::advance(i, n, bound) 2022-01-27 22:24:29 +00:00
c Update copyright years. 2022-01-03 10:42:10 +01:00
c_compatibility libstdc++: Declare std::c8rtomb and std::mbrtoc8 if provided by the C library 2022-01-18 16:31:02 +00:00
c_global libstdc++: Ensure all feature test macros have type long [PR87193] 2022-01-21 16:07:34 +00:00
c_std libstdc++: Declare std::c8rtomb and std::mbrtoc8 if provided by the C library 2022-01-18 16:31:02 +00:00
debug Update copyright years. 2022-01-03 10:42:10 +01:00
decimal Update copyright years. 2022-01-03 10:42:10 +01:00
experimental libstdc++: Fix for non-constexpr math_errhandling 2022-01-19 13:45:58 +01:00
ext libstdc++: Add attribute to features deprecated in C++17 [PR91260] 2022-01-14 11:27:50 +00:00
parallel Update copyright years. 2022-01-03 10:42:10 +01:00
precompiled Update copyright years. 2022-01-03 10:42:10 +01:00
pstl
std libstdc++: Fix std::spanstream move assignment [PR104032] 2022-01-23 22:48:33 +00:00
tr1 libstdc++: Add attribute to features deprecated in C++17 [PR91260] 2022-01-14 11:27:50 +00:00
tr2 Update copyright years. 2022-01-03 10:42:10 +01:00
Makefile.am libstdc++: Define <stdatomic.h> for C++23 2022-01-18 16:31:02 +00:00
Makefile.in libstdc++: Define <stdatomic.h> for C++23 2022-01-18 16:31:02 +00:00