https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107572
Bug ID: 107572 Summary: cartesian_product_view invokes the begin of input_range twice Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: hewillk at gmail dot com Target Milestone: --- ranges#L8069: auto __it = __detail::__tuple_transform(ranges::begin, _M_bases); if (!__empty_tail) std::get<0>(__it) = __detail::__cartesian_common_arg_end(std::get<0>(_M_bases)); return _Iterator<false>{*this, std::move(__it)}; This *always* invokes begin twice for the first range, which is undefined behavior when it is an input_range. testcase (https://godbolt.org/z/7hfP8xM6a): #include <ranges> #include <fmt/ranges.h> #include <sstream> std::istringstream ints("0 1 2 3 4"); struct istream_range { auto begin() { return std::istream_iterator<int>{ints}; } auto end() { return std::istream_iterator<int>{}; } }; int main() { istream_range r; fmt::print("{}\n", std::views::cartesian_product(r)); // prints [(0), (2), (3), (4)] }