blob: 2faf0f8078f02904b0c1fa2844db5acb629e5cb4 [file] [log] [blame]
! Test 'allocatable' with OpenACC data clauses, subroutine in module, pass by
! reference.
! See also '../libgomp.fortran/target-allocatable-1-2.f90'.
! { dg-do run }
! { dg-additional-options "-cpp" }
module m
contains
subroutine r (a, b, c, d, e)
implicit none
integer, allocatable :: a, b, c, d, e
!$acc parallel copyin(a) copy(b, c, d) copyout(e)
if (.not. allocated (a)) stop 1
if (a .ne. 11) stop 2
a = 33
if (.not. allocated (b)) stop 3
if (b .ne. 25) stop 4
if (.not. allocated (c)) stop 5
if (c .ne. 52) stop 6
c = 10
if (allocated (d)) stop 7
d = 42 ! Implicit allocation, but on device only.
if (.not. allocated (d)) stop 8
deallocate (d) ! OpenMP requires must be "unallocated upon exit from the region".
if (allocated (e)) stop 9
e = 24 ! Implicit allocation, but on device only.
if (.not. allocated (e)) stop 10
deallocate (e) ! OpenMP requires must be "unallocated upon exit from the region".
!$acc end parallel
end subroutine r
end module m
program main
use m
implicit none
integer, allocatable :: a, b, c, d, e
allocate (a)
a = 11
b = 25 ! Implicit allocation.
c = 52 ! Implicit allocation.
!No 'allocate (d)' here.
!No 'allocate (e)' here.
call r(a, b, c, d, e)
if (.not. allocated (a)) stop 20
#if ACC_MEM_SHARED
if (a .ne. 33) stop 21
#else
if (a .ne. 11) stop 22
#endif
deallocate (a)
if (.not. allocated (b)) stop 23
if (b .ne. 25) stop 24
deallocate (b)
if (.not. allocated (c)) stop 25
if (c .ne. 10) stop 26
deallocate (c)
if (allocated (d)) stop 27
if (allocated (e)) stop 28
end program main