http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55809
Bug #: 55809 Summary: Doesn't differentiate elaborated type specifier and typename specifier in dependent types Classification: Unclassified Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: schaub.johan...@googlemail.com The following looks well-formed template<typename T, typename T::X *> void f() { } template<typename T, class T::X *> void f() { } struct A { typedef int X; }; struct B { void X(); class X { }; }; class B::X x1; int x2; int main() { f<A, &x2>(); f<B, &x1>(); } But GCC shouts: prog.cpp:1:94: error: redefinition of 'template<class T, class T::X* <anonymous> > void f()' prog.cpp:1:46: error: 'template<class T, typename T::X* <anonymous> > void f()' previously declared here Related Bugreport (responsible for accepting the above testcase too, when it's fixed): http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48920 . Clang accepts the above code, so my statement in PR48920 that the Itanium ABI does not allow to distiguish between the different signatures appears to be wrong and GCC should support this code.