From 41f2a712a7c8c57c1bc05cc11946e56d50aaab87 Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Tue, 14 Dec 2021 09:24:16 +0700 Subject: [PATCH 1/3] improve iota_view's iterator's binary operator+ --- stl/inc/ranges | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/stl/inc/ranges b/stl/inc/ranges index c823cd719ca..8cbcfdd0dbb 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -1140,16 +1140,18 @@ namespace ranges { // clang-format on _NODISCARD friend constexpr _Ioterator operator+(_Ioterator _It, const difference_type _Off) noexcept( - noexcept(static_cast<_Wi>(_It._Current + _Off))) /* strengthened */ requires _Advanceable<_Wi> { - return _Ioterator{static_cast<_Wi>(_It._Current + _Off)}; + noexcept(_It._Current += _Off)) /* strengthened */ requires _Advanceable<_Wi> { + _It._Current += _Off; + return _It; } _NODISCARD friend constexpr _Ioterator operator+(const difference_type _Off, _Ioterator _It) noexcept( noexcept(static_cast<_Wi>(_It._Current + _Off))) /* strengthened */ requires _Advanceable<_Wi> { return _Ioterator{static_cast<_Wi>(_It._Current + _Off)}; } _NODISCARD friend constexpr _Ioterator operator-(_Ioterator _It, const difference_type _Off) noexcept( - noexcept(static_cast<_Wi>(_It._Current - _Off))) /* strengthened */ requires _Advanceable<_Wi> { - return _Ioterator{static_cast<_Wi>(_It._Current - _Off)}; + noexcept(_It._Current -= _Off)) /* strengthened */ requires _Advanceable<_Wi> { + _It._Current -= _Off; + return _It; } _NODISCARD friend constexpr difference_type operator-(const _Ioterator& _Left, const _Ioterator& _Right) noexcept( From de0c629bef367d665b381465546e7644f7bef084 Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Tue, 14 Dec 2021 09:57:13 +0700 Subject: [PATCH 2/3] correct implementation --- stl/inc/ranges | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stl/inc/ranges b/stl/inc/ranges index 8cbcfdd0dbb..5d57c871237 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -1140,8 +1140,8 @@ namespace ranges { // clang-format on _NODISCARD friend constexpr _Ioterator operator+(_Ioterator _It, const difference_type _Off) noexcept( - noexcept(_It._Current += _Off)) /* strengthened */ requires _Advanceable<_Wi> { - _It._Current += _Off; + noexcept(_It += _Off)) /* strengthened */ requires _Advanceable<_Wi> { + _It += _Off; return _It; } _NODISCARD friend constexpr _Ioterator operator+(const difference_type _Off, _Ioterator _It) noexcept( @@ -1149,8 +1149,8 @@ namespace ranges { return _Ioterator{static_cast<_Wi>(_It._Current + _Off)}; } _NODISCARD friend constexpr _Ioterator operator-(_Ioterator _It, const difference_type _Off) noexcept( - noexcept(_It._Current -= _Off)) /* strengthened */ requires _Advanceable<_Wi> { - _It._Current -= _Off; + noexcept(_It -= _Off)) /* strengthened */ requires _Advanceable<_Wi> { + _It -= _Off; return _It; } _NODISCARD friend constexpr difference_type From 2d520d7c448ea573516e3471deccb7c980e62615 Mon Sep 17 00:00:00 2001 From: Casey Carter Date: Wed, 15 Dec 2021 21:18:11 -0800 Subject: [PATCH 3/3] Fix conditional noexcepts --- stl/inc/ranges | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/stl/inc/ranges b/stl/inc/ranges index 5d57c871237..9ec2c56c4ad 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -1140,16 +1140,19 @@ namespace ranges { // clang-format on _NODISCARD friend constexpr _Ioterator operator+(_Ioterator _It, const difference_type _Off) noexcept( - noexcept(_It += _Off)) /* strengthened */ requires _Advanceable<_Wi> { + is_nothrow_move_constructible_v<_Ioterator>&& noexcept( + _It += _Off)) /* strengthened */ requires _Advanceable<_Wi> { _It += _Off; return _It; } _NODISCARD friend constexpr _Ioterator operator+(const difference_type _Off, _Ioterator _It) noexcept( - noexcept(static_cast<_Wi>(_It._Current + _Off))) /* strengthened */ requires _Advanceable<_Wi> { + is_nothrow_move_constructible_v<_Wi>&& noexcept( + static_cast<_Wi>(_It._Current + _Off))) /* strengthened */ requires _Advanceable<_Wi> { return _Ioterator{static_cast<_Wi>(_It._Current + _Off)}; } _NODISCARD friend constexpr _Ioterator operator-(_Ioterator _It, const difference_type _Off) noexcept( - noexcept(_It -= _Off)) /* strengthened */ requires _Advanceable<_Wi> { + is_nothrow_move_constructible_v<_Ioterator>&& noexcept( + _It -= _Off)) /* strengthened */ requires _Advanceable<_Wi> { _It -= _Off; return _It; }