(root)/
gcc-13.2.0/
libstdc++-v3/
testsuite/
std/
ranges/
subrange/
constexpr.cc
// { dg-options "-std=gnu++20" }
// { dg-do compile { target c++20 } }

#include <ranges>

struct iterator
{
  using difference_type = int;

  int i;

  int operator*() const { return i; }

  // These are intentionally not constexpr:
  iterator& operator++() { ++i; return *this; }
  iterator operator++(int) { return {i++}; }
  bool operator==(const iterator& it) const { return i == it.i; }
};

constexpr iterator begin(1), end(2);

using std::ranges::subrange;
using std::ranges::subrange_kind;

// This used to fail due to using operator++ and operator== in an assertion:
constexpr subrange<iterator, iterator, subrange_kind::sized> s(begin, end, 1);