http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59678

janus at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code
             Status|WAITING                     |NEW
            Summary|Segmentation fault on       |[F03] Segfault on
                   |equalizing variables of a   |equalizing variables of a
                   |complex derived data type   |complex derived type

--- Comment #11 from janus at gcc dot gnu.org ---
Confirmed. Slightly reduced test case (fails at least with 4.6 up to trunk):

program hello
   implicit none

   type t3
      integer b
      integer, allocatable :: vec(:)
   end type

   type t2
      type(t3), allocatable :: obj
   end type

   type t1
      type(t2) :: parts
      integer :: a=1
   end type

   type(t1):: x, y

   y=x
end


The dump shows that the assignment is translated into:

  {
    void * restrict D.2321;
    integer(kind=8) D.2320;
    integer(kind=8) D.2319;
    integer(kind=8) D.2318;
    struct t1 D.2317;

    D.2317 = y;
    y = x;
    y.parts = x.parts;
    y.parts.obj = x.parts.obj;
    if ((void *) x.parts.obj.vec.data != 0B)
      {
        D.2318 = (x.parts.obj.vec.dim[0].ubound -
x.parts.obj.vec.dim[0].lbound) + 1;
        D.2319 = NON_LVALUE_EXPR <D.2318>;
        D.2320 = D.2319 * 4;
        D.2321 = (void * restrict) __builtin_malloc (MAX_EXPR <(unsigned long)
D.2320, 1>);
        y.parts.obj.vec.data = D.2321;
        __builtin_memcpy ((integer(kind=4)[0:] * restrict)
y.parts.obj.vec.data, (integer(kind=4)[0:] * restrict) x.parts.obj.vec.data,
(unsigned long) (D.2319 * 4));
      }
    else
      {
        y.parts.obj.vec.data = 0B;
      }
    if (D.2317.parts.obj != 0B)
      {
        if (D.2317.parts.obj->vec.data != 0B)
          {
            __builtin_free ((void *) D.2317.parts.obj->vec.data);
          }
        D.2317.parts.obj->vec.data = 0B;
        __builtin_free ((void *) D.2317.parts.obj);
      }
    D.2317.parts.obj = 0B;
  }

Reply via email to