The second error message issued by gcc 4.3.0 for the ill-formed program below looks wrong. I would expect it to read the same as the first one.
$ cat t.cpp && g++ t.cpp template <class T> struct A { }; template <class T, class U> struct B { typedef A<T> Y; }; template <class T> void foo (T*) { } template <class T, class U> void bar () { foo (typename B<T, U>::Y ()); typedef typename B<T, U>::Y Y; foo (Y ()); // line 11 } int main () { bar<int, A<int> >(); } t.cpp: In function void bar() [with T = int, U = A<int>]: t.cpp:15: instantiated from here t.cpp:8: error: no matching function for call to foo(A<int>) t.cpp:11: error: no matching function for call to foo(bar() [with T = int, U = A<int>]::Y) -- Summary: screwy diagnostic on ill-formed call from template with a local typedef Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: sebor at roguewave dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36813