http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56691
Bug #: 56691 Summary: Allocatable array of extended type, wrong indexes after passing to a subroutine Classification: Unclassified Product: gcc Version: fortran-dev Status: UNCONFIRMED Severity: normal Priority: P3 Component: fortran AssignedTo: unassig...@gcc.gnu.org ReportedBy: mreste...@gmail.com The attached code should display Show: f1 1.0000000 Show: f1 2.0000000 Show: f1 3.0000000 Show: f1 4.0000000 three times - however the last call shows Show: f1 2.0000000 Show: f1 3.0000000 Show: f1 4.0000000 Show: f1 0.0000000 i.e. all the array elements seem to be off by 1 (zero based indexing?). Notice that: 1) the problem only shows up when the call to LCB uses array slices, not when using the whole array 2) the problem disappears if the array WORK has explicit size. I am using gfortran --version GNU Fortran (GCC) 4.9.0 20130322 (experimental) Regards, Marco Restelli module m1 implicit none public :: c_stv private type, abstract :: c_stv contains procedure, pass(z) :: lcb procedure, pass(x) :: show end type c_stv contains subroutine lcb(z,y) class(c_stv), intent(in) :: y(:) class(c_stv), intent(inout) :: z integer :: k write(*,*) 'Inside LCB: size is ',size(y) do k=1,size(y) call y(k)%show() enddo end subroutine lcb subroutine show(x) class(c_stv), intent(in) :: x end subroutine show end module m1 module m2 use m1, only: c_stv implicit none public :: t_stv private type, extends(c_stv) :: t_stv real :: f1 contains procedure, pass(x) :: show end type t_stv contains subroutine show(x) class(t_stv), intent(in) :: x write(*,*) 'Show: f1 ', x%f1 end subroutine show end module m2 program test use m1, only: c_stv use m2, only: t_stv implicit none integer :: k type(t_stv) :: x !type(t_stv) :: work(4) ! works fine type(t_stv), allocatable :: work(:) allocate(work(4)) do k=1,4 work(k)%f1 = real(k) enddo write(*,*) 'Values in work are:' do k=1,4 call work(k)%show() enddo write(*,*) 'Call with whole array: works fine' call x%lcb(work) write(*,*) 'Call with array slice: off by 1' call x%lcb(work(:4)) end program test