! { 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)) call abort() if (a /= 5) call abort() call bar(a) if (a /= 7) call abort() deallocate(a) if(allocated(a)) call abort() call check3(a) if(.not. allocated(a)) call abort() if(a /= 6874) call abort() call check4(a) if(.not. allocated(a)) call abort() if(a /= -478) call abort() allocate(b) b = 7482 call checkOptional(.false.,.true., 7482) if (b /= 7482) call abort() call checkOptional(.true., .true., 7482, b) if (b /= 46) call abort() contains subroutine foo(a) integer, allocatable, intent(out) :: a if(allocated(a)) call abort() allocate(a) a = 5 end subroutine foo subroutine bar(a) integer, allocatable, intent(inout) :: a if(.not. allocated(a)) call abort() if (a /= 5) call abort() a = 7 end subroutine bar subroutine check3(a) integer, allocatable, intent(inout) :: a if(allocated(a)) call abort() allocate(a) a = 6874 end subroutine check3 subroutine check4(a) integer, allocatable, intent(inout) :: a if(.not.allocated(a)) call abort() if (a /= 6874) call abort deallocate(a) if(allocated(a)) call abort() allocate(a) if(.not.allocated(a)) call abort() 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) call abort() if (present(x)) then if (allocated(x) .neqv. alloc) call abort() end if if (present(x)) then if (allocated(x)) then if (x /= val) call abort() end if end if call checkOptional2(x) if (present(x)) then if (.not. allocated(x)) call abort() if (x /= -6784) call abort() 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)) call abort() allocate(x) x = -6784 end if end subroutine checkOptional2 end program test