http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56886
Bug #: 56886 Summary: [4.9 regression] undesirable instantiation of class template default argument Classification: Unclassified Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: zeratul...@hotmail.com The following code compiles with GCC 4.8 and earlier: template <typename T> struct A { typedef typename T::type type; }; template <typename T, typename U = A<int>()> struct C; template <typename T> struct C<T> { }; C<int> c; but fails to compile with GCC 4.9 (2013-04-07 snapshot) with the following error: test.cpp: In instantiation of 'struct A<int>': test.cpp:16:8: required from here test.cpp:4:30: error: 'int' is not a class, struct, or union type typedef typename T::type type; ^ It seems that GCC 4.9 is instantiating A<int>, the return type of the function type A<int>() which is the default argument for C's template parameter U, while GCC 4.8 and earlier was not instantiating this class. The error also has something to do with the presence of the partial specialization of C, because removing it (and giving the primary template a definition instead) makes it go away.