C: fix uninitialized ranges for __alignof__
authorDavid Malcolm <dmalcolm@redhat.com>
Tue, 8 Dec 2015 17:03:26 +0000 (17:03 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Tue, 8 Dec 2015 17:03:26 +0000 (17:03 +0000)
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

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

index 62d92c06b00ca63cefef6c84c2ecfe365320eae3..2ba94646e646af97a44c6c97aeb1c1b1bb781c2f 100644 (file)
@@ -1,3 +1,9 @@
+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
index 8ea0e959379d8bbbecdd93cbb9a4db992b6d5244..4611e5b23582da26e7e065955d379f5006fd890a 100644 (file)
@@ -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;
     }
 }
index 00dc04197964cbb1deeb366d2967db3d85a31ac9..5ff217722c1c196081e7b2145df903daf24475c7 100644 (file)
@@ -1,3 +1,8 @@
+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
index 023385bccf05963c8dbd2e0b6d6f7c4502a3df7d..175b2ea017c3ed2b25fe34c913220865cf54d8ec 100644 (file)
@@ -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);