See below; G++ appears to correctly handle the use of 'struct B' to declare the function template g(), but if there is no prior declaration of the class (as in the declaration of f()), the class is erroneously taken as a class template.
extern "C" int printf( const char*, ... ); struct B{ int n; B(int n_) : n(n_){} }; template<class T> struct B g() // OK, g() returns B { return B(32); } template<class T> struct A f(); // OK, f() returns A struct A { char c; A(char c_) : c(c_){}}; template<class T> struct A f() { return A('x'); } int main( ) { (void) printf( "%d, %c\n", g<double>().n, f<float>().c ); // prints "32, x\n". return 0; } -- Summary: Non-template class function return type taken as template when declared in a function template's return type Product: gcc Version: 4.0.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: widman at gimpel dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28044