https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86577
Bug ID: 86577 Summary: non-ADL name lookup for operator<< at instantiation time? Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: zhonghao at pku dot org.cn Target Milestone: --- The code is as follow: #include <iostream> namespace N { struct X { }; } using namespace N; template<typename T> void log(const T& t) { std::clog << t; } std::ostream &operator<<(std::ostream&, const X& x); template void log(const X&); g++ accepts the code, but clang++ rejects it: code0.cpp:10:12: error: call to function 'operator<<' that is neither visible in the template definition nor found by argument-dependent lookup std::clog << t; ^ code0.cpp:15:16: note: in instantiation of function template specialization 'log<N::X>' requested here template void log(const X&); ^ code0.cpp:13:16: note: 'operator<<' should be declared prior to the call site or in namespace 'N' std::ostream &operator<<(std::ostream&, const X& x); ^ 1 error generated. Does g++ perform non-ADL name lookup for operator<< at instantiation time? This sounds incorrect.