diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C | 66 |
4 files changed, 94 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 317415c..97bf27f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +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> * parser.c (cp_parser_cv_qualifier_seq_opt): Add fix-it info to diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 3efb28c..3a0e0cb 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -7805,12 +7805,11 @@ cp_parser_unary_expression (cp_parser *parser, cp_id_kind * pidk, { tree operand, ret; enum tree_code op; - location_t first_loc; + location_t start_loc = token->location; op = keyword == RID_ALIGNOF ? ALIGNOF_EXPR : SIZEOF_EXPR; /* Consume the token. */ cp_lexer_consume_token (parser->lexer); - first_loc = cp_lexer_peek_token (parser->lexer)->location; /* Parse the operand. */ operand = cp_parser_sizeof_operand (parser, keyword); @@ -7846,9 +7845,21 @@ cp_parser_unary_expression (cp_parser *parser, cp_id_kind * pidk, TREE_SIDE_EFFECTS (ret) = 0; 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: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c8d79e3..a8381fa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +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> * gcc.dg/tree-ssa/cmpexactdiv-2.c: New file. diff --git a/gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C b/gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C index 4d3b07c..2c004f3 100644 --- a/gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C +++ b/gcc/testsuite/g++.dg/plugin/diagnostic-test-expressions-1.C @@ -101,6 +101,72 @@ int test_postfix_incdec (int i) /* 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) { __emit_expression_range (0, ++i ); /* { dg-warning "range" } */ |