On Fri, 9 Sep 2022, 18:25 Patrick Palka via Libstdc++, < libstdc++@gcc.gnu.org> wrote: > make_unsigned_t can't give us the unsigned version of an integer-class > difference type, so use __make_unsigned_like_t / __to_unsigned_like > instead. > OK, thanks > PR libstdc++/106766 > > libstdc++-v3/ChangeLog: > > * include/std/ranges (zip_view::_Iterator::operator-): Use > __to_unsigned_like instead of make_unsigned_t. > (zip_view::_Sentinel::operator-): Likewise. > * testsuite/std/ranges/zip/1.cc (test04): New test. > --- > libstdc++-v3/include/std/ranges | 8 ++++---- > libstdc++-v3/testsuite/std/ranges/zip/1.cc | 14 ++++++++++++++ > 2 files changed, 18 insertions(+), 4 deletions(-) > > diff --git a/libstdc++-v3/include/std/ranges > b/libstdc++-v3/include/std/ranges > index 2b5cb0531f0..2b8fec3c386 100644 > --- a/libstdc++-v3/include/std/ranges > +++ b/libstdc++-v3/include/std/ranges > @@ -4657,8 +4657,8 @@ namespace views::__adaptor > return ranges::min({difference_type(std::get<_Is>(__x._M_current) > - > std::get<_Is>(__y._M_current))...}, > ranges::less{}, > - [](difference_type __i) -> > make_unsigned_t { > - return __i < 0 ? -__i : __i; > + [](difference_type __i) { > + return __detail::__to_unsigned_like(__i < 0 ? > -__i : __i); > }); > }(make_index_sequence{}); > } > @@ -4726,8 +4726,8 @@ namespace views::__adaptor > return [&](index_sequence<_Is...>) { > return ranges::min({_Ret(std::get<_Is>(__x._M_current) - > std::get<_Is>(__y._M_end))...}, > ranges::less{}, > - [](_Ret __i) -> make_unsigned_t<_Ret> { > - return __i < 0 ? -__i : __i; > + [](_Ret __i) { > + return __detail::__to_unsigned_like(__i < 0 ? > -__i : __i); > }); > }(make_index_sequence{}); > } > diff --git a/libstdc++-v3/testsuite/std/ranges/zip/1.cc > b/libstdc++-v3/testsuite/std/ranges/zip/1.cc > index 0113efdb537..f868c97cb69 100644 > --- a/libstdc++-v3/testsuite/std/ranges/zip/1.cc > +++ b/libstdc++-v3/testsuite/std/ranges/zip/1.cc > @@ -102,10 +102,24 @@ test03() > return true; > } > > +constexpr bool > +test04() > +{ > + // PR libstdc++/106766 > + auto r = views::zip(views::iota(__int128(0), __int128(1))); > + auto i = r.begin(); > + auto s = r.end(); > + VERIFY( s - i == 1 ); > + VERIFY( i + 1 - i == 1 ); > + > + return true; > +} > + > int > main() > { > static_assert(test01()); > static_assert(test02()); > static_assert(test03()); > + static_assert(test04()); > } > -- > 2.37.3.518.g79f2338b37 > >