! { dg-do run } ! implicit none integer, allocatable :: A[:], B[:,:] integer :: n1, n2, n3 if (allocated (a)) call abort () if (allocated (b)) call abort () allocate(a[*]) a = 5 + this_image () if (a[this_image ()] /= 5 + this_image ()) call abort a[this_image ()] = 8 - 2*this_image () if (a[this_image ()] /= 8 - 2*this_image ()) call abort if (lcobound(a, dim=1) /= 1 .or. ucobound(a,dim=1) /= num_images()) & call abort () deallocate(a) allocate(a[4:*]) a[this_image ()] = 8 - 2*this_image () if (lcobound(a, dim=1) /= 4 .or. ucobound(a,dim=1) /= 3 + num_images()) & call abort () n1 = -1 n2 = 5 n3 = 3 allocate (B[n1:n2, n3:*]) if (any (lcobound(b) /= [-1, 3]) .or. lcobound(B, dim=2) /= n3) & call abort() call sub(A, B) if (allocated (a)) call abort () if (.not.allocated (b)) call abort () call two(.true.) call two(.false.) ! automatically deallocate "B" contains subroutine sub(x, y) integer, allocatable :: x[:], y[:,:] if (any (lcobound(y) /= [-1, 3]) .or. lcobound(y, dim=2) /= n3) & call abort() if (lcobound(x, dim=1) /= 4 .or. ucobound(x,dim=1) /= 3 + num_images()) & call abort () if (x[this_image ()] /= 8 - 2*this_image ()) call abort deallocate(x) end subroutine sub subroutine two(init) logical, intent(in) :: init integer, allocatable, SAVE :: a[:] if (init) then if (allocated(a)) call abort() allocate(a[*]) a = 45 else if (.not. allocated(a)) call abort() if (a /= 45) call abort() deallocate(a) end if end subroutine two end