diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2014-07-17 08:32:18 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-07-17 08:32:18 +0000 |
commit | cfe309a158dcd4ab2c2839c2f2a4e413300fa75a (patch) | |
tree | ed9b2975d2f2d8b46d2610823a8eb1290e52c4a2 /gcc | |
parent | bf95b6295ca8a76eec569791cfa3c8de19513204 (diff) | |
download | gcc-cfe309a158dcd4ab2c2839c2f2a4e413300fa75a.zip gcc-cfe309a158dcd4ab2c2839c2f2a4e413300fa75a.tar.gz gcc-cfe309a158dcd4ab2c2839c2f2a4e413300fa75a.tar.bz2 |
re PR c++/61804 (rejects-valid if parenthesized temporary is incremented)
/cp
2014-07-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/61804
* parser.c (cp_parser_tokens_start_cast_expression): Return -1
for '++' and '--'.
/testsuite
2014-07-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/61804
* g++.dg/parse/pr61804.C: New.
From-SVN: r212743
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 24 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/pr61804.C | 9 |
4 files changed, 39 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4291bd0..e4b27f4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-07-17 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/61804 + * parser.c (cp_parser_tokens_start_cast_expression): Return -1 + for '++' and '--'. + 2014-07-15 Jason Merrill <jason@redhat.com> PR c++/61811 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 55dd29f..178114d 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 c507c8b..8e656fe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-07-17 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/61804 + * g++.dg/parse/pr61804.C: New. + 2014-07-16 Arnaud Charlet <charlet@adacore.com> * 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 0000000..898dc09 --- /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; } |