public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-5479] c++: -Wuninitialized for mem-inits and empty classes [PR19808]
@ 2021-11-23 20:02 Marek Polacek
  0 siblings, 0 replies; only message in thread
From: Marek Polacek @ 2021-11-23 20:02 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:4b1d3d8d732bea86c7b2aba46c2a437461020824

commit r12-5479-g4b1d3d8d732bea86c7b2aba46c2a437461020824
Author: Marek Polacek <polacek@redhat.com>
Date:   Fri Nov 19 14:22:10 2021 -0500

    c++: -Wuninitialized for mem-inits and empty classes [PR19808]
    
    This fixes a bogus -Wuninitialized warning: there's nothing to initialize
    in empty classes, so don't add them into our uninitialized set.
    
            PR c++/19808
    
    gcc/cp/ChangeLog:
    
            * init.c (emit_mem_initializers): Don't add is_really_empty_class
            members into uninitialized.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/warn/Wuninitialized-28.C: Make a class nonempty.
            * g++.dg/warn/Wuninitialized-29.C: Likewise.
            * g++.dg/warn/Wuninitialized-31.C: New test.

Diff:
---
 gcc/cp/init.c                                 |  3 +-
 gcc/testsuite/g++.dg/warn/Wuninitialized-28.C |  1 +
 gcc/testsuite/g++.dg/warn/Wuninitialized-29.C |  1 +
 gcc/testsuite/g++.dg/warn/Wuninitialized-31.C | 73 +++++++++++++++++++++++++++
 4 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 975f2eda29d..2a4512e462a 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -1470,7 +1470,8 @@ emit_mem_initializers (tree mem_inits)
     for (tree f = next_initializable_field (TYPE_FIELDS (current_class_type));
 	 f != NULL_TREE;
 	 f = next_initializable_field (DECL_CHAIN (f)))
-      if (!DECL_ARTIFICIAL (f))
+      if (!DECL_ARTIFICIAL (f)
+	  && !is_really_empty_class (TREE_TYPE (f), /*ignore_vptr*/false))
 	uninitialized.add (f);
 
   if (mem_inits
diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-28.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-28.C
index 7dbbf8719ec..816249c2b9c 100644
--- a/gcc/testsuite/g++.dg/warn/Wuninitialized-28.C
+++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-28.C
@@ -47,6 +47,7 @@ struct F {
 };
 
 struct bar {
+  int a;
   bar() {}
   bar(bar&) {}
 };
diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-29.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-29.C
index bc742997441..da81abf07c9 100644
--- a/gcc/testsuite/g++.dg/warn/Wuninitialized-29.C
+++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-29.C
@@ -47,6 +47,7 @@ struct F {
 };
 
 struct bar {
+  int a;
   bar() {}
   bar(bar&) {}
 };
diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-31.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-31.C
new file mode 100644
index 00000000000..e22b150db46
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-31.C
@@ -0,0 +1,73 @@
+// PR c++/19808
+// { dg-do compile }
+// { dg-options "-Wuninitialized" }
+
+class AllocatorWithCleanup {
+public:
+  int *allocate(int);
+};
+class SecBlock {
+  SecBlock() : m_ptr(m_alloc.allocate(0)) {} // { dg-bogus "uninitialized" }
+  AllocatorWithCleanup m_alloc;
+  int *m_ptr;
+};
+
+struct A {
+  int *allocate(int);
+};
+
+struct B {
+  int : 0;
+  int *allocate(int);
+};
+
+struct C : B {
+};
+
+struct D {
+  char arr[0];
+  int *allocate(int);
+};
+
+struct E { };
+
+struct F {
+  E arr[10];
+  int *allocate(int);
+};
+
+struct G {
+  E e;
+  int *allocate(int);
+};
+
+struct H {
+  virtual void foo ();
+  int *allocate(int);
+};
+
+template<typename T>
+struct X {
+  X() : m_ptr(t.allocate(0)) {} // { dg-bogus "uninitialized" }
+  T t;
+  int *m_ptr;
+};
+
+struct V {
+  int a;
+  int *allocate(int);
+};
+
+struct Z {
+  Z() : m_ptr(v.allocate(0)) {} // { dg-warning "uninitialized" }
+  V v;
+  int *m_ptr;
+};
+
+X<A> x1;
+X<B> x2;
+X<C> x3;
+X<D> x4;
+X<F> x5;
+X<G> x6;
+X<H> x7;


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-11-23 20:02 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-23 20:02 [gcc r12-5479] c++: -Wuninitialized for mem-inits and empty classes [PR19808] Marek Polacek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).