https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96840
Bug ID: 96840 Summary: Recursive substitution in constrained commutative operator Product: gcc Version: 11.0 URL: https://godbolt.org/z/cedacs Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: johelegp at gmail dot com Target Milestone: --- I may be wrong, but I think this should compile. Clang accepts it as does GCC 10.2 and did the GCC 11 build from a little while ago. See the URL: ```C++ template <class T, class U> concept C = requires(T t, U u) { t * u; }; template <class Rep> struct Int { template <class T> requires C<T, Rep> friend void operator*(T, Int) { } template <class T> requires C<T, Rep> friend void operator*(Int, T) { } }; void f() { 0 * Int<int>{}; } ```