! PR fortran/98858 ! ! Assumed-size array with use_device_ptr() ! program test_use_device_ptr use iso_c_binding, only: c_ptr, c_loc, c_f_pointer implicit none double precision :: alpha integer, parameter :: lda = 10 integer, allocatable :: mat(:, :) integer :: i, j allocate(mat(lda, lda)) do i = 1, lda do j = 1, lda mat(j,i) = i*100 + j end do end do !$omp target enter data map(to:mat) call dgemm(lda, mat) !$omp target exit data map(from:mat) do i = 1, lda do j = 1, lda if (mat(j,i) /= -(i*100 + j)) stop 1 end do end do !$omp target enter data map(to:mat) call dgemm2(lda, mat) !$omp target exit data map(from:mat) do i = 1, lda do j = 1, lda if (mat(j,i) /= (i*100 + j)) stop 1 end do end do contains subroutine dgemm(lda, a) implicit none integer :: lda integer, target:: a(lda,*) ! need target attribute to use c_loc !$omp target data use_device_ptr(a) call negate_it(c_loc(a), lda) !$omp end target data end subroutine subroutine dgemm2(lda, a) implicit none integer :: lda integer, target:: a(lda,*) ! need target attribute to use c_loc !$omp target data use_device_addr(a) call negate_it(c_loc(a), lda) !$omp end target data end subroutine subroutine negate_it(a, n) type(c_ptr), value :: a integer, value :: n integer, pointer :: array(:,:) ! detour due to OpenMP 5.0 oddness call c_f_pointer(a, array, [n,n]) call do_offload(array, n) end subroutine do_offload(aptr, n) integer, target :: aptr(:,:) integer, value :: n !$omp target is_device_ptr(aptr) call negate_it_tgt(aptr, n) !$omp end target end subroutine do_offload subroutine negate_it_tgt(array, n) !$omp declare target integer, value :: n integer :: array(n,n) integer :: i, j !$omp parallel do collapse(2) do i = 1, n do j = 1, n array(j,i) = - array(j,i) end do end do !$omp end parallel do end subroutine end program