https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124425
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Thanks.
Guess I'll try to follow what we emit for the range for loops in:
#include <ranges>
struct A { };
template <typename T>
struct B
{
using value_type = T;
using difference_type = int;
struct C
{
T i;
constexpr operator T () const { return i; }
};
constexpr B &operator++ () { ++i; return *this; }
constexpr B operator++ (int) { return B { i++ }; }
constexpr C operator * () const { return C { i }; }
constexpr bool operator== (A) const { return i == 10; }
constexpr B () {}
constexpr B (const B &x) : i (x.i) {}
constexpr ~B () {}
int i = 0;
};
template <typename T>
struct D
{
constexpr B <T> begin () const { return {}; };
constexpr A end () const { return {}; };
};
struct E
{
constexpr E (int x) : a (x), b (x + 1), c (x + 2) {}
constexpr E (const E &x) : a (x.a), b (x.b), c (x.c) {}
constexpr ~E () {}
int a, b, c;
};
static_assert (std::ranges::input_range <D <int>>);
static_assert (std::ranges::input_range <D <E>>);
void
foo (D <int> &x)
{
for (const std::ranges::range_value_t<D <int>> &a : x)
;
}
void
bar (D <E> &x)
{
for (const std::ranges::range_value_t<D <E>> &a : x)
;
}