re PR middle-end/81782 (Yet another -Wmaybe-uninitialized false positive with empty...
authorRichard Biener <rguenther@suse.de>
Fri, 8 Dec 2017 14:45:30 +0000 (14:45 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 8 Dec 2017 14:45:30 +0000 (14:45 +0000)
2017-12-08  Richard Biener  <rguenther@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.

From-SVN: r255512

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/uninit-pr81782.c [new file with mode: 0644]
gcc/tree-ssa-uninit.c

index 8184c66..bf4dc00 100644 (file)
@@ -1,3 +1,9 @@
+2017-12-08  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/81782
+       * tree-ssa-uninit.c (warn_uninitialized_vars): Properly
+       handle accesses outside of zero-sized vars.
+
 2017-12-08  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/83141
index d9ce35f..6a68ea6 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-08  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/81782
+       * gcc.dg/uninit-pr81782.c: New testcase.
+
 2017-12-08  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * g++.dg/opt/pr83252.C: Add -mclear-hwcap on *-*-solaris*.
diff --git a/gcc/testsuite/gcc.dg/uninit-pr81782.c b/gcc/testsuite/gcc.dg/uninit-pr81782.c
new file mode 100644 (file)
index 0000000..7d1e902
--- /dev/null
@@ -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;
+}
index 4096ded..b17b2b1 100644 (file)
@@ -296,8 +296,8 @@ warn_uninitialized_vars (bool warn_possibly_uninitialized)
                 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