From: paolo Date: Thu, 17 Jul 2014 08:32:18 +0000 (+0000) Subject: /cp X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e9457fe5882f5dc3ac1ac3857ae54bcab6342f87;p=thirdparty%2Fgcc.git /cp 2014-07-17 Paolo Carlini PR c++/61804 * parser.c (cp_parser_tokens_start_cast_expression): Return -1 for '++' and '--'. /testsuite 2014-07-17 Paolo Carlini PR c++/61804 * g++.dg/parse/pr61804.C: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212743 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4291bd08a31c..e4b27f4112bd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-07-17 Paolo Carlini + + PR c++/61804 + * parser.c (cp_parser_tokens_start_cast_expression): Return -1 + for '++' and '--'. + 2014-07-15 Jason Merrill PR c++/61811 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 55dd29f002c6..178114d2c840 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -7700,8 +7700,9 @@ cp_parser_delete_expression (cp_parser* parser) tf_warning_or_error); } -/* Returns 1 if TOKEN may start a cast-expression and, in C++11, - isn't '[', -1 if TOKEN is '[' in C++11, 0 otherwise. */ +/* Returns 1 if TOKEN may start a cast-expression and isn't '++', '--', + neither '[' in C++11; -1 if TOKEN is '++', '--', or '[' in C++11; + 0 otherwise. */ static int cp_parser_tokens_start_cast_expression (cp_parser *parser) @@ -7755,13 +7756,26 @@ cp_parser_tokens_start_cast_expression (cp_parser *parser) return cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_CLOSE_PAREN; + case CPP_OPEN_SQUARE: /* '[' may start a primary-expression in obj-c++ and in C++11, as a lambda-expression, eg, '(void)[]{}'. */ - case CPP_OPEN_SQUARE: if (cxx_dialect >= cxx11) return -1; return c_dialect_objc (); + case CPP_PLUS_PLUS: + case CPP_MINUS_MINUS: + /* '++' and '--' may or may not start a cast-expression: + + struct T { void operator++(int); }; + void f() { (T())++; } + + vs + + int a; + (int)++a; */ + return -1; + default: return 1; } @@ -7874,8 +7888,8 @@ cp_parser_cast_expression (cp_parser *parser, bool address_p, bool cast_p, function returning T. */ if (!cp_parser_error_occurred (parser)) { - /* Only commit if the cast-expression doesn't start with '[' in - C++11, which may or may not start a lambda-expression. */ + /* Only commit if the cast-expression doesn't start with + '++', '--', or '[' in C++11. */ if (cast_expression > 0) cp_parser_commit_to_topmost_tentative_parse (parser); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c507c8b39404..8e656fef2971 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-07-17 Paolo Carlini + + PR c++/61804 + * g++.dg/parse/pr61804.C: New. + 2014-07-16 Arnaud Charlet * gnat.db/specs/alignment2.ads, gnat.db/specs/size_clause1.ads, diff --git a/gcc/testsuite/g++.dg/parse/pr61804.C b/gcc/testsuite/g++.dg/parse/pr61804.C new file mode 100644 index 000000000000..898dc09984e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr61804.C @@ -0,0 +1,9 @@ +// PR c++/61804 + +struct T { void operator++(int); }; +void f() { (T())++; } + +struct U { void operator--(int); }; +void g() { (U())--; } + +void h() { int a; (int)++a; (int)--a; }