Commit 412f61f0 by David Malcolm Committed by David Malcolm

Fix location of sizeof/alignof (PR c++/80016)

PR c++/80016 reports an issue with bizarre underlined range
for a complicated expression.

The root cause for the incorrect *starting* location of that range
is that alignof and sizeof expressions currently have
start == finish == caret at the opening parenthesis of the
expression.

This patch fixes this by generating appropriate start and finish
locations for alignof and sizeof expressions.

gcc/cp/ChangeLog:
	PR c++/80016
	* parser.c (cp_parser_unary_expression):  Generate a location
	range for alignof and sizeof expressions.

gcc/testsuite/ChangeLog:
	PR c++/80016
	* g++.dg/plugin/diagnostic-test-expressions-1.C (test_sizeof): New
	test function.
	(test_alignof): New test function.

From-SVN: r247108
parent a8492d5e
2017-04-24 David Malcolm <dmalcolm@redhat.com>
PR c++/80016
* parser.c (cp_parser_unary_expression): Generate a location
range for alignof and sizeof expressions.
2017-04-24 Volker Reichelt <v.reichelt@netcologne.de> 2017-04-24 Volker Reichelt <v.reichelt@netcologne.de>
* parser.c (cp_parser_cv_qualifier_seq_opt): Add fix-it info to * parser.c (cp_parser_cv_qualifier_seq_opt): Add fix-it info to
......
...@@ -7805,12 +7805,11 @@ cp_parser_unary_expression (cp_parser *parser, cp_id_kind * pidk, ...@@ -7805,12 +7805,11 @@ cp_parser_unary_expression (cp_parser *parser, cp_id_kind * pidk,
{ {
tree operand, ret; tree operand, ret;
enum tree_code op; enum tree_code op;
location_t first_loc; location_t start_loc = token->location;
op = keyword == RID_ALIGNOF ? ALIGNOF_EXPR : SIZEOF_EXPR; op = keyword == RID_ALIGNOF ? ALIGNOF_EXPR : SIZEOF_EXPR;
/* Consume the token. */ /* Consume the token. */
cp_lexer_consume_token (parser->lexer); cp_lexer_consume_token (parser->lexer);
first_loc = cp_lexer_peek_token (parser->lexer)->location;
/* Parse the operand. */ /* Parse the operand. */
operand = cp_parser_sizeof_operand (parser, keyword); operand = cp_parser_sizeof_operand (parser, keyword);
...@@ -7846,9 +7845,21 @@ cp_parser_unary_expression (cp_parser *parser, cp_id_kind * pidk, ...@@ -7846,9 +7845,21 @@ cp_parser_unary_expression (cp_parser *parser, cp_id_kind * pidk,
TREE_SIDE_EFFECTS (ret) = 0; TREE_SIDE_EFFECTS (ret) = 0;
TREE_READONLY (ret) = 1; TREE_READONLY (ret) = 1;
} }
SET_EXPR_LOCATION (ret, first_loc);
} }
return ret;
/* Construct a location e.g. :
alignof (expr)
^~~~~~~~~~~~~~
with start == caret at the start of the "alignof"/"sizeof"
token, with the endpoint at the final closing paren. */
location_t finish_loc
= cp_lexer_previous_token (parser->lexer)->location;
location_t compound_loc
= make_location (start_loc, start_loc, finish_loc);
cp_expr ret_expr (ret);
ret_expr.set_location (compound_loc);
return ret_expr;
} }
case RID_NEW: case RID_NEW:
2017-04-24 David Malcolm <dmalcolm@redhat.com>
PR c++/80016
* g++.dg/plugin/diagnostic-test-expressions-1.C (test_sizeof): New
test function.
(test_alignof): New test function.
2017-04-24 Marc Glisse <marc.glisse@inria.fr> 2017-04-24 Marc Glisse <marc.glisse@inria.fr>
* gcc.dg/tree-ssa/cmpexactdiv-2.c: New file. * gcc.dg/tree-ssa/cmpexactdiv-2.c: New file.
......
...@@ -101,6 +101,72 @@ int test_postfix_incdec (int i) ...@@ -101,6 +101,72 @@ int test_postfix_incdec (int i)
/* Unary operators. ****************************************************/ /* Unary operators. ****************************************************/
int test_sizeof (int i)
{
__emit_expression_range (0, sizeof(int) + i); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, sizeof(int) + i);
~~~~~~~~~~~~^~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, i + sizeof(int)); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, i + sizeof(int));
~~^~~~~~~~~~~~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, sizeof i + i); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, sizeof i + i);
~~~~~~~~~^~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, i + sizeof i); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, i + sizeof i);
~~^~~~~~~~~~
{ dg-end-multiline-output "" } */
}
int test_alignof (int i)
{
__emit_expression_range (0, alignof(int) + i); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, alignof(int) + i);
~~~~~~~~~~~~~^~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, i + alignof(int)); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, i + alignof(int));
~~^~~~~~~~~~~~~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, __alignof__(int) + i); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, __alignof__(int) + i);
~~~~~~~~~~~~~~~~~^~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, i + __alignof__(int)); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, i + __alignof__(int));
~~^~~~~~~~~~~~~~~~~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, __alignof__ i + i); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, __alignof__ i + i);
~~~~~~~~~~~~~~^~~
{ dg-end-multiline-output "" } */
__emit_expression_range (0, i + __alignof__ i); /* { dg-warning "range" } */
/* { dg-begin-multiline-output "" }
__emit_expression_range (0, i + __alignof__ i);
~~^~~~~~~~~~~~~~~
{ dg-end-multiline-output "" } */
}
int test_prefix_incdec (int i) int test_prefix_incdec (int i)
{ {
__emit_expression_range (0, ++i ); /* { dg-warning "range" } */ __emit_expression_range (0, ++i ); /* { dg-warning "range" } */
......
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