https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88551

            Bug ID: 88551
           Summary: passing a portion of an array of a derived type that
                    contains an allocatable component
           Product: gcc
           Version: 8.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hassani at unice dot fr
  Target Milestone: ---

gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr
--with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.11.45.5)
Target: x86_64-apple-darwin18.2.0

gfortran --version
GNU Fortran (Homebrew GCC 8.2.0) 8.2.0
-----------------------------------------------------------------------------------------
Dear all,
It seems that passing a portion of an array of a DT which has an allocatable
component to a subroutine can lead to memory leaks.

Here is a small program that reproduces this situation:

program test_leaks
  implicit none

  type :: vint_t
     integer, allocatable :: col(:)
  end type vint_t

  type(vint_t) :: row(4)
  integer      :: i, Ind(2)=[3,2]

  do i = 1, 4
     allocate(row(i)%col(i))
  end do

  row(1)%col(1) = 11  
  row(2)%col(1) = 21 ; row(2)%col(2) = 22
  row(3)%col(1) = 31 ; row(3)%col(2) = 32 ; row(3)%col(3) = 33
  row(4)%col(1) = 41 ; row(4)%col(2) = 42 ; row(4)%col(3) = 43 ; row(4)%col(4)
= 44

  do i = 1, 1000000
     call do_nothing ( row(Ind) )

     if (mod(i,10000) == 0) then
        print*,i ; read*
     end if
  end do

contains

  subroutine do_nothing ( a )
    type(vint_t), intent(in) :: a(:)
  end subroutine do_nothing

end program test_leaks

- The memory usage grows linearly with iterations when compiled on mac OS
10.14.2 with gfortran 8.2.0
- But the program works well (in the sense that a print in "do_nothing" shows
the expected values)
- The problem also occurs with an allocatable character component.
- If "call do_nothing ( row(Ind) )" is replaced by "call do_nothing ( row(2:3)
)" the issue goes away. 
- It also goes away if the allocatable component ("col") is replaced by a fixed
sized one (e.g. col(4))
- The problem seems to be dependent of the OS. For example, it doesn't occur on
linux (even with an old version of gfortran: 4.8.5). (For some additional
details about this point, please see the answers to my question on
stackoverflow
(https://stackoverflow.com/questions/53839760/passing-a-portion-of-an-array-of-a-derived-type-that-contains-an-allocatable-com).
 

Best Regards.

Reply via email to