| ! { dg-do run } |
| ! |
| ! PR fortran/41872 |
| ! |
| ! |
| program test |
| implicit none |
| integer, allocatable :: a |
| integer, allocatable :: b |
| allocate(a) |
| call foo(a) |
| if(.not. allocated(a)) STOP 1 |
| if (a /= 5) STOP 2 |
| |
| call bar(a) |
| if (a /= 7) STOP 3 |
| |
| deallocate(a) |
| if(allocated(a)) STOP 4 |
| call check3(a) |
| if(.not. allocated(a)) STOP 5 |
| if(a /= 6874) STOP 6 |
| call check4(a) |
| if(.not. allocated(a)) STOP 7 |
| if(a /= -478) STOP 8 |
| |
| allocate(b) |
| b = 7482 |
| call checkOptional(.false.,.true., 7482) |
| if (b /= 7482) STOP 9 |
| call checkOptional(.true., .true., 7482, b) |
| if (b /= 46) STOP 10 |
| contains |
| subroutine foo(a) |
| integer, allocatable, intent(out) :: a |
| if(allocated(a)) STOP 11 |
| allocate(a) |
| a = 5 |
| end subroutine foo |
| |
| subroutine bar(a) |
| integer, allocatable, intent(inout) :: a |
| if(.not. allocated(a)) STOP 12 |
| if (a /= 5) STOP 13 |
| a = 7 |
| end subroutine bar |
| |
| subroutine check3(a) |
| integer, allocatable, intent(inout) :: a |
| if(allocated(a)) STOP 14 |
| allocate(a) |
| a = 6874 |
| end subroutine check3 |
| |
| subroutine check4(a) |
| integer, allocatable, intent(inout) :: a |
| if(.not.allocated(a)) STOP 15 |
| if (a /= 6874) STOP 1 |
| deallocate(a) |
| if(allocated(a)) STOP 16 |
| allocate(a) |
| if(.not.allocated(a)) STOP 17 |
| a = -478 |
| end subroutine check4 |
| |
| subroutine checkOptional(prsnt, alloc, val, x) |
| logical, intent(in) :: prsnt, alloc |
| integer, allocatable, optional :: x |
| integer, intent(in) :: val |
| if (present(x) .neqv. prsnt) STOP 18 |
| if (present(x)) then |
| if (allocated(x) .neqv. alloc) STOP 19 |
| end if |
| if (present(x)) then |
| if (allocated(x)) then |
| if (x /= val) STOP 20 |
| end if |
| end if |
| call checkOptional2(x) |
| if (present(x)) then |
| if (.not. allocated(x)) STOP 21 |
| if (x /= -6784) STOP 22 |
| x = 46 |
| end if |
| call checkOptional2() |
| end subroutine checkOptional |
| subroutine checkOptional2(x) |
| integer, allocatable, optional, intent(out) :: x |
| if (present(x)) then |
| if (allocated(x)) STOP 23 |
| allocate(x) |
| x = -6784 |
| end if |
| end subroutine checkOptional2 |
| end program test |