From 8b75204b27cb2a296ac329d48918992b4053c61e Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Wed, 16 Sep 2020 13:23:31 -0600 Subject: 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. --- gcc/testsuite/g++.dg/warn/Wuninitialized-11.C | 26 ++++++++++++++++++++++++++ gcc/tree-ssa-uninit.c | 2 ++ 2 files changed, 28 insertions(+) create mode 100644 gcc/testsuite/g++.dg/warn/Wuninitialized-11.C (limited to 'gcc') diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-11.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-11.C new file mode 100644 index 0000000..a6e8beb --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-11.C @@ -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; + } +} diff --git a/gcc/tree-ssa-uninit.c b/gcc/tree-ssa-uninit.c index 7eddca3..c7f994b 100644 --- a/gcc/tree-ssa-uninit.c +++ b/gcc/tree-ssa-uninit.c @@ -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) -- cgit v1.1