diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c3df66dcb32..7c1311d27a2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2006-04-19 Volker Reichelt + PR c++/26558 + * parser.c (cp_parser_class_name): Check for invalid typenames. + Rearrange code. + PR c++/26739 * pt.c (tsubst_friend_function): Return early if pushdecl_namespace_level fails. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 13c73627e1c..f673c16bacf 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -12830,15 +12830,18 @@ cp_parser_class_name (cp_parser *parser, standard does not seem to be definitive, but there is no other valid interpretation of the following `::'. Therefore, those names are considered class-names. */ - decl = TYPE_NAME (make_typename_type (scope, decl, tag_type, tf_error)); - else if (decl == error_mark_node - || TREE_CODE (decl) != TYPE_DECL + { + decl = make_typename_type (scope, decl, tag_type, tf_error); + if (decl != error_mark_node) + decl = TYPE_NAME (decl); + } + else if (TREE_CODE (decl) != TYPE_DECL || TREE_TYPE (decl) == error_mark_node || !IS_AGGR_TYPE (TREE_TYPE (decl))) - { - cp_parser_error (parser, "expected class-name"); - return error_mark_node; - } + decl = error_mark_node; + + if (decl == error_mark_node) + cp_parser_error (parser, "expected class-name"); return decl; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 381ed85732b..e55cee818b2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2006-04-19 Volker Reichelt + PR c++/26558 + * g++.dg/parse/template19.C: New test. + PR c++/26739 * g++.old-deja/g++.pt/friend36.C: Adjust error markers. diff --git a/gcc/testsuite/g++.dg/parse/template19.C b/gcc/testsuite/g++.dg/parse/template19.C new file mode 100644 index 00000000000..dc1a67334b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template19.C @@ -0,0 +1,11 @@ +// PR c++/26558 +// Origin: Jan Gorski +// { dg-do compile } + +template struct A +{ + template void foo() + { + foo<0>::; // { dg-error "before" } + } +};