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

Reply via email to