Axel Quote: "Anyways there is an already filed GCC bug about this defect report against the standard, http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29131 ."
That bug report is suspended. Is this due to the C++ standards issue you referred to?: http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_active.html#225 That C++ standards issue is also 10 years old, and so (I would guess) unlikely to be fixed any time soon. However, (regardless of the outcome of the C+ standards committee on that issue), it seems that either the non-template foo(), in its current position after bar(), should either always be available for lookup or never available. Its visibility shouldn't be affected by the presence of a template version of foo() declared before bar(), which is what is happening now: Removing the original foo() allows the code to compile. So, regardless of which stance GCC takes regarding the standards issue, in my view GCC should still remain consistent. Either accept both versions (with and without the original template foo()) or reject both versions. The current bug report (29131) doesn't mention this inconsistency if I read it correctly. Another few things to note: When I first came across the problem in my code, both versions of foo() were template functions. One was generic foo<T>(T), the other was foo<T>(MyStruct<T>). So the fact that the latter foo() in my example was a non-template foo() isn't affecting things. Also, at the time when I found the issue, foo() and bar() were within a custom namespace, so namespaces or the lack of them also isn't affecting things. Lastly, WRT the standards issue, this issue persists whether or not fundamental types are used. Replacing any fundamental types with custom empty structs doesn't affect anything.