[PATCH] libstdc++: Fix subrange::advance and subrange::prev (LWG 3433)

Jonathan Wakely jwakely@redhat.com
Tue Apr 28 16:23:31 GMT 2020


On 27/04/20 17:34 -0400, Patrick Palka via Libstdc++ wrote:
>This implements the proposed resolution of LWG 3433, which fixes
>subrange::advance when called with a negative argument.
>
>Tested on x86_64-pc-linux-gnu, does this look OK to commit?
>
>libstdc++-v3/ChangeLog:
>
>	LWG 3433 subrange::advance(n) has UB when n < 0
>	* include/std/ranges (subrange::prev): Fix typo.
>	(subrange::advance): Handle a negative argument as per the proposed
>	resolution of LWG 3433.
>	* testsuite/std/ranges/subrange/lwg3433.cc: New test.
>---
> libstdc++-v3/include/std/ranges               | 25 +++--
> .../testsuite/std/ranges/subrange/lwg3433.cc  | 96 +++++++++++++++++++
> 2 files changed, 111 insertions(+), 10 deletions(-)
> create mode 100644 libstdc++-v3/testsuite/std/ranges/subrange/lwg3433.cc
>
>diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
>index 8f91598c26e..565366a8d2f 100644
>--- a/libstdc++-v3/include/std/ranges
>+++ b/libstdc++-v3/include/std/ranges
>@@ -353,23 +353,28 @@ namespace ranges
> 	requires bidirectional_iterator<_It>
>       {
> 	auto __tmp = *this;
>-	__tmp.advance(--__n);
>+	__tmp.advance(-__n);
> 	return __tmp;
>       }
>
>       constexpr subrange&
>       advance(iter_difference_t<_It> __n)
>       {
>+	// We incorporate the proposed resolution of LWG 3433 here,
>+	// avoiding undefined behavior when __n < 0.

Please replace or extend this comment with our convention for marking
issue resolutions:

   // _GLIBCXX_RESOLVE_LIB_DEFECTS
   // 3343. subrange::advance(n) has UB when n < 0


OK for trunk with that change, thanks.




More information about the Gcc-patches mailing list