https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98744
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> --- The + if (!fn || DECL_HAS_IN_CHARGE_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. */ + return false; looks strange, isn't DECL_HAS_IN_CHARGE_PARM_P (fn) false on all base constructors (as those are the abstract ctors with the in_charge parameter removed and implied to be false)? I would have expected if (!fn || DECL_HAS_VTT_PARM_P (fn)) instead but then that is true even on the elide4.C testcase. But even elide4.C seems to suffer from this bug, in *.gimple I see: _3 = &this->D.2458; B::B (_3); goto <D.2555>; <D.2554>: _4 = &this->D.2458; B::B (_4); in void C::C (struct C * const this), but the ctor they are actually calling is: void B::B (struct B * const this, const void * * __vtt_parm) { _1 = *__vtt_parm; this->_vptr.B = _1; } Therefore, I'd say either it should be that DECL_HAS_VTT_PARM_P (fn) but then the question is whether the change does something useful, or for DECL_HAS_VTT_PARM_P we need to adjust the AGGR_INIT_EXPR too, to pass some virtual table pointer (no idea what). Anyway, that's all from me I'm afraid.