PR c/68757: fix uninitialized src_range for various builtins
authorDavid Malcolm <dmalcolm@redhat.com>
Tue, 8 Dec 2015 16:57:27 +0000 (16:57 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Tue, 8 Dec 2015 16:57:27 +0000 (16:57 +0000)
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

gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/plugin/diagnostic-test-expressions-1.c

index 0b3351ce960216d0f6dff745814ff644307c477e..62d92c06b00ca63cefef6c84c2ecfe365320eae3 100644 (file)
@@ -1,3 +1,15 @@
+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.
+       (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  <polacek@redhat.com>
 
        PR c/68668
index c7d15f9fc380005f35e560c6c181e27a262f9506..8ea0e959379d8bbbecdd93cbb9a4db992b6d5244 100644 (file)
@@ -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<c_expr_t, va_gc> **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<c_expr_t, va_gc> *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<c_expr_t, va_gc> *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<c_expr_t, va_gc> *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<c_expr_t, va_gc> *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<c_expr_t, va_gc> *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:
index cde15dfc28ece0e52b577e2b09b6c5ef83e57567..00dc04197964cbb1deeb366d2967db3d85a31ac9 100644 (file)
@@ -1,3 +1,12 @@
+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.
+       (test_builtin_call_with_static_chain): Likewise.
+       (test_builtin_complex): Likewise.
+       (test_builtin_shuffle): Likewise.
+
 2015-12-08  Jiong Wang  <jiong.wang@arm.com>
 
        * gcc.target/aarch64/got_mem_hoist_1.c (dg-skip-if): Match big-endian
index 0d8c7c5fa10804c3b4fbfce9912a97ad2606a32b..023385bccf05963c8dbd2e0b6d6f7c4502a3df7d 100644 (file)
@@ -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);