(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.fortran/
use_device_addr-5.f90
program main
  use omp_lib
  implicit none
  integer, allocatable :: aaa(:,:,:)
  integer :: i

  allocate (aaa(-4:10,-3:8,2))
  aaa(:,:,:) = reshape ([(i, i = 1, size(aaa))], shape(aaa))

  do i = 0, omp_get_num_devices()
    !$omp target data map(to: aaa) device(i)
      call test_addr (aaa, i)
      call test_ptr (aaa, i)
    !$omp end target data
  end do
  deallocate (aaa)

contains

  subroutine test_addr (aaaa, dev)
    use iso_c_binding
    integer, target, allocatable :: aaaa(:,:,:), bbbb(:,:,:)
    integer, value :: dev
    integer :: i
    type(c_ptr) :: ptr
    logical :: is_shared

    is_shared = .false.
    !$omp target device(dev) map(to: is_shared)
      is_shared = .true.
    !$omp end target

    allocate (bbbb(-4:10,-3:8,2))
    bbbb(:,:,:) = reshape ([(-i, i = 1, size(bbbb))], shape(bbbb))
    !$omp target enter data map(to: bbbb) device(dev)
    if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 1
    if (any (shape (aaaa) /= [15, 12, 2])) error stop 2
    if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 3
    if (any (shape (bbbb) /= [15, 12, 2])) error stop 4
    if (any (aaaa /= -bbbb)) error stop 5
    if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) &
      error stop 6

    !$omp parallel do shared(bbbb, aaaa)
    do i = 1,1
      if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 5
      if (any (shape (aaaa) /= [15, 12, 2])) error stop 6
      if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 7
      if (any (shape (bbbb) /= [15, 12, 2])) error stop 8
      if (any (aaaa /= -bbbb)) error stop 5
      if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) &
        error stop 6
      ptr = c_loc (aaaa)
      !$omp target data use_device_addr(bbbb, aaaa) device(dev)
        if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 9
        if (any (shape (aaaa) /= [15, 12, 2])) error stop 10
        if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 11
        if (any (shape (bbbb) /= [15, 12, 2])) error stop 12
        if (is_shared) then
          if (any (aaaa /= -bbbb)) error stop 5
          if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) &
            error stop 6
        end if
        if (is_shared .neqv. c_associated (ptr, c_loc (aaaa))) error stop

        !$omp target has_device_addr(bbbb, aaaa) device(dev)
           if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 9
           if (any (shape (aaaa) /= [15, 12, 2])) error stop 10
           if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 11
           if (any (shape (bbbb) /= [15, 12, 2])) error stop 12
           if (any (aaaa /= -bbbb)) error stop 5
           if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) &
             error stop 6
        !$omp end target
      !$omp end target data
    end do
    !$omp target exit data map(delete: bbbb) device(dev)
    deallocate (bbbb)
  end subroutine test_addr

  subroutine test_ptr (aaaa, dev)
    use iso_c_binding
    integer, target, allocatable :: aaaa(:,:,:), bbbb(:,:,:)
    integer, value :: dev
    integer :: i
    type(c_ptr) :: ptr
    logical :: is_shared

    is_shared = .false.
    !$omp target device(dev) map(to: is_shared)
      is_shared = .true.
    !$omp end target

    allocate (bbbb(-4:10,-3:8,2))
    bbbb(:,:,:) = reshape ([(-i, i = 1, size(bbbb))], shape(bbbb))
    !$omp target enter data map(to: bbbb) device(dev)
    if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 1
    if (any (shape (aaaa) /= [15, 12, 2])) error stop 2
    if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 3
    if (any (shape (bbbb) /= [15, 12, 2])) error stop 4
    if (any (aaaa /= -bbbb)) error stop 5
    if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) &
      error stop 6

    !$omp parallel do shared(bbbb, aaaa)
    do i = 1,1
      if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 5
      if (any (shape (aaaa) /= [15, 12, 2])) error stop 6
      if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 7
      if (any (shape (bbbb) /= [15, 12, 2])) error stop 8
      if (any (aaaa /= -bbbb)) error stop 5
      if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) &
        error stop 6
      ptr = c_loc (aaaa)
      !$omp target data use_device_ptr(bbbb, aaaa) device(dev)
        if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 9
        if (any (shape (aaaa) /= [15, 12, 2])) error stop 10
        if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 11
        if (any (shape (bbbb) /= [15, 12, 2])) error stop 12
        if (is_shared) then
          if (any (aaaa /= -bbbb)) error stop 5
          if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) &
            error stop 6
        end if
        if (is_shared .neqv. c_associated (ptr, c_loc (aaaa))) error stop

        ! Uses has_device_addr due to PR fortran/105318
        !!$omp target is_device_ptr(bbbb, aaaa) device(dev)
        !$omp target has_device_addr(bbbb, aaaa) device(dev)
           if (any (lbound (aaaa) /= [-4, -3, 1])) error stop 9
           if (any (shape (aaaa) /= [15, 12, 2])) error stop 10
           if (any (lbound (bbbb) /= [-4, -3, 1])) error stop 11
           if (any (shape (bbbb) /= [15, 12, 2])) error stop 12
           if (any (aaaa /= -bbbb)) error stop 5
           if (any (aaaa /= reshape ([(i, i = 1, size(aaaa))], shape(aaaa)))) &
             error stop 6
        !$omp end target
      !$omp end target data
    end do
    !$omp target exit data map(delete: bbbb) device(dev)
    deallocate (bbbb)
  end subroutine test_ptr
end program main