http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58310
Bug ID: 58310 Summary: Allocatable component arrays: Wrong code after calling a subroutine Product: gcc Version: 4.9.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: fortran Assignee: unassigned at gcc dot gnu.org Reporter: burnus at gcc dot gnu.org CC: pault at gcc dot gnu.org As reported by James Spencer at https://groups.google.com/forum/#!topic/comp.lang.fortran/VuFvOsLs6hE The call to the subroutine causes copy-in/copy-out - and that somehow causes that that access to invalid memory. (Side remark: I think the copy-in/copy-out is required as we do not have byte strides, just element-based strides. See http://gcc.gnu.org/wiki/ArrayDescriptorUpdate) Output of the code below: 1 1 2 2 in s1: 1 1 in s1: 2 2 0 0 21884992 0 Program received signal SIGABRT: Process abort signal. When run under valgrind, the output is correct - but one gets two errors: Once directly after the subroutine call: ==21383== Invalid read of size 4 ==21383== at 0x4F15AB0: extract_int (write.c:440) ==21383== by 0x4F17020: write_integer (write.c:1250) And at the very end: ==21383== Invalid free() / delete / delete[] / realloc() Here is the code which causes the problems with GCC 4.3 to GCC 4.9: program p implicit none type x_t integer, allocatable :: v(:) end type x_t type y_t type(x_t) :: x end type y_t type(y_t), allocatable, target :: y(:) integer :: i integer, parameter :: N=2 allocate(y(N)) do i = 1,N allocate(y(i)%x%v(N)) y(i)%x%v = i end do do i = 1,N write (6,*) y(i)%x%v end do call s1(y%x) do i = 1,N write (6,*) y(i)%x%v end do deallocate(y) contains subroutine s1(x) type(x_t), intent(inout) :: x(:) integer :: i do i = 1, size(x) print *, 'in s1: ', x(i)%v end do end subroutine s1 end program p