https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117552
Bug ID: 117552
Summary: ranges::(stable_)sort fail to accept C++20-only random
access ranges
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Keywords: rejects-valid
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: de34 at live dot cn
Target Milestone: ---
The following example doesn't compile with libstdc++.
Godbolt link: https://godbolt.org/z/67Tanfxad
```
#include <cstdint>
#include <algorithm>
#include <ranges>
constinit int a[]{42, 1729};
constinit auto view32 =
std::views::iota(std::uint32_t{}, std::uint32_t{}) |
std::views::transform([] (std::uint32_t i) -> int& { return a[i]; });
constinit auto viewmax =
std::views::iota(std::uintmax_t{}, std::uintmax_t{}) |
std::views::transform([] (std::uintmax_t i) -> int& { return a[i]; });
int main()
{
std::ranges::sort(view32);
std::ranges::sort(viewmax);
std::ranges::stable_sort(view32);
std::ranges::stable_sort(viewmax);
}
```
There're at least 3 issues concentratedly appearing in sorting algorithms.
1. make_unsigned_t is mistakenly used for difference type that is an
integer-class type.
2. iterator_traits<It>::value_type is calculated to be void for some C++20-only
iterators. Such calculation might be still right, but iter_value_t should be
used in these cases.
3. These algorithms use tag dispatch based on
iterator_traits<It>::iterator_category, which is almost always wrong when the
view is produced via views::iota.
Presumably, there might be a common cause - these ranges algorithms are using
non-ranges versions too eagerly.