1! { dg-do run }
2! { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } }
3
4program refcount_test
5  use openacc
6  integer, allocatable :: h(:)
7  integer i, N
8
9  N = 256
10  allocate (h(N))
11
12  do i = 1, N
13     h(i) = i
14  end do
15
16  !$acc enter data create (h(1:N))
17  !$acc enter data copyin (h(1:N))
18  !$acc enter data copyin (h(1:N))
19  !$acc enter data copyin (h(1:N))
20
21  call acc_update_self (h)
22  do i = 1, N
23     if (h(i) .eq. i) c = c + 1
24  end do
25  ! h[] should be filled with uninitialized device values,
26  ! 'stop' if it's not.
27  if (c .eq. N) stop 1
28
29  h(:) = 0
30
31  !$acc parallel present (h(1:N))
32  do i = 1, N
33     h(i) = 111
34  end do
35  !$acc end parallel
36
37  ! No actual copyout should happen.
38  call acc_copyout (h)
39  do i = 1, N
40     if (h(i) .ne. 0) stop 2
41  end do
42
43  !$acc exit data delete (h(1:N))
44
45  ! This should not actually be deleted yet.
46  if (acc_is_present (h) .eqv. .FALSE.) stop 3
47
48  !$acc exit data copyout (h(1:N)) finalize
49
50  do i = 1, N
51     if (h(i) .ne. 111) stop 4
52  end do
53
54  if (acc_is_present (h) .eqv. .TRUE.) stop 5
55
56end program refcount_test
57