| ! { 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 |