https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104733
--- Comment #7 from Patrick Palka <ppalka at gcc dot gnu.org> --- FWIW here's a reduction that Clang and GCC 11 accept, and trunk rejects: template<class T, class U> auto mul(T t, U u) -> decltype(t * u); // #1 namespace M { struct A { }; } void operator*(M::A, M::A); // #2 template<class T, class U> auto mul(T t, U u) -> decltype(t * u); // redeclaration of #1 int main() { M::A a; mul(a, a); } I believe this testcase is also invalid. Despite the redeclaration of #1 (from which #2 is visible), the result of unqualified lookup for 't * u' performed from the original declaration (which doesn't see #2) should prevail according to wg21.link/cwg1321.