We wrongly warned on instrumented VLAs that the size expression's
value is not used (with cc1plus only).  Unfortunately, this hasn't been
detected before due to disabled warnings in the VLA tests.  This patch
adds a (void) cast to suppress the warning as well as enables the
warnings in the VLA tests to detect unwanted warnings next time.

Tested x86_64-linux, ok for trunk?

2013-11-28  Marek Polacek  <pola...@redhat.com>

        PR sanitizer/59331
cp/
        * decl.c (compute_array_index_type): Cast the expression to void.
testsuite/
        * g++.dg/ubsan/pr59331.C: New test.
        * g++.dg/ubsan/cxx1y-vla.C: Enable -Wall -Wno-unused-variable.
        Disable the -w option.
        * c-c++-common/ubsan/vla-1.c: Likewise.
        * c-c++-common/ubsan/vla-2.c: Likewise.
        * c-c++-common/ubsan/vla-3.c: Don't use the -w option.

--- gcc/cp/decl.c.mp5   2013-11-28 16:15:42.606690956 +0100
+++ gcc/cp/decl.c       2013-11-28 17:49:44.120202587 +0100
@@ -8435,7 +8435,9 @@ compute_array_index_type (tree name, tre
              tree t = fold_build2 (PLUS_EXPR, TREE_TYPE (itype), itype,
                                    build_one_cst (TREE_TYPE (itype)));
              t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t),
-                              ubsan_instrument_vla (input_location, t), t);
+                              ubsan_instrument_vla (input_location, t),
+                              /* Cast to void to prevent bogus warning.  */
+                              build1 (CONVERT_EXPR, void_type_node, t));
              finish_expr_stmt (t);
            }
        }
--- gcc/testsuite/g++.dg/ubsan/pr59331.C.mp5    2013-11-28 16:29:13.967882392 
+0100
+++ gcc/testsuite/g++.dg/ubsan/pr59331.C        2013-11-28 17:54:24.125451857 
+0100
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=vla-bound -Wall -Wno-unused-variable" } */
+
+void foo(int i)
+{
+  /* Don't warn here with "value computed is not used".  */
+  char a[i];
+}
--- gcc/testsuite/g++.dg/ubsan/cxx1y-vla.C.mp5  2013-11-28 17:51:51.066755487 
+0100
+++ gcc/testsuite/g++.dg/ubsan/cxx1y-vla.C      2013-11-28 17:59:49.578744756 
+0100
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-options "-fsanitize=vla-bound -w -std=c++1y" } */
+/* { dg-options "-fsanitize=vla-bound -Wall -Wno-unused-variable -std=c++1y" } 
*/
 /* { dg-shouldfail "ubsan" } */
 
 int
--- gcc/testsuite/c-c++-common/ubsan/vla-1.c.mp5        2013-11-28 
18:03:32.318664603 +0100
+++ gcc/testsuite/c-c++-common/ubsan/vla-1.c    2013-11-28 18:03:45.627715609 
+0100
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-options "-fsanitize=vla-bound -w" } */
+/* { dg-options "-fsanitize=vla-bound -Wall -Wno-unused-variable" } */
 
 static int
 bar (void)
--- gcc/testsuite/c-c++-common/ubsan/vla-3.c.mp5        2013-11-28 
18:04:25.737865780 +0100
+++ gcc/testsuite/c-c++-common/ubsan/vla-3.c    2013-11-28 18:04:34.796900021 
+0100
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-options "-fsanitize=vla-bound -w" } */
+/* { dg-options "-fsanitize=vla-bound" } */
 
 /* Don't instrument the arrays here.  */
 int
--- gcc/testsuite/c-c++-common/ubsan/vla-2.c.mp5        2013-11-28 
18:03:54.249748290 +0100
+++ gcc/testsuite/c-c++-common/ubsan/vla-2.c    2013-11-28 18:04:07.666798731 
+0100
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-options "-fsanitize=vla-bound -w" } */
+/* { dg-options "-fsanitize=vla-bound -Wall -Wno-unused-variable" } */
 
 int
 main (void)

        Marek

Reply via email to