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.
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. */
--- /dev/null
+// 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; }