From: David Malcolm Date: Tue, 8 Dec 2015 16:57:27 +0000 (+0000) Subject: PR c/68757: fix uninitialized src_range for various builtins X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=46c6e1e20e58a8e071c163d9f1a8ea179a437fd3;p=gcc.git PR c/68757: fix uninitialized src_range for various builtins gcc/c/ChangeLog: PR c/68757 * c-parser.c (c_parser_get_builtin_args): Add "out_close_paren_loc" param, and write back to it. (c_parser_postfix_expression): Capture the closing parenthesis location for RID_CHOOSE_EXPR, RID_BUILTIN_CALL_WITH_STATIC_CHAIN, RID_BUILTIN_COMPLEX, RID_BUILTIN_SHUFFLE and use it to set the source range for such expressions; within RID_BUILTIN_COMPLEX set the underlying location. gcc/testsuite/ChangeLog: PR c/68757 * gcc.dg/plugin/diagnostic-test-expressions-1.c (test_builtin_choose_expr): New test function. (test_builtin_call_with_static_chain): Likewise. (test_builtin_complex): Likewise. (test_builtin_shuffle): Likewise. From-SVN: r231414 --- diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 0b3351ce960..62d92c06b00 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,15 @@ +2015-12-08 David Malcolm + + PR c/68757 + * c-parser.c (c_parser_get_builtin_args): Add + "out_close_paren_loc" param, and write back to it. + (c_parser_postfix_expression): Capture the closing + parenthesis location for RID_CHOOSE_EXPR, + RID_BUILTIN_CALL_WITH_STATIC_CHAIN, RID_BUILTIN_COMPLEX, + RID_BUILTIN_SHUFFLE and use it to set the source range + for such expressions; within RID_BUILTIN_COMPLEX set + the underlying location. + 2015-12-07 Marek Polacek PR c/68668 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index c7d15f9fc38..8ea0e959379 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -6933,11 +6933,14 @@ c_parser_alignof_expression (c_parser *parser) for the middle-end nodes like COMPLEX_EXPR, VEC_PERM_EXPR and others. The name of the builtin is passed using BNAME parameter. Function returns true if there were no errors while parsing and - stores the arguments in CEXPR_LIST. */ + stores the arguments in CEXPR_LIST. If it returns true, + *OUT_CLOSE_PAREN_LOC is written to with the location of the closing + parenthesis. */ static bool c_parser_get_builtin_args (c_parser *parser, const char *bname, vec **ret_cexpr_list, - bool choose_expr_p) + bool choose_expr_p, + location_t *out_close_paren_loc) { location_t loc = c_parser_peek_token (parser)->location; vec *cexpr_list; @@ -6955,6 +6958,7 @@ c_parser_get_builtin_args (c_parser *parser, const char *bname, if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) { + *out_close_paren_loc = c_parser_peek_token (parser)->location; c_parser_consume_token (parser); return true; } @@ -6974,6 +6978,7 @@ c_parser_get_builtin_args (c_parser *parser, const char *bname, vec_safe_push (cexpr_list, expr); } + *out_close_paren_loc = c_parser_peek_token (parser)->location; if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>")) return false; @@ -7594,11 +7599,13 @@ c_parser_postfix_expression (c_parser *parser) vec *cexpr_list; c_expr_t *e1_p, *e2_p, *e3_p; tree c; + location_t close_paren_loc; c_parser_consume_token (parser); if (!c_parser_get_builtin_args (parser, "__builtin_choose_expr", - &cexpr_list, true)) + &cexpr_list, true, + &close_paren_loc)) { expr.value = error_mark_node; break; @@ -7626,6 +7633,7 @@ c_parser_postfix_expression (c_parser *parser) " a constant"); constant_expression_warning (c); expr = integer_zerop (c) ? *e3_p : *e2_p; + set_c_expr_source_range (&expr, loc, close_paren_loc); break; } case RID_TYPES_COMPATIBLE_P: @@ -7677,11 +7685,13 @@ c_parser_postfix_expression (c_parser *parser) vec *cexpr_list; c_expr_t *e2_p; tree chain_value; + location_t close_paren_loc; c_parser_consume_token (parser); if (!c_parser_get_builtin_args (parser, "__builtin_call_with_static_chain", - &cexpr_list, false)) + &cexpr_list, false, + &close_paren_loc)) { expr.value = error_mark_node; break; @@ -7710,17 +7720,20 @@ c_parser_postfix_expression (c_parser *parser) "must be a pointer type"); else CALL_EXPR_STATIC_CHAIN (expr.value) = chain_value; + set_c_expr_source_range (&expr, loc, close_paren_loc); break; } case RID_BUILTIN_COMPLEX: { vec *cexpr_list; c_expr_t *e1_p, *e2_p; + location_t close_paren_loc; c_parser_consume_token (parser); if (!c_parser_get_builtin_args (parser, "__builtin_complex", - &cexpr_list, false)) + &cexpr_list, false, + &close_paren_loc)) { expr.value = error_mark_node; break; @@ -7765,11 +7778,12 @@ c_parser_postfix_expression (c_parser *parser) } pedwarn_c90 (loc, OPT_Wpedantic, "ISO C90 does not support complex types"); - expr.value = build2 (COMPLEX_EXPR, - build_complex_type - (TYPE_MAIN_VARIANT - (TREE_TYPE (e1_p->value))), - e1_p->value, e2_p->value); + expr.value = build2_loc (loc, COMPLEX_EXPR, + build_complex_type + (TYPE_MAIN_VARIANT + (TREE_TYPE (e1_p->value))), + e1_p->value, e2_p->value); + set_c_expr_source_range (&expr, loc, close_paren_loc); break; } case RID_BUILTIN_SHUFFLE: @@ -7777,11 +7791,13 @@ c_parser_postfix_expression (c_parser *parser) vec *cexpr_list; unsigned int i; c_expr_t *p; + location_t close_paren_loc; c_parser_consume_token (parser); if (!c_parser_get_builtin_args (parser, "__builtin_shuffle", - &cexpr_list, false)) + &cexpr_list, false, + &close_paren_loc)) { expr.value = error_mark_node; break; @@ -7808,6 +7824,7 @@ c_parser_postfix_expression (c_parser *parser) "%<__builtin_shuffle%>"); expr.value = error_mark_node; } + set_c_expr_source_range (&expr, loc, close_paren_loc); break; } case RID_AT_SELECTOR: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cde15dfc28e..00dc0419796 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2015-12-08 David Malcolm + + PR c/68757 + * gcc.dg/plugin/diagnostic-test-expressions-1.c + (test_builtin_choose_expr): New test function. + (test_builtin_call_with_static_chain): Likewise. + (test_builtin_complex): Likewise. + (test_builtin_shuffle): Likewise. + 2015-12-08 Jiong Wang * gcc.target/aarch64/got_mem_hoist_1.c (dg-skip-if): Match big-endian diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-expressions-1.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-expressions-1.c index 0d8c7c5fa10..023385bccf0 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-expressions-1.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-expressions-1.c @@ -518,6 +518,56 @@ void test_builtin_offsetof (int i) { dg-end-multiline-output "" } */ } +void test_builtin_choose_expr (int i) +{ + __emit_expression_range (0, __builtin_choose_expr (1, i, i) + i); /* { dg-warning "range" } */ +/* { dg-begin-multiline-output "" } + __emit_expression_range (0, __builtin_choose_expr (1, i, i) + i); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ + { dg-end-multiline-output "" } */ + + __emit_expression_range (0, i + __builtin_choose_expr (1, i, i)); /* { dg-warning "range" } */ +/* { dg-begin-multiline-output "" } + __emit_expression_range (0, i + __builtin_choose_expr (1, i, i)); + ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + { dg-end-multiline-output "" } */ +} + +extern int f (int); +void test_builtin_call_with_static_chain (int i, void *ptr) +{ + __emit_expression_range (0, __builtin_call_with_static_chain (f (i), ptr)); /* { dg-warning "range" } */ +/* { dg-begin-multiline-output "" } + __emit_expression_range (0, __builtin_call_with_static_chain (f (i), ptr)); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~ + { dg-end-multiline-output "" } */ +} + +void test_builtin_complex (float i, float j) +{ + __emit_expression_range (0, __builtin_complex (i, j) ); /* { dg-warning "range" } */ +/* { dg-begin-multiline-output "" } + __emit_expression_range (0, __builtin_complex (i, j) ); + ^~~~~~~~~~~~~~~~~~~~~~~~ + { dg-end-multiline-output "" } */ +} + +typedef int v4si __attribute__ ((vector_size (16))); +void test_builtin_shuffle (v4si a, v4si b, v4si mask) +{ + __emit_expression_range (0, __builtin_shuffle (a, mask) ); /* { dg-warning "range" } */ +/* { dg-begin-multiline-output "" } + __emit_expression_range (0, __builtin_shuffle (a, mask) ); + ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + { dg-end-multiline-output "" } */ + + __emit_expression_range (0, __builtin_shuffle (a, b, mask) ); /* { dg-warning "range" } */ +/* { dg-begin-multiline-output "" } + __emit_expression_range (0, __builtin_shuffle (a, b, mask) ); + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + { dg-end-multiline-output "" } */ +} + /* Examples of non-trivial expressions. ****************************/ extern double sqrt (double x);