Work harder to avoid -Wuninitialized for objects of empty structs (PR middle-end...
authorMartin Sebor <msebor@redhat.com>
Wed, 16 Sep 2020 19:23:31 +0000 (13:23 -0600)
committerMartin Sebor <msebor@redhat.com>
Wed, 16 Sep 2020 19:23:31 +0000 (13:23 -0600)
Resolves:
PR middle-end/96295 - -Wmaybe-uninitialized warning for range operator with
reference to an empty struct

gcc/ChangeLog:

PR middle-end/96295
* tree-ssa-uninit.c (maybe_warn_operand): Work harder to avoid
warning for objects of empty structs

gcc/testsuite/ChangeLog:

PR middle-end/96295
* g++.dg/warn/Wuninitialized-11.C: New test.

gcc/testsuite/g++.dg/warn/Wuninitialized-11.C [new file with mode: 0644]
gcc/tree-ssa-uninit.c

diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-11.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-11.C
new file mode 100644 (file)
index 0000000..a6e8beb
--- /dev/null
@@ -0,0 +1,26 @@
+/* PR middle-end/96295 - -Wmaybe-uninitialized warning for range operator
+   with reference to an empty struct
+   { dg-do compile }
+   { dg-options "-Wall" }
+   { dg-require-effective-target c++11 } */
+
+struct I
+{
+  bool operator!= (const I&) const;
+  void* operator* () const;
+  I& operator++ ();
+};
+
+struct A
+{
+  I begin () const { return I (); }
+  I end () const { return I (); }
+};
+
+void f (void)
+{
+  for (void *p : A ())   // { dg-bogus "\\\[-Wmaybe-uninitialized" }
+    {
+      (void)p;
+    }
+}
index 7eddca397b3a43e7f1b78ffe820f90c8150db688..c7f994b0587f0ec96c1cdcd941587c8e39f6d5ef 100644 (file)
@@ -401,6 +401,8 @@ maybe_warn_operand (ao_ref &ref, gimple *stmt, tree lhs, tree rhs,
      The first_field() test is important for C++ where the predicate
      alone isn't always sufficient.  */
   tree rhstype = TREE_TYPE (rhs);
+  if (POINTER_TYPE_P (rhstype))
+    rhstype = TREE_TYPE (rhstype);
   if (TYPE_EMPTY_P (rhstype)
       || (RECORD_OR_UNION_TYPE_P (rhstype)
          && (!first_field (rhstype)