https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84140
Casey Carter <Casey at Carter dot net> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |Casey at Carter dot net --- Comment #1 from Casey Carter <Casey at Carter dot net> --- Another repro: 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 bool Same = is_same_v<T, U>; template<class T, class U> concept bool 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>{}); } Compiling fails when the static_assert in the body of the friend function template - which simply asserts that the constraint on the template is satisfied - fires. It would appear the constraints aren't being checked for satisfaction at all on hidden friends found during overload resolution. FWIW, this makes it impossible to implement the Ranges proposal as specified.