blob: ed45bf5ba22c93562ffeb3467f8b4b977756c22c [file] [edit]
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenacc
! Test that OpenACC host_data use_device variables (UseDevice attribute)
! are compatible with both host and device dummy arguments in generic
! resolution.
module m
interface overl
module procedure overl_host
end interface
contains
subroutine overl_host(x)
integer :: x(:)
end subroutine
end module m
module m2
interface dforce
module procedure dforce_host
module procedure dforce_device
end interface
contains
subroutine dforce_host(x, y)
integer :: x(:), y(:)
end subroutine
subroutine dforce_device(x, y)
integer, device :: x(:), y(:)
end subroutine
end module m2
subroutine test_use_device_host_only()
use m
integer, allocatable :: fx(:)
allocate(fx(100))
!$acc data copy(fx)
!$acc host_data use_device(fx)
call overl(fx)
!$acc end host_data
!$acc end data
deallocate(fx)
end
subroutine test_use_device_with_device_specific()
use m2
integer, allocatable :: fx(:)
integer, device, allocatable :: fy(:)
allocate(fx(100), fy(100))
!$acc data copy(fx)
!$acc host_data use_device(fx)
call dforce(fx, fy)
!$acc end host_data
!$acc end data
deallocate(fx, fy)
end
module m3
integer, parameter :: dp = selected_real_kind(14,200)
complex(dp), allocatable, target, pinned :: vkb(:,:)
interface dforce2
module procedure dforce2_host
module procedure dforce2_gpu
end interface
contains
subroutine dforce2_host(vkb, c, v)
complex(dp) :: vkb(:,:), c(:,:)
real(dp) :: v(:,:)
end subroutine
subroutine dforce2_gpu(vkb, c, v)
complex(dp), device :: vkb(:,:), c(:,:)
real(dp), device :: v(:,:)
end subroutine
end module m3
subroutine test_use_device_pinned_use_assoc()
use m3
complex(dp), device, allocatable :: c_d(:,:)
real(dp), device, allocatable :: v_d(:,:)
allocate(vkb(64,64), c_d(64,64), v_d(64,64))
!$acc enter data copyin(vkb)
!$acc host_data use_device(vkb)
call dforce2(vkb, c_d, v_d)
!$acc end host_data
!$acc exit data delete(vkb)
deallocate(vkb, c_d, v_d)
end
! When the generic offers only managed/unified specifics (no device or host
! specific), a use_device actual must not match either: managed and unified
! dummies require their actual to live in managed/unified memory, which a
! use_device actual does not. The call should be rejected.
module m4
interface overl_mu
module procedure overl_managed
module procedure overl_unified
end interface
contains
subroutine overl_managed(x)
integer, managed :: x(:)
end subroutine
subroutine overl_unified(x)
integer, unified :: x(:)
end subroutine
end module m4
subroutine test_use_device_managed_unified_only()
use m4
integer, allocatable :: fx(:)
allocate(fx(100))
!$acc data copy(fx)
!$acc host_data use_device(fx)
!ERROR: No specific subroutine of generic 'overl_mu' matches the actual arguments
call overl_mu(fx)
!$acc end host_data
!$acc end data
deallocate(fx)
end