This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Again on gfortran for Mac OS-X


Hi Paolo,

Ante-scriptum: Unless advised to do so, please do not send me private mails about gfortran: posting to the mailing-list allows other to help, especially if I don't have an answer (this is the case here) or am not available, plus it helps keeping track of the problem for future reference (and is available on the web archives).


Dear FX (Francois?)

Both work fine.


let me disturb you again with gfortran. I managed to extract a small
piece of code that demonstrates (on my machine, with gfortran version
20071231) the problem I was mentioning in my previous message:

[...] derived types as local variables: they lose their value from one
call to another, even if they have the "save" attribute

Actually, "allocatable arrays of derived types":

I can confirm that your program below also crashed on x86_64-linux with gfortran-4.3.0-20071206. I have no access to any other compiler at the moment, but your code seem (at first glance) legal; someone else here will probably have a more definite opinion on that matter. From the output of -fdump-tree-original, it looks like the compiler deallocates your allocated derived type on exit of the mah subroutine; if this code is indeed legal, then fixing the bug might simply be a matter of not performing this automatic deallocation for saved variables.


Thanks for the report,
FX



program boh
  !
  call mah (0)
  call mah (1)
  call mah (2)
  !
end program boh
!
subroutine mah (i)
  !
  integer, intent(in) :: i
  !
  type mix_type
     real(8), allocatable :: a(:)
     complex(8), allocatable :: b(:)
  end type mix_type
  type(mix_type), allocatable, save :: t(:)
  integer :: j, n=1024
  !
  if (i==0) then
     allocate (t(1))
     allocate (t(1)%a(n))
     allocate (t(1)%b(n))
     do j=1,n
        t(1)%a(j) = j
        t(1)%b(j) = n-j
     end do
  end if
  c = sum( t(1)%a(:) ) + sum( t(1)%b(:) )
  print *, 'c=',c
  if ( i==2) then
     deallocate (t(1)%b)
     deallocate (t(1)%a)
     deallocate (t)
  end if
end subroutine mah

Maybe you will find this piece of code a perversion, but it looks
correct to me (I am not a big f90 expert). At the second call of
subroutine mah, it coredumps. It works if the array t(1) is
replaced by a single variable t. It works with g95. I haven't
access right now to any other machine with recent versions
of gfortran so I cannot say whether it is OS-X specific or not.
Best regards

Paolo
---
Paolo Giannozzi, Dept of Physics, University of Udine
via delle Scienze 208, 33100 Udine, Italy
Phone +39-0432-558216, fax +39-0432-558222


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]