1257853Sjmmv! { dg-do run }
2257853Sjmmv
3257853Sjmmvmodule e_53_3_mod
4257853Sjmmv  !$omp declare target (N, p, v1, v2)
5257853Sjmmv  integer, parameter :: N = 1000
6257853Sjmmv  real :: p(N), v1(N), v2(N)
7257853Sjmmvend module
8257853Sjmmv
9257853Sjmmvsubroutine init (v1, v2, N)
10257853Sjmmv  integer :: i, N
11  real :: v1(N), v2(N)
12  do i = 1, N
13    v1(i) = i + 2.0
14    v2(i) = i - 3.0
15  end do
16end subroutine
17
18subroutine check (p, N)
19  integer :: i, N
20  real, parameter :: EPS = 0.00001
21  real :: diff, p(N)
22  do i = 1, N
23    diff = p(i) - (i + 2.0) * (i - 3.0)
24    if (diff > EPS .or. -diff > EPS) call abort
25  end do
26end subroutine
27
28subroutine vec_mult ()
29  use e_53_3_mod
30  integer :: i
31  call init (v1, v2, N);
32  !$omp target update to(v1, v2)
33  !$omp target
34    !$omp parallel do
35    do i = 1,N
36      p(i) = v1(i) * v2(i)
37    end do
38  !$omp end target
39  !$omp target update from (p)
40  call check (p, N)
41end subroutine
42
43program e_53_3
44  call vec_mult ()
45end program
46