blob: e8bb11f913039a772e619c3b48c359905d1bed14 [file] [log] [blame]
! { dg-do run }
!
! PR fortran/47455
!
! Based on an example by Thomas Henlich
!
module class_t
type :: tx
integer, dimension(:), allocatable :: i
end type tx
type :: t
type(tx), pointer :: x
type(tx) :: y
contains
procedure :: calc
procedure :: find_x
procedure :: find_y
end type t
contains
subroutine calc(this)
class(t), target :: this
type(tx), target :: that
that%i = [1,2]
this%x => this%find_x(that, .true.)
if (associated (this%x)) STOP 1
this%x => this%find_x(that, .false.)
if(any (this%x%i /= [5, 7])) STOP 2
if (.not.associated (this%x,that)) STOP 3
allocate(this%x)
if (associated (this%x,that)) STOP 4
if (allocated(this%x%i)) STOP 5
this%x = this%find_x(that, .false.)
that%i = [3,4]
if(any (this%x%i /= [5, 7])) STOP 6 ! FAILS
if (allocated (this%y%i)) STOP 7
this%y = this%find_y() ! FAILS
if (.not.allocated (this%y%i)) STOP 8
if(any (this%y%i /= [6, 8])) STOP 9
end subroutine calc
function find_x(this, that, l_null)
class(t), intent(in) :: this
type(tx), target :: that
type(tx), pointer :: find_x
logical :: l_null
if (l_null) then
find_x => null()
else
find_x => that
that%i = [5, 7]
end if
end function find_x
function find_y(this) result(res)
class(t), intent(in) :: this
type(tx), allocatable :: res
allocate(res)
res%i = [6, 8]
end function find_y
end module class_t
use class_t
type(t) :: x
call x%calc()
end