tree-vrp.c (check_array_ref): Bail out on zero-length arrays.
authorMeador Inge <meadori@codesourcery.com>
Fri, 30 Aug 2013 16:36:46 +0000 (16:36 +0000)
committerMeador Inge <meadori@gcc.gnu.org>
Fri, 30 Aug 2013 16:36:46 +0000 (16:36 +0000)
gcc/

2013-08-30  Meador Inge  <meadori@codesourcery.com>

* tree-vrp.c (check_array_ref): Bail out on zero-length arrays.

gcc/testsuite/

2013-08-30  Meador Inge  <meadori@codesourcery.com>

* gcc.dg/Warray-bounds-11.c: New testcase.

From-SVN: r202115

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Warray-bounds-11.c [new file with mode: 0644]
gcc/tree-vrp.c

index 787040f5dc7fd4a6c74360f33a5985e045f0b4be..cbc6f8bd54f86d03d95d6a5456ad2ad635cc250e 100644 (file)
@@ -1,3 +1,7 @@
+2013-08-30  Meador Inge  <meadori@codesourcery.com>
+
+       * tree-vrp.c (check_array_ref): Bail out on zero-length arrays.
+
 2013-08-30  Marek Polacek  <polacek@redhat.com>
 
        * Makefile.in (ubsan.o): Add.
index 4895bb8e3aae8908fafaa322baed6eb8428dda80..144a6e60833b666595c46441de260718086941f0 100644 (file)
@@ -1,3 +1,7 @@
+2013-08-30  Meador Inge  <meadori@codesourcery.com>
+
+       * gcc.dg/Warray-bounds-11.c: New testcase.
+
 2013-08-30  Marek Polacek  <polacek@redhat.com>
 
        * g++.dg/ubsan/div-by-zero-1.C: New test.
diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-11.c b/gcc/testsuite/gcc.dg/Warray-bounds-11.c
new file mode 100644 (file)
index 0000000..130175d
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Warray-bounds -std=gnu99" } */
+/* Test zero-length arrays for GNU C.  */
+
+unsigned int a[] = { };
+unsigned int size_a;
+
+int test(void)
+{
+  /* This should not warn.  */
+  return size_a ? a[0] : 0;
+}
index d5548ff55eb3d8d554f02553fd2bcdf2dd7c7787..062e03c5c4351af3b067541ef4485e6d93e26261 100644 (file)
@@ -6137,9 +6137,10 @@ check_array_ref (location_t location, tree ref, bool ignore_off_by_one)
   low_sub = up_sub = TREE_OPERAND (ref, 1);
   up_bound = array_ref_up_bound (ref);
 
-  /* Can not check flexible arrays.  */
+  /* Can not check flexible arrays or zero-length arrays.  */
   if (!up_bound
-      || TREE_CODE (up_bound) != INTEGER_CST)
+      || TREE_CODE (up_bound) != INTEGER_CST
+      || tree_int_cst_equal (up_bound, integer_minus_one_node))
     return;
 
   /* Accesses to trailing arrays via pointers may access storage