1! { dg-do run }
2! Test whether use_device_ptr properly handles OPTIONAL arguments
3! (Only case of present arguments is tested)
4program test_it
5  implicit none
6  integer, target :: ixx
7  integer, pointer :: ptr_i, ptr_null
8
9  ptr_i => ixx
10  call foo(ptr_i)
11
12  ptr_null => null()
13  call bar(ptr_null)
14
15  call foo_absent()
16  call bar_absent()
17contains
18  subroutine foo(ii)
19    integer, pointer, optional :: ii
20
21    if (.not.present(ii)) stop 1
22    if (.not.associated(ii, ixx)) stop 2
23    !$omp target data map(to:ixx) use_device_ptr(ii)
24    if (.not.present(ii)) stop 3
25    if (.not.associated(ii)) stop 4
26    !$omp end target data
27  end subroutine foo
28
29  ! For bar, it is assumed that a NULL ptr on the host maps to NULL on the device
30  subroutine bar(jj)
31    integer, pointer, optional :: jj
32
33    if (.not.present(jj)) stop 5
34    if (associated(jj)) stop 6
35    !$omp target data map(to:ixx) use_device_ptr(jj)
36    if (.not.present(jj)) stop 7
37   if (associated(jj)) stop 8
38    !$omp end target data
39  end subroutine bar
40
41  subroutine foo_absent(ii)
42    integer, pointer, optional :: ii
43
44    if (present(ii)) STOP 31
45    !$omp target data map(to:ixx) use_device_ptr(ii)
46    if (present(ii)) STOP 32
47    !$omp end target data
48  end subroutine foo_absent
49
50  ! For bar, it is assumed that a NULL ptr on the host maps to NULL on the device
51  subroutine bar_absent(jj)
52    integer, pointer, optional :: jj
53
54    if (present(jj)) STOP 41
55    !$omp target data map(to:ixx) use_device_ptr(jj)
56    if (present(jj)) STOP 42
57    !$omp end target data
58  end subroutine bar_absent
59end program test_it
60