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

--- Comment #27 from rguenther at suse dot de <rguenther at suse dot de> ---
On Tue, 28 Feb 2017, jakub at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79671
> 
> --- Comment #26 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> What about PODs or say int?  Let's say I have a class with union in it and in
> that union say float and char array, then use placement new an int with some
> value into the char array in the union.  What will then happen if I default
> copy the class (default assignment operator or copy constructor)?  The
> following doesn't fail, but I think true_dependence still returns 0 for
> (mem/c:SI (plus:DI (reg/f:DI 7 sp)
>         (const_int 4 [0x4])) [4 MEM[(int *)&b + 4B]+0 S4 A32])
> and
> (mem:DI (reg/v/f:DI 0 ax [orig:87 p ] [87]) [1 MEM[(const struct B &)p_4]+0 S8
> A32])
> where the former is from the placement new store of int and the load is from
> the structure assignment.
> 
> inline void* operator new(__SIZE_TYPE__, void *p) { return p; }
> struct B
> {
>   float x;
>   union U
>   {
>     float a;
>     char b[sizeof (int)];
>   } u;
>   float y;
> };
> 
> __attribute__((noinline, noclone)) void
> bar (B &x, B &y)
> {
>   if (x.x != 0 || x.y != 3 || y.x != 0 || y.y != 3)
>     __builtin_abort ();
>   int f;
>   __builtin_memcpy (&f, x.u.b, sizeof (int));
>   if (f != 81)
>     __builtin_abort ();
>   __builtin_memcpy (&f, y.u.b, sizeof (int));
>   if (f != 81)
>     __builtin_abort ();
> }
> 
> __attribute__((noinline, noclone)) 
> B *
> baz (B &x)
> {
>   return &x;
> }
> 
> __attribute__((noinline, noclone)) void
> foo (int x)
> {
>   B b { 0.0f, {}, 3.0f }, c;
>   B *p = baz (b);
>   new (b.u.b) int (x);
>   c = *p;

I don't think *p is of any type allowed to access the object of type int.

Reply via email to