2004-08-06 Alexandre Oliva * parse.y (structsp): Skip typename_type obtained from a class_head_decl, use the actual type. 2004-08-09 Alexandre Oliva * g++.old-deja/g++.pt/crash43.C: Don't require error for legal construct. * g++.dg/template/friend0.C: New test. --- gcc/cp/parse.y.jj +++ gcc/cp/parse.y @@ -2371,6 +2374,13 @@ structsp: | class_head_decl { $$.t = TREE_TYPE ($1.t); + /* class_head_decl always starts with an aggr, so + get rid of any implicit typename warnings we + might get from it. We can't remove it before + this point because this is where we get from the + decl to the type. */ + if (IMPLICIT_TYPENAME_P ($$.t)) + $$.t = TREE_TYPE ($$.t); $$.new_type_flag = $1.new_type_flag; check_class_key (current_aggr, $$.t); } --- gcc/testsuite/g++.old-deja/g++.pt/crash43.C 27 Nov 2002 01:03:42 -0000 1.1 +++ gcc/testsuite/g++.old-deja/g++.pt/crash43.C 9 Aug 2004 17:20:46 -0000 @@ -7,7 +7,7 @@ struct S { struct Y {}; template - friend struct S::X; // ERROR - typename as friend + friend struct S::X; // gets bogus error - XFAIL *-*-* template friend typename S::Y; // ERROR - typename as friend @@ -15,7 +15,7 @@ struct S { struct T { template - friend struct S::X; // ERROR - typename as friend + friend struct S::X; }; struct U { --- gcc/testsuite/g++.dg/template/friend0.C.jj 2004-08-12 14:03:21.001079817 +0200 +++ gcc/testsuite/g++.dg/template/friend0.C 2004-08-12 14:03:15.734996391 +0200 @@ -0,0 +1,10 @@ +// http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=129350 +// { dg-do compile } + +template struct A { + struct B { }; +}; + +class C { + template friend struct A::B; +};