]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/37861 (Bogus array bounds warning)
authorMartin Jambor <mjambor@suse.cz>
Wed, 5 Nov 2008 16:06:38 +0000 (17:06 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Wed, 5 Nov 2008 16:06:38 +0000 (17:06 +0100)
2008-11-05  Martin Jambor  <mjambor@suse.cz>

PR middle-end/37861
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Don't turn
pointer arithmetics into array_ref if the array is accessed
through an indirect_ref.
* testsuite/gcc.dg/Warray-bounds-5.c: New file.
* testsuite/gcc.dg/Warray-bounds-6.c: New file.

From-SVN: r141613

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Warray-bounds-5.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Warray-bounds-6.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index 4a6b0c20f9045dc8ad7d19094cec5652c0063bf3..551175064f1ce611111b543f30b6286e26f20d5b 100644 (file)
@@ -1,3 +1,10 @@
+2008-11-05  Martin Jambor  <mjambor@suse.cz>
+
+       PR middle-end/37861
+       * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Don't turn
+       pointer arithmetics into array_ref if the array is accessed
+       through an indirect_ref.
+
 2008-11-05  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/37742
index 1049f5f50a65dac15d2ac74ff8ff16433526a5dc..fa5e732f0154f2c09243e1347821d3cb127f02a8 100644 (file)
@@ -1,3 +1,9 @@
+2008-11-05  Martin Jambor  <mjambor@suse.cz>
+
+       PR middle-end/37861
+       * gcc.dg/Warray-bounds-5.c: New test.
+       * gcc.dg/Warray-bounds-6.c: New test.
+
 2008-11-05  Fabien Chene <fabien.chene@gmail.com>
 
        PR c++/32519
diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-5.c b/gcc/testsuite/gcc.dg/Warray-bounds-5.c
new file mode 100644 (file)
index 0000000..ba9cd2a
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -Wall" } */
+/* based on PR 37861 */
+
+extern int printf (__const char *__restrict __format, ...);
+
+static int f2(char formatstr[10][100])  
+{
+  int anz;
+  for( anz = 0; anz < 10; ++anz ) {
+    printf( "%d %s\n", anz, formatstr[anz] );
+  } 
+  return anz;
+}
+
+
+static   char formatstr[10][100];
+int main( void ) 
+{
+  int anz;
+  anz = f2(formatstr);
+  printf( "   %d\n",anz);
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-6.c b/gcc/testsuite/gcc.dg/Warray-bounds-6.c
new file mode 100644 (file)
index 0000000..44a513b
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -Wall" } */
+/* based on PR 37861 */
+
+extern int printf (__const char *__restrict __format, ...);
+
+static int f3(int v)
+{
+  int i,j = 0;
+  for (i = 0; i <= v; i++)
+    j++;
+  return j;
+}
+
+static int f2(char formatstr[10][100]) {
+  printf( "%d %s\n", 0, formatstr[f3(0)] );
+  printf( "%d %s\n", 1, formatstr[f3(1)] );
+  printf( "%d %s\n", 2, formatstr[f3(2)] );
+  printf( "%d %s\n", 3, formatstr[f3(3)] );
+  return 3;
+}
+
+static   char formatstr[10][100];
+int main( void ) {
+  int anz;
+  anz = f2(formatstr);
+  printf( "   %d\n",anz);
+  return 0;
+}
index a04e7ca4404bd9b08355388e1f754926aa021bb4..5626b103429e7d492accaac3bac606c946d680f2 100644 (file)
@@ -802,6 +802,9 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
   array_ref = TREE_OPERAND (def_rhs, 0);
   if (TREE_CODE (array_ref) != ARRAY_REF
       || TREE_CODE (TREE_TYPE (TREE_OPERAND (array_ref, 0))) != ARRAY_TYPE
+      /* Avoid accessing hidden multidimensional arrays in this way or VRP
+        might give out bogus warnings (see PR 37861) */
+      || TREE_CODE (TREE_OPERAND (array_ref, 0)) == INDIRECT_REF
       || !integer_zerop (TREE_OPERAND (array_ref, 1)))
     return false;