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.

Reply via email to