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

--- Comment #82 from Richard Biener <rguenth at gcc dot gnu.org> ---
Btw, for the attached patch it would fail to handle the case of passing the
aggregate by value and the inliner introducing the aggregate copy:

inline void* operator new(__SIZE_TYPE__, void* __p) { return __p; }

struct X { union { int i; char s[4]; } u; };

static float foo (X y)
{
  return reinterpret_cast <float &>(y.u.s);
}

int main ()
{
  X x;
  new (&x.u.s) float (1.0);
  if (foo (x) != 1.0)
    __builtin_abort ();
}

generates at -O2 after inlining:

int main() ()
{
  void * D.2385;
  float D.2383;
  struct X y;
  struct X x;
  float _7;
  bool retval.0_8;

  <bb 2> [100.00%]:
  MEM[(float *)&x] = 1.0e+0;
  y = x;
  _7 = MEM[(float &)&y];
...

Reply via email to