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.
--- /dev/null
+/* 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;
+ }
+}
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)