c++: -Wuninitialized when binding a ref to uninit DM [PR113987]
commitb83f3cd3ff765fb82344b848b8a128763b7a4233
authorMarek Polacek <polacek@redhat.com>
Tue, 20 Feb 2024 20:55:55 +0000 (20 15:55 -0500)
committerMarek Polacek <polacek@redhat.com>
Thu, 29 Feb 2024 17:39:21 +0000 (29 12:39 -0500)
tree6d8c54ef52070c02a52dde1a9c62bd6f898e8a93
parentbc0e18a960f9dff3e740f4d0cb5b25b3f68d920a
c++: -Wuninitialized when binding a ref to uninit DM [PR113987]

This PR asks that our -Wuninitialized for mem-initializers does
not warn when binding a reference to an uninitialized data member.
We already check !INDIRECT_TYPE_P in find_uninit_fields_r, but
that won't catch binding a parameter of a reference type to an
uninitialized field, as in:

  struct S { S (int&); };
  struct T {
      T() : s(i) {}
      S s;
      int i;
  };

This patch adds a new function to handle this case.

PR c++/113987

gcc/cp/ChangeLog:

* call.cc (conv_binds_to_reference_parm_p): New.
* cp-tree.h (conv_binds_to_reference_parm_p): Declare.
* init.cc (find_uninit_fields_r): Call it.

gcc/testsuite/ChangeLog:

* g++.dg/warn/Wuninitialized-15.C: Turn dg-warning into dg-bogus.
* g++.dg/warn/Wuninitialized-34.C: New test.
gcc/cp/call.cc
gcc/cp/cp-tree.h
gcc/cp/init.cc
gcc/testsuite/g++.dg/warn/Wuninitialized-15.C
gcc/testsuite/g++.dg/warn/Wuninitialized-34.C [new file with mode: 0644]