re PR c++/26558 (segfault on syntax error)

PR c++/26558
	* parser.c (cp_parser_class_name): Check for invalid typenames.
	Rearrange code.

	* g++.dg/parse/template19.C: New test.

From-SVN: r113096
This commit is contained in:
Volker Reichelt 2006-04-19 22:03:24 +00:00 committed by Volker Reichelt
parent 51e8f10cf6
commit 94d285a53c
4 changed files with 28 additions and 7 deletions

View File

@ -1,5 +1,9 @@
2006-04-19 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
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.

View File

@ -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;
}

View File

@ -1,5 +1,8 @@
2006-04-19 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/26558
* g++.dg/parse/template19.C: New test.
PR c++/26739
* g++.old-deja/g++.pt/friend36.C: Adjust error markers.

View File

@ -0,0 +1,11 @@
// PR c++/26558
// Origin: Jan Gorski <slimak@yk74.internetdsl.tpnet.pl>
// { dg-do compile }
template<int> struct A
{
template<int> void foo()
{
foo<0>::; // { dg-error "before" }
}
};