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

janus at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |janus at gcc dot gnu.org
            Summary|Double free with            |[F03] Double free with
                   |allocatable components      |allocatable components

--- Comment #2 from janus at gcc dot gnu.org ---
(In reply to Tobias Burnus from comment #1) 
> For GCC 4.9, one needs to wrap the code in the main program in BLOCK/END
> BLOCK as otherwise the end-of-scope deallocation does not trigger, which
> causes the failure.

Updated test case:


program main

  implicit none

  type :: type1
    real, allocatable :: anum(:)
  end type

  type :: type2
    type(type1) :: temp
  end type


  block
    type(type1) :: t1
    type(type2) :: t2

    t1 = type1([0.,1.])
    t2 = type2(t1)
  end block
end



Note: The double free goes away when changing the line

t2 = type2(t1)

to

t2%temp = t1

That means the actual problem is not the auto-dealloc itself (which is done
properly), but the construction of t2: With the second variant, a deep copy is
done (allocating a separate chunk of memory for t2%temp), while in the first
one t2%temp only gets a reference to the memory allocated for t1 (which is of
course wrong). Since both t1 and t2 are auto-deallocated, we try to free that
memory twice.

Reply via email to