https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78044

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
Well.  someFunction () is optimized down to just

void someFunction() ()
{
  int aOptional$4;
  struct C D.2560;
  struct C D.2555;
  void * _4;

  <bb 2>:
  C::operator mpl_::B (&D.2555);
  D.2555 ={v} {CLOBBER};
  _4 = operator new (8);
  C::operator mpl_::B (&D.2560);

  <bb 3>:
  D.2560 ={v} {CLOBBER};
  MEM[(int *)_4 + 4B] = aOptional$4_2(D);
  return;

<L0>:
  operator delete (_4, 8);
  resx 3

so unless C::operator mpl_::B (&D.2560); always throws we store
aOptional$4_2(D)
(uninitialized) to MEM[(int *)_4 + 4B].  The warning itself is a bit misleading
I guess.

Thus

    int __trans_tmp_1 = p1.get_impl ();
    new (m_storage.address ()) int(__trans_tmp_1);

and

  int
  get_impl ()
  {
    union
    {
      void *ap_pvoid;
      int *as_ptype;
    } caster{m_storage.address ()};
    get_impl___trans_tmp_3 = *caster.as_ptype;
    int __trans_tmp_2 = get_impl___trans_tmp_3;
    B __trans_tmp_4 = C ();
    return __trans_tmp_2;
  }

doesn't cover up the fact that m_storage is not initialized.

This might be an artifact of the testcase reduction of course.

Reply via email to