diff options
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r-- | gcc/cp/parser.c | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 9bd3f18..7fb9d96 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -4274,6 +4274,7 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, tree name; bool dependent_p; bool template_p; + bool pseudo_destructor_p; tree scope = NULL_TREE; /* If this is a `->' operator, dereference the pointer. */ @@ -4315,11 +4316,34 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, postfix_expression = error_mark_node; } - /* If the SCOPE is not a scalar type, we are looking at an - ordinary class member access expression, rather than a - pseudo-destructor-name. */ - if (!scope || !SCALAR_TYPE_P (scope)) + /* Assume this expression is not a pseudo-destructor access. */ + pseudo_destructor_p = false; + + /* If the SCOPE is a scalar type, then, if this is a valid program, + we must be looking at a pseudo-destructor-name. */ + if (scope && SCALAR_TYPE_P (scope)) { + tree s; + tree type; + + cp_parser_parse_tentatively (parser); + /* Parse the pseudo-destructor-name. */ + s = NULL_TREE; + cp_parser_pseudo_destructor_name (parser, &s, &type); + if (cp_parser_parse_definitely (parser)) + { + pseudo_destructor_p = true; + postfix_expression + = finish_pseudo_destructor_expr (postfix_expression, + s, TREE_TYPE (type)); + } + } + + if (!pseudo_destructor_p) + { + /* If the SCOPE is not a scalar type, we are looking at an + ordinary class member access expression, rather than a + pseudo-destructor-name. */ template_p = cp_parser_optional_template_keyword (parser); /* Parse the id-expression. */ name = cp_parser_id_expression (parser, template_p, @@ -4354,19 +4378,6 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, postfix_expression = finish_class_member_access_expr (postfix_expression, name); } - /* Otherwise, try the pseudo-destructor-name production. */ - else - { - tree s = NULL_TREE; - tree type; - - /* Parse the pseudo-destructor-name. */ - cp_parser_pseudo_destructor_name (parser, &s, &type); - /* Form the call. */ - postfix_expression - = finish_pseudo_destructor_expr (postfix_expression, - s, TREE_TYPE (type)); - } /* We no longer need to look up names in the scope of the object on the left-hand side of the `.' or `->' operator. */ @@ -4862,7 +4873,7 @@ cp_parser_new_expression (cp_parser* parser) inform ("try removing the parentheses around the type-id"); cp_parser_direct_new_declarator (parser); } - nelts = integer_one_node; + nelts = NULL_TREE; } /* Otherwise, there must be a new-type-id. */ else |