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

anlauf at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code

--- Comment #8 from anlauf at gcc dot gnu.org ---
We are now generating a shallow copy instead of a deep copy for the line:

    x3 = merge(x1, x2, .false.)

This gives:

      {
        struct t D.4345;
        struct t D.4346;
        struct t D.4347;

        D.4345 = x1;
        D.4346 = x2;
        D.4347 = x3;
        x3 = D.4346;
        if ((real(kind=4)[0:] * restrict) D.4347.v.data != 0B)
          {
            __builtin_free ((void *) D.4347.v.data);
            (real(kind=4)[0:] * restrict) D.4347.v.data = 0B;
          }
      }

while e.g. the assignment x3 = x2 produces:

...
        x3 = x2;
        if ((void *) x2.v.data != 0B)
          {
            D.4346 = (x2.v.dim[0].ubound - x2.v.dim[0].lbound) + 1;
            D.4347 = NON_LVALUE_EXPR <D.4346>;
            D.4348 = (void * restrict) __builtin_malloc (MAX_EXPR <(unsigned
long) (D.4347 * 4), 1>);
            x3.v.data = D.4348;
            __builtin_memcpy ((real(kind=4)[0:] * restrict) x3.v.data,
(real(kind=4)[0:] * restrict) x2.v.data, (unsigned long) (D.4347 * 4));
          }
        else
          {
            x3.v.data = 0B;
          }
...

Reply via email to