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

Paul Thomas <pault at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2013-11-23
           Assignee|unassigned at gcc dot gnu.org      |pault at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #3 from Paul Thomas <pault at gcc dot gnu.org> ---
Created attachment 31280
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=31280&action=edit
Preliminary patch

This patch is preliminary since a temporary is produced, for each assignment,
copied to the newly reallocated lhs and then deallocated. Clearly it would be
more efficient to deallocate the lhs and then point the lhs to the temporary.
My first attempt to do this segfaulted because the temporary was still deleted,
in spite of my attempt to suppress it! I will persevere.

The test case will be along the following lines:
! { dg-do run }
!
! PR fortran/57354
!
! Contributed by Vladimir Fuka  <vladimir.f...@gmail.com>
!
  type t
    integer,allocatable :: i
  end type

  type(t) :: e
  type(t), allocatable :: a(:)
  integer :: chksum = 0

  do i=1,3   ! Was 100 in original
    e%i = i
    chksum = chksum + i
    if (.not.allocated(a)) then
      a = [e]
    else
      call foo
    end if
  end do

  if (sum ([(a(i)%i, i=1,size(a))]) .ne. chksum) call abort
contains
  subroutine foo
    a = [a, e]
  end subroutine
end

Note that 'foo' is for diagnostic purposes - the code is separated nicely.

Cheers

Paul

Reply via email to