https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117998
Bug ID: 117998
Summary: <ranges>: views::counted misses difference casting for
contiguous_iterator case
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: hewillk at gmail dot com
Target Milestone: ---
template<input_or_output_iterator _Iter>
constexpr auto
operator() [[nodiscard]] (_Iter __i, iter_difference_t<_Iter> __n) const
{
if constexpr (contiguous_iterator<_Iter>)
return span(std::to_address(__i), __n);
We should static_cast n to type size_t:
https://godbolt.org/z/eM6cWsTeq
#include <ranges>
struct ContiguousIter {
using iterator_category = std::contiguous_iterator_tag;
using difference_type = std::ranges::__detail::__max_diff_type;
using element_type = char;
element_type& operator*() const;
ContiguousIter& operator++();
ContiguousIter operator++(int);
ContiguousIter& operator--();
ContiguousIter operator--(int);
ContiguousIter& operator+=(difference_type);
ContiguousIter& operator-=(difference_type);
element_type* operator->() const;
element_type& operator[](difference_type) const;
friend ContiguousIter operator+(ContiguousIter, difference_type);
friend ContiguousIter operator+(difference_type, ContiguousIter);
friend ContiguousIter operator-(ContiguousIter, difference_type);
friend difference_type operator-(ContiguousIter, ContiguousIter);
auto operator<=>(const ContiguousIter&) const = default;
};
int main() {
ContiguousIter it;
std::ranges::contiguous_range auto r = std::views::counted(it, 42);
}