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.

Reply via email to