! { dg-do run } ! Test whether use_device_ptr properly handles OPTIONAL arguments ! (Only case of present arguments is tested) program test_it implicit none integer, target :: ixx integer, pointer :: ptr_i, ptr_null ptr_i => ixx call foo(ptr_i) ptr_null => null() call bar(ptr_null) call foo_absent() call bar_absent() contains subroutine foo(ii) integer, pointer, optional :: ii if (.not.present(ii)) stop 1 if (.not.associated(ii, ixx)) stop 2 !$omp target data map(to:ixx) use_device_ptr(ii) if (.not.present(ii)) stop 3 if (.not.associated(ii)) stop 4 !$omp end target data end subroutine foo ! For bar, it is assumed that a NULL ptr on the host maps to NULL on the device subroutine bar(jj) integer, pointer, optional :: jj if (.not.present(jj)) stop 5 if (associated(jj)) stop 6 !$omp target data map(to:ixx) use_device_ptr(jj) if (.not.present(jj)) stop 7 if (associated(jj)) stop 8 !$omp end target data end subroutine bar subroutine foo_absent(ii) integer, pointer, optional :: ii if (present(ii)) STOP 31 !$omp target data map(to:ixx) use_device_ptr(ii) if (present(ii)) STOP 32 !$omp end target data end subroutine foo_absent ! For bar, it is assumed that a NULL ptr on the host maps to NULL on the device subroutine bar_absent(jj) integer, pointer, optional :: jj if (present(jj)) STOP 41 !$omp target data map(to:ixx) use_device_ptr(jj) if (present(jj)) STOP 42 !$omp end target data end subroutine bar_absent end program test_it