view gcc/testsuite/gfortran.dg/pointer_intent_1.f90 @ 144:8f4e72ab4e11

fix segmentation fault caused by nothing next cur_op to end
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 21:23:56 +0900
parents 84e7813d76e9
children
line wrap: on
line source

! { dg-do run }
! { dg-options "-std=f2003 " }
! Pointer intent test
! PR fortran/29624
!
! Valid program
program test
 implicit none
 type myT
   integer          :: x
   integer, pointer :: point
 end type myT
 integer, pointer :: p
 type(myT), pointer :: t
 type(myT) :: t2
 allocate(p,t)
 allocate(t%point)
 t%point = 55
 p = 33
 call a(p,t)
 deallocate(p)
 nullify(p)
 call a(p,t)
 t2%x     = 5
 allocate(t2%point)
 t2%point = 42
 call nonpointer(t2)
 if(t2%point /= 7) STOP 1
contains
  subroutine a(p,t)
    integer, pointer,intent(in)    :: p
    type(myT), pointer, intent(in) :: t
    integer, pointer :: tmp
    if(.not.associated(p)) return
    if(p /= 33) STOP 2
    p = 7
    if (associated(t)) then
      ! allocating is valid as we don't change the status
      ! of the pointer "t", only of it's target
      t%x = -15
      if(.not.associated(t%point)) STOP 3
      if(t%point /= 55) STOP 4
      nullify(t%point)
      allocate(tmp)
      t%point => tmp
      deallocate(t%point)
      t%point => null(t%point)
      tmp => null(tmp)
      allocate(t%point)
      t%point = 27
      if(t%point /= 27) STOP 5
      if(t%x     /= -15) STOP 6
      call foo(t)
      if(t%x     /=  32) STOP 7
      if(t%point /= -98) STOP 8
    end if
    call b(p)
    if(p /= 5) STOP 9
  end subroutine
  subroutine b(v)
    integer, intent(out) :: v
    v = 5
  end subroutine b
  subroutine foo(comp)
    type(myT), intent(inout) :: comp
    if(comp%x     /= -15) STOP 10
    if(comp%point /=  27) STOP 11
    comp%x     = 32
    comp%point = -98
  end subroutine foo
  subroutine nonpointer(t)
     type(myT), intent(in) :: t
     if(t%x     /= 5 ) STOP 12
     if(t%point /= 42) STOP 13
     t%point = 7
  end subroutine nonpointer
end program