! { dg-do run } ! ! Contributed by Andre Vehreschild ! Check more elaborate class array addressing. module m1 type InnerBaseT integer, allocatable :: a(:) end type InnerBaseT type, extends(InnerBaseT) :: InnerT integer :: i end type InnerT type BaseT class(InnerT), allocatable :: arr(:,:) contains procedure P end type BaseT contains subroutine indir(this, mat) class(BaseT) :: this class(InnerT), intent(inout) :: mat(:,:) call this%P(mat) end subroutine indir subroutine P(this, mat) class(BaseT) :: this class(InnerT), intent(inout) :: mat(:,:) integer :: i,j mat%i = 42 do i= 1, ubound(mat, 1) do j= 1, ubound(mat, 2) if (.not. allocated(mat(i,j)%a)) then allocate(mat(i,j)%a(10), source = 72) end if end do end do mat(1,1)%i = 9 mat(1,1)%a(5) = 1 end subroutine end module m1 program test use m1 class(BaseT), allocatable, target :: o class(InnerT), pointer :: i_p(:,:) class(InnerBaseT), allocatable :: i_a(:,:) integer i,j,l allocate(o) allocate(o%arr(2,2)) allocate(InnerT::i_a(2,2)) o%arr%i = 1 i_p => o%arr call o%P(i_p) if (any(o%arr%i /= reshape([9,42,42,42],[2,2]))) STOP 1 do l= 1, 10 do i= 1, 2 do j= 1,2 if ((i == 1 .and. j == 1 .and. l == 5 .and. & o%arr(i,j)%a(5) /= 1) & .or. (.not. (i == 1 .and. j == 1 .and. l == 5) & .and. o%arr(i,j)%a(l) /= 72)) STOP 2 end do end do end do select type (i_a) type is (InnerT) call o%P(i_a) do l= 1, 10 do i= 1, 2 do j= 1,2 if ((i == 1 .and. j == 1 .and. l == 5 .and. & i_a(i,j)%a(5) /= 1) & .or. (.not. (i == 1 .and. j == 1 .and. l == 5) & .and. i_a(i,j)%a(l) /= 72)) STOP 3 end do end do end do end select i_p%i = 4 call indir(o, i_p) if (any(o%arr%i /= reshape([9,42,42,42],[2,2]))) STOP 4 end program test ! vim:ts=2:sts=2:cindent:sw=2:tw=80: