Commit 69b76518 by Torvald Riegel Committed by Torvald Riegel

Require parentheses when parsing transaction expressions.

	gcc/
	* c-parser.c (c_parser_transaction_expression): Require parentheses
	when parsing transaction expressions.

	gcc/cp/
	* parser.c (cp_parser_transaction_expression): Require parentheses
	when parsing transaction expressions.

	gcc/testsuite/
	* c-c++-common/tm/trxn-expr-3.c: New test.

From-SVN: r181383
parent 402356d1
2011-11-15 Torvald Riegel <triegel@redhat.com>
* c-parser.c (c_parser_transaction_expression): Require parentheses
when parsing transaction expressions.
2011-11-15 Tristan Gingold <gingold@adacore.com> 2011-11-15 Tristan Gingold <gingold@adacore.com>
* incpath.c (get_added_cpp_dirs): New function. * incpath.c (get_added_cpp_dirs): New function.
...@@ -10699,7 +10699,7 @@ c_parser_transaction_expression (c_parser *parser, enum rid keyword) ...@@ -10699,7 +10699,7 @@ c_parser_transaction_expression (c_parser *parser, enum rid keyword)
} }
parser->in_transaction = this_in; parser->in_transaction = this_in;
if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
{ {
tree expr = c_parser_expression (parser).value; tree expr = c_parser_expression (parser).value;
ret.original_type = TREE_TYPE (expr); ret.original_type = TREE_TYPE (expr);
...@@ -10708,10 +10708,15 @@ c_parser_transaction_expression (c_parser *parser, enum rid keyword) ...@@ -10708,10 +10708,15 @@ c_parser_transaction_expression (c_parser *parser, enum rid keyword)
TRANSACTION_EXPR_RELAXED (ret.value) = 1; TRANSACTION_EXPR_RELAXED (ret.value) = 1;
SET_EXPR_LOCATION (ret.value, loc); SET_EXPR_LOCATION (ret.value, loc);
ret.original_code = TRANSACTION_EXPR; ret.original_code = TRANSACTION_EXPR;
if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
{
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
goto error;
}
} }
else else
{ {
c_parser_error (parser, "expected %<(%>"); error:
ret.value = error_mark_node; ret.value = error_mark_node;
ret.original_code = ERROR_MARK; ret.original_code = ERROR_MARK;
ret.original_type = NULL; ret.original_type = NULL;
......
2011-11-15 Torvald Riegel <triegel@redhat.com>
* parser.c (cp_parser_transaction_expression): Require parentheses
when parsing transaction expressions.
2011-11-14 Ed Smith-Rowland <3dw4rd@verizon.net> 2011-11-14 Ed Smith-Rowland <3dw4rd@verizon.net>
PR c++/51107 PR c++/51107
......
...@@ -26811,7 +26811,7 @@ cp_parser_transaction_expression (cp_parser *parser, enum rid keyword) ...@@ -26811,7 +26811,7 @@ cp_parser_transaction_expression (cp_parser *parser, enum rid keyword)
unsigned char old_in = parser->in_transaction; unsigned char old_in = parser->in_transaction;
unsigned char this_in = 1; unsigned char this_in = 1;
cp_token *token; cp_token *token;
tree ret; tree expr;
gcc_assert (keyword == RID_TRANSACTION_ATOMIC gcc_assert (keyword == RID_TRANSACTION_ATOMIC
|| keyword == RID_TRANSACTION_RELAXED); || keyword == RID_TRANSACTION_RELAXED);
...@@ -26832,22 +26832,19 @@ cp_parser_transaction_expression (cp_parser *parser, enum rid keyword) ...@@ -26832,22 +26832,19 @@ cp_parser_transaction_expression (cp_parser *parser, enum rid keyword)
this_in |= TM_STMT_ATTR_RELAXED; this_in |= TM_STMT_ATTR_RELAXED;
parser->in_transaction = this_in; parser->in_transaction = this_in;
if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)) cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
{
tree expr = cp_parser_expression (parser, /*cast_p=*/false, NULL); expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
ret = build_transaction_expr (token->location, expr, this_in); finish_parenthesized_expr (expr);
} expr = build_transaction_expr (token->location, expr, this_in);
else
{ cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
cp_parser_error (parser, "expected %<(%>");
ret = error_mark_node;
}
parser->in_transaction = old_in; parser->in_transaction = old_in;
if (cp_parser_non_integral_constant_expression (parser, NIC_TRANSACTION)) if (cp_parser_non_integral_constant_expression (parser, NIC_TRANSACTION))
return error_mark_node; return error_mark_node;
return (flag_tm ? ret : error_mark_node); return (flag_tm ? expr : error_mark_node);
} }
/* Parse a function-transaction-block. /* Parse a function-transaction-block.
......
2011-11-15 Torvald Riegel <triegel@redhat.com>
* c-c++-common/tm/trxn-expr-3.c: New test.
2011-11-14 Torvald Riegel <triegel@redhat.com> 2011-11-14 Torvald Riegel <triegel@redhat.com>
* g++.dg/tm/template-1.C: Add cleanup-tree-dump. Fix typo in comment. * g++.dg/tm/template-1.C: Add cleanup-tree-dump. Fix typo in comment.
......
// { dg-do compile }
// { dg-options "-fgnu-tm -O -fdump-tree-tmmark" }
int global;
int f2()
{
return __transaction_atomic (global + 3)
+ __transaction_atomic (global + 4);
}
/* { dg-final { scan-tree-dump-times "ITM_RU" 2 "tmmark" } } */
/* { dg-final { scan-tree-dump-times "ITM_commitTransaction" 2 "tmmark" } } */
/* { dg-final { cleanup-tree-dump "tmmark" } } */
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