// { dg-do run { target c++20 } } template<class, class> constexpr bool is_same_v = false; template<class T> constexpr bool is_same_v<T, T> = true; template<class T, class U> concept Same = is_same_v<T, U>; template<class T, class U> concept Diff = requires(T& t, U& u) { u - t; }; template<class I, class S> int distance(I, S) { return 0; } template<class I, Diff<I> S> int distance(I first, S last) { return last - first; } template<class T> struct I { template<class U> requires Same<T, U> friend int operator-(I const&, I<U> const&) { static_assert(Same<T, U>); return 42; } }; int main() { return distance(I<int>{}, I<void>{}); }