Work harder to avoid -Wuninitialized for objects of empty structs (PR middle-end/96295).

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.
This commit is contained in:
Martin Sebor 2020-09-16 13:23:31 -06:00
parent 8155316c6f
commit 8b75204b27
2 changed files with 28 additions and 0 deletions

View file

@ -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;
}
}

View 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)