libstdc++: Fix weakly_incrementable to allow __int128 (PR 93267)
authorJonathan Wakely <jwakely@redhat.com>
Wed, 15 Jan 2020 14:09:35 +0000 (14:09 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 15 Jan 2020 16:22:49 +0000 (16:22 +0000)
commit2a0f6c61b4db19535c632be68bddad74b6adb6cf
treea8f371bea08a832525b8f5e3451c92aa5b7e02d2
parentea1966e88ec3bd22228bb4048c8b4388da89b15f
libstdc++: Fix weakly_incrementable to allow __int128 (PR 93267)

The __iota_diff_t alias can be the type __int128, but that does not
satisfy the signed_integral and __is_signed_integer_like concepts when
__STRICT_ANSI__ is defined (which is true for -std=c++2a).

Because weakly_incrementable is defined in terms of signed_integral, it
is not satisfied by __int128, which means iota_view's iterator doesn't
always satisfy input_or_output_iterator and so iota_view is not always a
range.

The solution is to define __max_size_type and __max_diff_type using
__int128, so that __is_signed_integer_like allows __int128, and then
make weakly_incrementable use __is_signed_integer_like instead of
signed_integral.

PR libstdc++/93267
* include/bits/iterator_concepts.h (__max_diff_type, __max_size_type):
Move here from <bits/range_access.h> and define using __int128 when
available.
(__is_integer_like, __is_signed_integer_like): Move here from
<bits/range_access.h>.
(weakly_incrementable): Use __is_signed_integer_like.
* include/bits/range_access.h (__max_diff_type, __max_size_type)
(__is_integer_like, __is_signed_integer_like): Move to
<bits/iterator_concepts.h>.
(__make_unsigned_like_t): Move here from <ranges>.
* include/std/ranges (__make_unsigned_like_t): Move to
<bits/range_access.h>.
(iota_view): Replace using-directive with using-declarations.
* testsuite/std/ranges/iota/93267.cc: New test.
* testsuite/std/ranges/iota_view.cc: Move to new 'iota' sub-directory.
libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/iterator_concepts.h
libstdc++-v3/include/bits/range_access.h
libstdc++-v3/include/std/ranges
libstdc++-v3/testsuite/std/ranges/iota/93267.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/iota/iota_view.cc [new file with mode: 0644]
libstdc++-v3/testsuite/std/ranges/iota_view.cc [deleted file]