diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-04-03 20:04:07 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-04-03 20:04:07 +0200 |
commit | 7568f4f10d9e74dd050e2423a9fe2d530a3b9725 (patch) | |
tree | 51945d99c08fb6a17ef61c167d1c3238f528d5e5 /gcc/cp/parser.c | |
parent | ac924d65021ace2310cce6c057d5c17da8fd2339 (diff) | |
download | gcc-7568f4f10d9e74dd050e2423a9fe2d530a3b9725.tar.gz |
backport: re PR c++/56239 (parse error calling operator() on parenthesized value-initialized temporary)
Backported from mainline
2013-02-07 Jakub Jelinek <jakub@redhat.com>
PR c++/56239
* parser.c (cp_parser_token_starts_cast_expression): Renamed to...
(cp_parser_tokens_start_cast_expression): ... this. Change parameter
to cp_parser *, call cp_lexer_peek_token first. For CPP_OPEN_PAREN,
return true only if 2nd token isn't CPP_CLOSE_PAREN.
(cp_parser_cast_expression): Adjust caller.
* g++.dg/parse/pr56239.C: New test.
From-SVN: r197450
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r-- | gcc/cp/parser.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index da09e425f7c..8e8e8348995 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -6566,8 +6566,9 @@ cp_parser_delete_expression (cp_parser* parser) otherwise. */ static bool -cp_parser_token_starts_cast_expression (cp_token *token) +cp_parser_tokens_start_cast_expression (cp_parser *parser) { + cp_token *token = cp_lexer_peek_token (parser->lexer); switch (token->type) { case CPP_COMMA: @@ -6608,6 +6609,12 @@ cp_parser_token_starts_cast_expression (cp_token *token) case CPP_EOF: return false; + case CPP_OPEN_PAREN: + /* In ((type ()) () the last () isn't a valid cast-expression, + so the whole must be parsed as postfix-expression. */ + return cp_lexer_peek_nth_token (parser->lexer, 2)->type + != CPP_CLOSE_PAREN; + /* '[' may start a primary-expression in obj-c++. */ case CPP_OPEN_SQUARE: return c_dialect_objc (); @@ -6700,8 +6707,7 @@ cp_parser_cast_expression (cp_parser *parser, bool address_p, bool cast_p, parenthesized ctor such as `(T ())' that looks like a cast to function returning T. */ if (!cp_parser_error_occurred (parser) - && cp_parser_token_starts_cast_expression (cp_lexer_peek_token - (parser->lexer))) + && cp_parser_tokens_start_cast_expression (parser)) { cp_parser_parse_definitely (parser); expr = cp_parser_cast_expression (parser, |