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> 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 PR c++/26739
* pt.c (tsubst_friend_function): Return early if * pt.c (tsubst_friend_function): Return early if
pushdecl_namespace_level fails. 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 standard does not seem to be definitive, but there is no other
valid interpretation of the following `::'. Therefore, those valid interpretation of the following `::'. Therefore, those
names are considered class-names. */ names are considered class-names. */
decl = TYPE_NAME (make_typename_type (scope, decl, tag_type, tf_error)); {
else if (decl == error_mark_node decl = make_typename_type (scope, decl, tag_type, tf_error);
|| TREE_CODE (decl) != TYPE_DECL if (decl != error_mark_node)
decl = TYPE_NAME (decl);
}
else if (TREE_CODE (decl) != TYPE_DECL
|| TREE_TYPE (decl) == error_mark_node || TREE_TYPE (decl) == error_mark_node
|| !IS_AGGR_TYPE (TREE_TYPE (decl))) || !IS_AGGR_TYPE (TREE_TYPE (decl)))
{ decl = error_mark_node;
cp_parser_error (parser, "expected class-name");
return error_mark_node; if (decl == error_mark_node)
} cp_parser_error (parser, "expected class-name");
return decl; return decl;
} }

View File

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