From: Jakub Jelinek Date: Wed, 3 Apr 2013 18:04:07 +0000 (+0200) Subject: backport: re PR c++/56239 (parse error calling operator() on parenthesized value... X-Git-Tag: releases/gcc-4.6.4~63 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7568f4f10d9e74dd050e2423a9fe2d530a3b9725;p=thirdparty%2Fgcc.git backport: re PR c++/56239 (parse error calling operator() on parenthesized value-initialized temporary) Backported from mainline 2013-02-07 Jakub Jelinek 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1808b9d09cc3..aa358f0806b8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,15 @@ 2013-04-03 Jakub Jelinek Backported from mainline + 2013-02-07 Jakub Jelinek + + 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. + 2012-10-08 Jakub Jelinek PR c++/54858 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index da09e425f7c9..8e8e83489959 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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c227cc1e2d17..6b83c2732463 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2013-04-03 Jakub Jelinek Backported from mainline + 2013-02-07 Jakub Jelinek + + PR c++/56239 + * g++.dg/parse/pr56239.C: New test. + 2013-01-25 Jakub Jelinek PR tree-optimization/56098 diff --git a/gcc/testsuite/g++.dg/parse/pr56239.C b/gcc/testsuite/g++.dg/parse/pr56239.C new file mode 100644 index 000000000000..08f7f6889381 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr56239.C @@ -0,0 +1,13 @@ +// PR c++/56239 +// { dg-do compile } + +struct S +{ + int operator () () { return 0; } +}; + +int +main () +{ + return (S ()) (); +}