view gcc/testsuite/gfortran.dg/associated_target_6.f03 @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 84e7813d76e9
children
line wrap: on
line source

! { dg-do run }
! Tests the fix for PR67091 in which the first call to associated
! gave a bad result because the 'target' argument was not being
! correctly handled.
!
! Contributed by 'FortranFan' on clf.
! https://groups.google.com/forum/#!topic/comp.lang.fortran/dN_tQA1Mu-I
!
module m
   implicit none
   private
   type, public :: t
      private
      integer, pointer :: m_i
   contains
      private
      procedure, pass(this), public :: iptr => getptr
      procedure, pass(this), public :: setptr
   end type t
contains
   subroutine setptr( this, iptr )
      !.. Argument list
      class(t), intent(inout)         :: this
      integer, pointer, intent(inout) :: iptr
      this%m_i => iptr
      return
   end subroutine setptr
   function getptr( this ) result( iptr )
      !.. Argument list
      class(t), intent(in) :: this
      !.. Function result
      integer, pointer :: iptr
      iptr => this%m_i
   end function getptr
end module m

program p
   use m, only : t
   integer, pointer :: i
   integer, pointer :: j
   type(t) :: foo
   !.. create i with some value
   allocate (i, source=42)
   call foo%setptr (i)
   if (.not.associated (i, foo%iptr())) STOP 1 ! Gave bad result.
   if (.not.associated (foo%iptr(), i)) STOP 2 ! Was OK.
   j => foo%iptr()
   if (.not.associated (i, j)) STOP 1! Was OK.
end program p