The following fixes spurious uninit warnings for zero-sized arrays.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2017-12-08  Richard Biener  <rguent...@suse.de>

        PR middle-end/81782
        * tree-ssa-uninit.c (warn_uninitialized_vars): Properly
        handle accesses outside of zero-sized vars.

        * gcc.dg/uninit-pr81782.c: New testcase.

Index: gcc/tree-ssa-uninit.c
===================================================================
--- gcc/tree-ssa-uninit.c       (revision 255499)
+++ gcc/tree-ssa-uninit.c       (working copy)
@@ -296,8 +296,8 @@ warn_uninitialized_vars (bool warn_possi
                 variable.  */
              if (DECL_P (base)
                  && ref.size != -1
-                 && ref.max_size == ref.size
-                 && (ref.offset + ref.size <= 0
+                 && ((ref.max_size == ref.size
+                      && ref.offset + ref.size <= 0)
                      || (ref.offset >= 0
                          && DECL_SIZE (base)
                          && TREE_CODE (DECL_SIZE (base)) == INTEGER_CST
Index: gcc/testsuite/gcc.dg/uninit-pr81782.c
===================================================================
--- gcc/testsuite/gcc.dg/uninit-pr81782.c       (nonexistent)
+++ gcc/testsuite/gcc.dg/uninit-pr81782.c       (working copy)
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-Wmaybe-uninitialized" } */
+
+int
+foo (void)
+{
+  char empty_array[] = { };
+  int i, ret = 0;
+
+  for (i = 0; i < (int) (sizeof (empty_array) / sizeof (empty_array[0])); i++)
+    ret = empty_array[i]; /* { dg-bogus "uninitialized" } */
+
+  return ret;
+}

Reply via email to