(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.fortran/
reverse-offload-4.f90
! { dg-additional-options "-foffload-options=nvptx-none=-misa=sm_35" { target { offload_target_nvptx } } }

implicit none
!$omp requires reverse_offload

type t2
  integer :: a, b, c
end type t2

type t
 integer :: A(5), B(5), C(5)
 integer, pointer :: P(:), P2 !Just some padding
 type(t2) :: tt !Just some padding
end type t

type(t) :: S1, S2
logical :: shared_mem

shared_mem = .false.

!$omp target map(to: shared_mem)
  shared_mem = .true.
!$omp end target

s1%A = [1,2,3,4,5]
s1%B = [10,20,30,40,50]
s1%C = [11,22,33,44,55]
s2%A = 2*s1%A
s2%B = 2*s1%B
s2%C = 2*s1%C

!$omp target &
!$omp&       map(to: s1%b, s1%c) &
!$omp&       map(to: s2%b, s2%c)
block
  type(t) :: si1, si2, si3, si4

  s1%B = -10 * s1%B
  s1%C = -10 * s1%C
  s2%B = -15 * s2%B
  s2%C = -15 * s2%C

  si1%A = -1 * [1,2,3,4,5]
  si1%B = -1 * [10,20,30,40,50]
  si1%C = -1 * [11,22,33,44,55]
  si2%A = -23 * [1,2,3,4,5]
  si2%B = -23 * [10,20,30,40,50]
  si2%C = -23 * [11,22,33,44,55]

  !$omp target device (ancestor:1)  &
  !$omp&       map(to: si1%C, si1%B)  &
  !$omp&       map(tofrom: si2%C, si2%B)  &
  !$omp&       map(always, to: s1%B)  &
  !$omp&       map(        to: s2%B)
    if (any (s1%A /=       [1,2,3,4,5])) stop 1
    if (any (s1%B /= -10 * [10,20,30,40,50])) stop 2
    if (shared_mem) then
      if (any (s1%C /= -10 * [11,22,33,44,55])) stop 4
    else
      if (any (s1%C /=       [11,22,33,44,55])) stop 3
    endif
    if (any (s2%A /=   2 * [1,2,3,4,5])) stop 4
    if (shared_mem) then
      if (any (s2%B /= -15 * 2 * [10,20,30,40,50])) stop 5
      if (any (s2%C /= -15 * 2 * [11,22,33,44,55])) stop 6
    else
      if (any (s2%B /=   2 * [10,20,30,40,50])) stop 7
      if (any (s2%C /=   2 * [11,22,33,44,55])) stop 8
    endif
    if (any (si1%B /= -1 * [10,20,30,40,50])) stop 9
    if (any (si1%C /= -1 * [11,22,33,44,55])) stop 10
    if (any (si2%B /= -23 * [10,20,30,40,50])) stop 10
    if (any (si2%C /= -23 * [11,22,33,44,55])) stop 11

    s1%A = 5 * s1%A
    s1%B = 7 * s1%B
    s1%C = 13 * s1%C
    s2%A = 9 * s2%A
    s2%B = 21 * s2%B
    s2%C = 31 * s2%C
    si1%B = -11 * si1%B
    si1%C = -13 * si1%C
    si2%B = -27 * si2%B
    si2%C = -29 * si2%C
  !$omp end target

  if (shared_mem) then
    if (any (s1%B /= -10 * 7 * [10,20,30,40,50])) stop 20
    if (any (s1%C /= -10 * 13 * [11,22,33,44,55])) stop 21
  else
    if (any (s1%B /= -10 * [10,20,30,40,50])) stop 22
    if (any (s1%C /= -10 * [11,22,33,44,55])) stop 23
  endif
  if (shared_mem) then
    if (any (s2%B /= -15 * 2 * 21 * [10,20,30,40,50])) stop 24
    if (any (s2%C /= -15 * 2 * 31 * [11,22,33,44,55])) stop 25
  else
    if (any (s2%B /= -15 * 2 * [10,20,30,40,50])) stop 26
    if (any (s2%C /= -15 * 2 * [11,22,33,44,55])) stop 27
  endif
  if (any (si1%A /= -1 * [1,2,3,4,5])) stop 28
  if (shared_mem) then
    if (any (si1%B /= -1 * (-11) * [10,20,30,40,50])) stop 29
    if (any (si1%C /= -1 * (-13) * [11,22,33,44,55])) stop 30
  else
    if (any (si1%B /= -1 * [10,20,30,40,50])) stop 31
    if (any (si1%C /= -1 * [11,22,33,44,55])) stop 32
  endif
  if (any (si2%A /= -23 * [1,2,3,4,5])) stop 33
  if (any (si2%B /= -23 * (-27) * [10,20,30,40,50])) stop 34
  if (any (si2%C /= -23 * (-29) * [11,22,33,44,55])) stop 35
end block

if (any (s1%A /=       5 * [1,2,3,4,5])) stop 40
if (any (s1%B /= -10 * 7 * [10,20,30,40,50])) stop 41
if (shared_mem) then
  if (any (s1%C /= -10 * 13 * [11,22,33,44,55])) stop 42
else
  if (any (s1%C /= 13 *    [11,22,33,44,55])) stop 43
endif
if (any (s2%A /=   2 * 9 * [1,2,3,4,5])) stop 44
if (shared_mem) then
  if (any (s2%B /= -15 * 2 * 21 * [10,20,30,40,50])) stop 45
  if (any (s2%C /= -15 * 2 * 31 * [11,22,33,44,55])) stop 46
else
  if (any (s2%B /=   2 * 21 * [10,20,30,40,50])) stop 47
  if (any (s2%C /=   2 * 31 * [11,22,33,44,55])) stop 48
endif
end