Assigning to an Array of Derived Types

Hello, I am encountering a segmentation fault when assigning an array of derived types to an array of derived types. The error only occurs with optimizations on and only on the newest version of pgfortran (15.10). I’ve reduced it to the following example code:

module mymod
   implicit none

   type interval
      real :: upper
   end type interval

   type :: tree_node
      type(interval),  pointer :: box(:) => null()
   end type tree_node

contains
   function init(dimen) result (res)
      type (tree_node), pointer :: res
      integer, intent(in) :: dimen
      integer :: i

      allocate (res)
      allocate(res%box(dimen))

      do i=1,dimen
         res%box(i)%upper = real(i)**2
      enddo
   end function init

end module mymod

program main
   use mymod
   implicit none
   integer :: dimen
   type (tree_node), pointer :: a, b

   dimen = 3      ! Size of box(:)

   a => init(dimen)
   b => init(dimen)

   write(*,'(a,3f5.1)') 'b is: ', b%box%upper

   ! -- This is the line that fails
   a%box%upper = b%box%upper

   write(*,'(a,3f5.1)') 'a is: ', a%box%upper
   write(*,*) 'complete'
end program main

With optimizations on, the code reliably seg faults:

$ pgfortran --version

pgfortran 15.10-0 64-bit target on x86-64 Linux -tp istanbul
The Portland Group - PGI Compilers and Tools
Copyright (c) 2015, NVIDIA CORPORATION.  All rights reserved.
$ pgfortran test_derarray.f90 && ./a.out
b is:   1.0  4.0  9.0
a is:   1.0  4.0  9.0
 complete
$ pgfortran -O3 test_derarray.f90 && ./a.out
b is:   1.0  4.0  9.0
Segmentation fault

Older versions of PGI (I tested 12.9, 14.3 and 15.5) do not have this problem, and neither do other common compilers I tested (ifort 16.0 and gfortran 4.8 and 5.2).

I think the code is standard-conforming because a%box%upper and b%box%upper are conformable. Even if it’s not, though, this segmentation fault is frustrating because the error is unique to the latest PGI, and only with optimizations on.

I originally stumbled on this issue when using Matthew B. Kennel’s kdtree2 implementation, and this sample code is based on his work.

Thanks Ross. This looks like a compiler issue so I added a problem report (TPR#22185) and sent it on to engineering for further investigation.

  • Mat

Sorry for the late notice. This was fixed in PGI 16.4, in April 2016.