As described in the thread "Should template dependent lookup find static functions?" : http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/d6d9a5f3e12ccf80/7038bb2e4c75e190#7038bb2e4c75e190
I'll give the example again: ---- begin example ---- class inner_t { }; template <class T> struct outer_t { T m_elem; }; template <class T> void examine(const outer_t<T> & data) { // Finding the static (or anon-namespace) function may lead // to undefined behavior (when it happens in multiple translation // units). access(data.m_elem); } // NOTE: this is static! GCC finds it as a dependent name from examine. // This *may* lead to undefined behavior. static void access(const inner_t & ) {} int main() { outer_t<inner_t> instance; examine(instance); } --- end example --- gcc-3.4.3 and gcc-4.0.0 accept this without a warning. (-W -Wall -O{0,1,2} give no warning). The problem is that if both static function and the template function are in a header file, then the behavior is undefined, yet the compiler has to accept it (it may issue a warning). Of course, GCC may implement an extension and document it, such that it is no longer undefined for GCC (e.g. make it defined as long as having the same static function). The same problem happens when `static' is replaced with `namespace {'. -- Summary: Warn template instantiation calling static functions Product: gcc Version: 4.0.0 Status: UNCONFIRMED Severity: enhancement Priority: P2 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: veksler at il dot ibm dot com CC: gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23542