https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119203
--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- For the original example, clang says what's wrong: arrow.cc:14:7: error: no viable overloaded 'operator->' 14 | iter->i; | ~~~~^ arrow.cc:6:8: note: candidate function not viable: constraints not satisfied 6 | auto operator->() const requires(t.operator->()) { return t.operator->(); } | ^ arrow.cc:6:38: note: because substituted constraint expression is ill-formed: no member named 'operator->' in 'S' 6 | auto operator->() const requires(t.operator->()) { return t.operator->(); } | ^ 1 error generated. But EDG has the same problem as GCC: "arrow.cc", line 14: error: operator -> or ->* applied to "Iter<S>" instead of to a pointer type iter->i; ^ "arrow.cc", line 14: warning: variable "iter" is used before its value is set iter->i; ^ 1 error detected in the compilation of "arrow.cc".