blob: 44c67f925bda59ae1d323d0d2de8689466cbb383 [file] [log] [blame]
! { dg-additional-options "-Wall" }
! PR fortran/115559
! PR middle-end/115637
module m
integer :: A
!$omp declare target link(A)
end module m
subroutine f
implicit none (type, external)
integer, save :: x, y ! { dg-warning "Unused variable 'y' declared" }
!$omp declare target link(x, y)
! note: y is not 'link' as gfortran doesn't regard it as used
x = 6
call ii
contains
subroutine k
!$omp declare target
use m
A = 5
end
subroutine ii
integer :: res
!$omp target map(x) map(from: res)
call k()
call ll()
res = get()
!$omp end target
! print *, res
if (res /= 6 + 7 + 5) &
stop 1
end
subroutine ll
!$omp declare target
x = x + 7
end
integer function get()
use m
!$omp declare target
get = x + A
end
end
subroutine sub
implicit none (type, external)
integer, save :: arr(100), arr2(1:4)
!$omp declare target link(arr,arr2)
call mapit
call device1
call re_mapit
call device2
contains
subroutine mapit
integer :: i
arr = [(i, i=1,100)]
!$omp target enter data map(to:arr(10:50)) map(alloc: arr2(1:4))
end subroutine
subroutine re_mapit
integer :: i
!$omp target exit data map(from:arr(10:50)) map(delete: arr2)
if (any (arr(1:9) /= [(i, i=1,9)])) stop 2
if (any (arr(10:50) /= [(3-10*i, i=10,50)])) stop 3
if (any (arr(51:100) /= [(i, i=51,100)])) stop 4
end subroutine
subroutine device1
integer :: res
!$omp target map(from:res)
res = run_device1()
!$omp end target
! print *, res
if (res /= -11436) stop 5
end
integer function run_device1()
!$omp declare target
integer :: i
run_device1 = -99
arr2 = [11,22,33,44]
if (any (arr(10:50) /= [(i, i=10,50)])) then
run_device1 = arr(11)
return
end if
run_device1 = sum(arr(10:13) + arr2)
do i = 10, 50
arr(i) = 3 - 10 * arr(i)
end do
run_device1 = run_device1 + sum(arr(15:50))
end
subroutine device2
end
integer function run_device2()
!$omp declare target
run_device2 = -99
end
end
use m
implicit none (type, external)
external f
external sub
!$omp target enter data map(alloc: A)
call f()
call sub
end