Commit a1b93f8d by David Malcolm Committed by David Malcolm

C: fix uninitialized ranges for __alignof__

gcc/c/ChangeLog:
	* c-parser.c (c_parser_alignof_expression): Capture location of
	closing parenthesis (if any), or of end of unary expression, and
	use it to build a src_range for the expression.

gcc/testsuite/ChangeLog:
	* gcc.dg/plugin/diagnostic-test-expressions-1.c (test_alignof):
	New test function.

From-SVN: r231415
parent 46c6e1e2
2015-12-08 David Malcolm <dmalcolm@redhat.com>
* c-parser.c (c_parser_alignof_expression): Capture location of
closing parenthesis (if any), or of end of unary expression, and
use it to build a src_range for the expression.
2015-12-08 David Malcolm <dmalcolm@redhat.com>
PR c/68757
* c-parser.c (c_parser_get_builtin_args): Add
"out_close_paren_loc" param, and write back to it.
......
......@@ -6853,7 +6853,8 @@ static struct c_expr
c_parser_alignof_expression (c_parser *parser)
{
struct c_expr expr;
location_t loc = c_parser_peek_token (parser)->location;
location_t start_loc = c_parser_peek_token (parser)->location;
location_t end_loc;
tree alignof_spelling = c_parser_peek_token (parser)->value;
gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNOF));
bool is_c11_alignof = strcmp (IDENTIFIER_POINTER (alignof_spelling),
......@@ -6864,10 +6865,10 @@ c_parser_alignof_expression (c_parser *parser)
if (is_c11_alignof)
{
if (flag_isoc99)
pedwarn_c99 (loc, OPT_Wpedantic, "ISO C99 does not support %qE",
pedwarn_c99 (start_loc, OPT_Wpedantic, "ISO C99 does not support %qE",
alignof_spelling);
else
pedwarn_c99 (loc, OPT_Wpedantic, "ISO C90 does not support %qE",
pedwarn_c99 (start_loc, OPT_Wpedantic, "ISO C90 does not support %qE",
alignof_spelling);
}
c_parser_consume_token (parser);
......@@ -6884,6 +6885,7 @@ c_parser_alignof_expression (c_parser *parser)
c_parser_consume_token (parser);
loc = c_parser_peek_token (parser)->location;
type_name = c_parser_type_name (parser);
end_loc = c_parser_peek_token (parser)->location;
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
if (type_name == NULL)
{
......@@ -6910,21 +6912,25 @@ c_parser_alignof_expression (c_parser *parser)
false, is_c11_alignof, 1);
ret.original_code = ERROR_MARK;
ret.original_type = NULL;
set_c_expr_source_range (&ret, start_loc, end_loc);
return ret;
}
else
{
struct c_expr ret;
expr = c_parser_unary_expression (parser);
end_loc = expr.src_range.m_finish;
alignof_expr:
mark_exp_read (expr.value);
c_inhibit_evaluation_warnings--;
in_alignof--;
pedwarn (loc, OPT_Wpedantic, "ISO C does not allow %<%E (expression)%>",
pedwarn (start_loc,
OPT_Wpedantic, "ISO C does not allow %<%E (expression)%>",
alignof_spelling);
ret.value = c_alignof_expr (loc, expr.value);
ret.value = c_alignof_expr (start_loc, expr.value);
ret.original_code = ERROR_MARK;
ret.original_type = NULL;
set_c_expr_source_range (&ret, start_loc, end_loc);
return ret;
}
}
......
2015-12-08 David Malcolm <dmalcolm@redhat.com>
* gcc.dg/plugin/diagnostic-test-expressions-1.c (test_alignof):
New test function.
2015-12-08 David Malcolm <dmalcolm@redhat.com>
PR c/68757
* gcc.dg/plugin/diagnostic-test-expressions-1.c
(test_builtin_choose_expr): New test function.
......
......@@ -568,6 +568,33 @@ void test_builtin_shuffle (v4si a, v4si b, v4si mask)
{ dg-end-multiline-output "" } */
}
void test_alignof (int param)
{
__emit_expression_range (0, __alignof__ (int) + param ); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, __alignof__ (int) + param );
~~~~~~~~~~~~~~~~~~^~~~~~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, param + __alignof__ (int) ); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, param + __alignof__ (int) );
~~~~~~^~~~~~~~~~~~~~~~~~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, __alignof__ (param) + param ); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, __alignof__ (param) + param );
~~~~~~~~~~~~~~~~~~~~^~~~~~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, param + __alignof__ (param) ); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, param + __alignof__ (param) );
~~~~~~^~~~~~~~~~~~~~~~~~~~~
{ dg-end-multiline-output "" } */
}
/* Examples of non-trivial expressions. ****************************/
extern double sqrt (double x);
......
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