Commit 38050e90 by Paolo Carlini Committed by Paolo Carlini

re PR c++/18126 (sizeof compound-literal not parsed correctly)

/cp
2013-05-17  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/18126
	* parser.c (cp_parser_sizeof_operand): As a GNU Extension, parse
	correctly sizeof compound-literal; update comments.

/testsuite
2013-05-17  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/18126
	* g++.dg/ext/sizeof-complit.C: New.

From-SVN: r199012
parent 17042d2b
2013-05-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/18126
* parser.c (cp_parser_sizeof_operand): As a GNU Extension, parse
correctly sizeof compound-literal; update comments.
2013-05-16 Marc Glisse <marc.glisse@inria.fr> 2013-05-16 Marc Glisse <marc.glisse@inria.fr>
* call.c (build_conditional_expr_1): Use cp_build_binary_op * call.c (build_conditional_expr_1): Use cp_build_binary_op
......
...@@ -6591,6 +6591,9 @@ cp_parser_pseudo_destructor_name (cp_parser* parser, ...@@ -6591,6 +6591,9 @@ cp_parser_pseudo_destructor_name (cp_parser* parser,
__real__ cast-expression __real__ cast-expression
__imag__ cast-expression __imag__ cast-expression
&& identifier && identifier
sizeof ( type-id ) { initializer-list , [opt] }
alignof ( type-id ) { initializer-list , [opt] } [C++0x]
__alignof__ ( type-id ) { initializer-list , [opt] }
ADDRESS_P is true iff the unary-expression is appearing as the ADDRESS_P is true iff the unary-expression is appearing as the
operand of the `&' operator. CAST_P is true if this expression is operand of the `&' operator. CAST_P is true if this expression is
...@@ -13968,6 +13971,7 @@ cp_parser_type_specifier (cp_parser* parser, ...@@ -13968,6 +13971,7 @@ cp_parser_type_specifier (cp_parser* parser,
__int128 __int128
__typeof__ unary-expression __typeof__ unary-expression
__typeof__ ( type-id ) __typeof__ ( type-id )
__typeof__ ( type-id ) { initializer-list , [opt] }
Returns the indicated TYPE_DECL. If DECL_SPECS is not NULL, it is Returns the indicated TYPE_DECL. If DECL_SPECS is not NULL, it is
appropriately updated. */ appropriately updated. */
...@@ -22988,21 +22992,44 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword) ...@@ -22988,21 +22992,44 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
construction. */ construction. */
if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)) if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
{ {
tree type; tree type = NULL_TREE;
bool saved_in_type_id_in_expr_p; bool compound_literal_p;
/* We can't be sure yet whether we're looking at a type-id or an /* We can't be sure yet whether we're looking at a type-id or an
expression. */ expression. */
cp_parser_parse_tentatively (parser); cp_parser_parse_tentatively (parser);
/* Consume the `('. */ /* Consume the `('. */
cp_lexer_consume_token (parser->lexer); cp_lexer_consume_token (parser->lexer);
/* Parse the type-id. */ /* Note: as a GNU Extension, compound literals are considered
saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p; postfix-expressions as they are in C99, so they are valid
parser->in_type_id_in_expr_p = true; arguments to sizeof. See comment in cp_parser_cast_expression
type = cp_parser_type_id (parser); for details. */
parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p; cp_lexer_save_tokens (parser->lexer);
/* Now, look for the trailing `)'. */ /* Skip tokens until the next token is a closing parenthesis.
cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN); If we find the closing `)', and the next token is a `{', then
we are looking at a compound-literal. */
compound_literal_p
= (cp_parser_skip_to_closing_parenthesis (parser, false, false,
/*consume_paren=*/true)
&& cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE));
/* Roll back the tokens we skipped. */
cp_lexer_rollback_tokens (parser->lexer);
/* If we were looking at a compound-literal, simulate an error
so that the call to cp_parser_parse_definitely below will
fail. */
if (compound_literal_p)
cp_parser_simulate_error (parser);
else
{
bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
parser->in_type_id_in_expr_p = true;
/* Look for the type-id. */
type = cp_parser_type_id (parser);
/* Look for the closing `)'. */
cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
}
/* If all went well, then we're done. */ /* If all went well, then we're done. */
if (cp_parser_parse_definitely (parser)) if (cp_parser_parse_definitely (parser))
{ {
......
2013-05-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/18126
* g++.dg/ext/sizeof-complit.C: New.
2013-05-17 Marek Polacek <polacek@redhat.com> 2013-05-17 Marek Polacek <polacek@redhat.com>
* gcc.dg/strlenopt-25.c: New test. * gcc.dg/strlenopt-25.c: New test.
......
// PR c++/18126
// { dg-options "" }
struct s { int a; int b; };
char x[((sizeof (struct s){ 1, 2 }) == sizeof (struct s)) ? 1 : -1];
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