The following segfaults on the second call to mah because the allocatable components are automatically deallocated. I have yet to check the F2003 standard but this logically makes no sense. It comes about because t.data is NULLED on entry to mah 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 Posted to the list by F-X COudert http://gcc.gnu.org/ml/fortran/2008-01/msg00044.html
Patch posted by Paul: http://gcc.gnu.org/ml/fortran/2008-01/msg00048.html
Patch by Paul: http://gcc.gnu.org/ml/gcc-patches/2008-01/msg00269.html
Subject: Bug 34681 Author: pault Date: Tue Jan 8 15:12:34 2008 New Revision: 131395 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=131395 Log: 2008-01-08 Paul Thomas <pault@gcc.gnu.org> PR fortran/34681 * trans_array.c (gfc_trans_deferred_array): Do not null the data pointer on entering scope, nor deallocate it on leaving scope, if the symbol has the 'save' attribute. PR fortran/34704 * trans_decl.c (gfc_finish_var_decl): Derived types with allocatable components and an initializer must be TREE_STATIC. 2008-01-08 Paul Thomas <pault@gcc.gnu.org> PR fortran/34681 PR fortran/34704 * gfortran.dg/alloc_comp_default_init_1.f90: New test. Added: trunk/gcc/testsuite/gfortran.dg/alloc_comp_default_init_1.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/trans-array.c trunk/gcc/fortran/trans-decl.c trunk/gcc/testsuite/ChangeLog
Fixed on trunk Paul