Commit cfe309a1 by Paolo Carlini Committed by Paolo Carlini

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
parent bf95b629
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> 2014-07-15 Jason Merrill <jason@redhat.com>
PR c++/61811 PR c++/61811
......
...@@ -7700,8 +7700,9 @@ cp_parser_delete_expression (cp_parser* parser) ...@@ -7700,8 +7700,9 @@ cp_parser_delete_expression (cp_parser* parser)
tf_warning_or_error); tf_warning_or_error);
} }
/* Returns 1 if TOKEN may start a cast-expression and, in C++11, /* Returns 1 if TOKEN may start a cast-expression and isn't '++', '--',
isn't '[', -1 if TOKEN is '[' in C++11, 0 otherwise. */ neither '[' in C++11; -1 if TOKEN is '++', '--', or '[' in C++11;
0 otherwise. */
static int static int
cp_parser_tokens_start_cast_expression (cp_parser *parser) cp_parser_tokens_start_cast_expression (cp_parser *parser)
...@@ -7755,13 +7756,26 @@ 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 return cp_lexer_peek_nth_token (parser->lexer, 2)->type
!= CPP_CLOSE_PAREN; != CPP_CLOSE_PAREN;
case CPP_OPEN_SQUARE:
/* '[' may start a primary-expression in obj-c++ and in C++11, /* '[' may start a primary-expression in obj-c++ and in C++11,
as a lambda-expression, eg, '(void)[]{}'. */ as a lambda-expression, eg, '(void)[]{}'. */
case CPP_OPEN_SQUARE:
if (cxx_dialect >= cxx11) if (cxx_dialect >= cxx11)
return -1; return -1;
return c_dialect_objc (); 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: default:
return 1; return 1;
} }
...@@ -7874,8 +7888,8 @@ cp_parser_cast_expression (cp_parser *parser, bool address_p, bool cast_p, ...@@ -7874,8 +7888,8 @@ cp_parser_cast_expression (cp_parser *parser, bool address_p, bool cast_p,
function returning T. */ function returning T. */
if (!cp_parser_error_occurred (parser)) if (!cp_parser_error_occurred (parser))
{ {
/* Only commit if the cast-expression doesn't start with '[' in /* Only commit if the cast-expression doesn't start with
C++11, which may or may not start a lambda-expression. */ '++', '--', or '[' in C++11. */
if (cast_expression > 0) if (cast_expression > 0)
cp_parser_commit_to_topmost_tentative_parse (parser); cp_parser_commit_to_topmost_tentative_parse (parser);
......
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> 2014-07-16 Arnaud Charlet <charlet@adacore.com>
* gnat.db/specs/alignment2.ads, gnat.db/specs/size_clause1.ads, * gnat.db/specs/alignment2.ads, gnat.db/specs/size_clause1.ads,
......
// 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; }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment