1! See also "lib-16-2.f90".
2! { dg-do run }
3! { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } }
4
5program main
6  use openacc
7  implicit none
8
9  integer, parameter :: N = 256
10  integer, allocatable :: h(:)
11  integer :: i
12  integer :: async = 5
13
14  allocate (h(N))
15
16  do i = 1, N
17    h(i) = i
18  end do
19
20  call acc_copyin (h)
21
22  do i = 1, N
23    h(i) = i + i
24  end do
25
26  call acc_update_device_async (h, sizeof (h), async)
27
28  if (acc_is_present (h) .neqv. .TRUE.) stop 1
29
30  call acc_wait (async)
31
32  h(:) = 0
33
34  call acc_copyout_async (h, sizeof (h), async)
35
36  call acc_wait (async)
37
38  do i = 1, N
39    if (h(i) /= i + i) stop 2
40  end do
41
42  call acc_copyin (h, sizeof (h))
43
44  h(:) = 0
45
46  call acc_update_self_async (h, sizeof (h), async)
47
48  if (acc_is_present (h) .neqv. .TRUE.) stop 3
49
50  call acc_wait (async)
51
52  do i = 1, N
53    if (h(i) /= i + i) stop 4
54  end do
55
56  call acc_delete_async (h, async)
57
58  call acc_wait (async)
59
60  if (acc_is_present (h) .neqv. .FALSE.) stop 5
61
62end program
63