! { dg-do run } ! ! Make sure that the fix for pr34640 works with class pointers. ! type :: mytype real :: r integer :: i end type type :: thytype real :: r integer :: i type(mytype) :: der end type type(thytype), dimension(0:2), target :: tgt class(*), dimension(:), pointer :: cptr class(mytype), dimension(:), pointer :: cptr1 integer :: i integer(8) :: s1, s2 tgt = [(thytype(int(i), i, mytype(int(2*i), 2*i)), i= 1,3)] cptr => tgt%i if (lbound (cptr, 1) .ne. 1) STOP 1! Not a whole array target! s1 = loc(cptr) call foo (cptr, s2) ! Check bounds not changed... if (s1 .ne. s2) STOP 2! ...and that the descriptor is passed. select type (cptr) type is (integer) if (any (cptr .ne. [1,2,3])) STOP 3! Check the the scalarizer works. if (cptr(2) .ne. 2) STOP 4! Check ordinary array indexing. end select cptr(1:3) => tgt%der%r ! Something a tad more complicated! select type (cptr) type is (real) if (any (int(cptr) .ne. [2,4,6])) STOP 5 if (any (int(cptr([2,3,1])) .ne. [4,6,2])) STOP 6 if (int(cptr(3)) .ne. 6) STOP 7 end select cptr1(1:3) => tgt%der s1 = loc(cptr1) call bar(cptr1, s2) if (s1 .ne. s2) STOP 8! Check that the descriptor is passed. select type (cptr1) type is (mytype) if (any (cptr1%i .ne. [2,4,6])) STOP 9 if (cptr1(2)%i .ne. 4) STOP 10 end select contains subroutine foo (arg, addr) class(*), dimension(:), pointer :: arg integer(8) :: addr addr = loc(arg) select type (arg) type is (integer) if (any (arg .ne. [1,2,3])) STOP 11! Check the the scalarizer works. if (arg(2) .ne. 2) STOP 12! Check ordinary array indexing. end select end subroutine subroutine bar (arg, addr) class(mytype), dimension(:), pointer :: arg integer(8) :: addr addr = loc(arg) select type (arg) type is (mytype) if (any (arg%i .ne. [2,4,6])) STOP 13 if (arg(2)%i .ne. 4) STOP 14 end select end subroutine end