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); }