diff options
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/parser.c | 17 |
2 files changed, 14 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c3df66d..7c1311d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 13c7362..f673c16 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 - || TREE_TYPE (decl) == error_mark_node - || !IS_AGGR_TYPE (TREE_TYPE (decl))) { - cp_parser_error (parser, "expected class-name"); - return error_mark_node; + 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))) + decl = error_mark_node; + + if (decl == error_mark_node) + cp_parser_error (parser, "expected class-name"); return decl; } |