mirror of
https://github.com/autc04/Retro68.git
synced 2024-09-28 18:56:06 +00:00
101 lines
2.3 KiB
Fortran
101 lines
2.3 KiB
Fortran
! { dg-do run }
|
|
! { dg-options "-fcheck=pointer" }
|
|
! { dg-shouldfail "Unassociated/unallocated actual argument" }
|
|
!
|
|
! { dg-output ".*At line 46 .*Pointer actual argument 'getptr' is not associated" }
|
|
!
|
|
! PR fortran/40580
|
|
!
|
|
! Run-time check of passing deallocated/nonassociated actuals
|
|
! to nonallocatable/nonpointer dummies.
|
|
!
|
|
! Check for function actuals
|
|
!
|
|
|
|
subroutine test1(a)
|
|
integer :: a
|
|
print *, a
|
|
end subroutine test1
|
|
|
|
subroutine test2(a)
|
|
integer :: a(2)
|
|
print *, a
|
|
end subroutine test2
|
|
|
|
subroutine ppTest(f)
|
|
implicit none
|
|
external f
|
|
call f()
|
|
end subroutine ppTest
|
|
|
|
Program RunTimeCheck
|
|
implicit none
|
|
external :: test1, test2, ppTest
|
|
procedure(), pointer :: pptr
|
|
|
|
! OK
|
|
call test1(getPtr(.true.))
|
|
call test2(getPtrArray(.true.))
|
|
call test2(getAlloc(.true.))
|
|
|
|
! OK but fails due to PR 40593
|
|
! call ppTest(getProcPtr(.true.))
|
|
! call ppTest2(getProcPtr(.true.))
|
|
|
|
! Invalid:
|
|
call test1(getPtr(.false.))
|
|
! call test2(getAlloc(.false.)) - fails because the check is inserted after
|
|
! _gfortran_internal_pack, which fails with out of memory
|
|
! call ppTest(getProcPtr(.false.)) - fails due to PR 40593
|
|
! call ppTest2(getProcPtr(.false.)) - fails due to PR 40593
|
|
|
|
contains
|
|
function getPtr(alloc)
|
|
integer, pointer :: getPtr
|
|
logical, intent(in) :: alloc
|
|
if (alloc) then
|
|
allocate (getPtr)
|
|
getPtr = 1
|
|
else
|
|
nullify (getPtr)
|
|
end if
|
|
end function getPtr
|
|
function getPtrArray(alloc)
|
|
integer, pointer :: getPtrArray(:)
|
|
logical, intent(in) :: alloc
|
|
if (alloc) then
|
|
allocate (getPtrArray(2))
|
|
getPtrArray = 1
|
|
else
|
|
nullify (getPtrArray)
|
|
end if
|
|
end function getPtrArray
|
|
function getAlloc(alloc)
|
|
integer, allocatable :: getAlloc(:)
|
|
logical, intent(in) :: alloc
|
|
if (alloc) then
|
|
allocate (getAlloc(2))
|
|
getAlloc = 2
|
|
else if (allocated(getAlloc)) then
|
|
deallocate(getAlloc)
|
|
end if
|
|
end function getAlloc
|
|
subroutine sub()
|
|
print *, 'Hello World'
|
|
end subroutine sub
|
|
function getProcPtr(alloc)
|
|
procedure(sub), pointer :: getProcPtr
|
|
logical, intent(in) :: alloc
|
|
if (alloc) then
|
|
getProcPtr => sub
|
|
else
|
|
nullify (getProcPtr)
|
|
end if
|
|
end function getProcPtr
|
|
subroutine ppTest2(f)
|
|
implicit none
|
|
procedure(sub) :: f
|
|
call f()
|
|
end subroutine ppTest2
|
|
end Program RunTimeCheck
|