c++: Fix base copy elision thinko [PR98744]
authorJason Merrill <jason@redhat.com>
Fri, 22 Jan 2021 16:57:27 +0000 (11:57 -0500)
committerJason Merrill <jason@redhat.com>
Fri, 22 Jan 2021 18:09:00 +0000 (13:09 -0500)
As Jakub points out in the PR, I was mixing up
DECL_HAS_IN_CHARGE_PARM_P (which is true for the abstract maybe-in-charge
constructor) and DECL_HAS_VTT_PARM_P (which is true for a base constructor
that needs to handle virtual bases).

gcc/cp/ChangeLog:

PR c++/98744
* call.c (make_base_init_ok): Use DECL_HAS_VTT_PARM_P.

gcc/testsuite/ChangeLog:

PR c++/98744
* g++.dg/init/elide7.C: New test.

gcc/cp/call.c
gcc/testsuite/g++.dg/init/elide7.C [new file with mode: 0644]

index b6e9f125aeb93f0bc22b308f3d7b8fa60e946ee3..a2c5ef736a26b9a5521ff5b613239dfc0bb703fb 100644 (file)
@@ -8470,7 +8470,7 @@ make_base_init_ok (tree exp)
     return true;
   gcc_assert (DECL_COMPLETE_CONSTRUCTOR_P (fn));
   fn = base_ctor_for (fn);
-  if (!fn || DECL_HAS_IN_CHARGE_PARM_P (fn))
+  if (!fn || DECL_HAS_VTT_PARM_P (fn))
     /* The base constructor has more parameters, so we can't just change the
        call target.  It would be possible to splice in the appropriate
        arguments, but probably not worth the complexity.  */
diff --git a/gcc/testsuite/g++.dg/init/elide7.C b/gcc/testsuite/g++.dg/init/elide7.C
new file mode 100644 (file)
index 0000000..d4bacaf
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/98744
+// { dg-additional-options "-O2 -fno-inline -Wmaybe-uninitialized" }
+
+struct A {};
+struct B : virtual A {};
+struct C : B {
+  C() : B(B()) {}
+};
+int main() { C c; return 0; }