aboutsummaryrefslogtreecommitdiff
path: root/offload/test/offloading/fortran/implicit-derived-enter-exit.f90
blob: 0c896e64298789d62b5da5eebdea8c492f584017 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
! REQUIRES: flang, amdgpu

! RUN: %libomptarget-compile-fortran-generic
! RUN: %libomptarget-run-generic 2>&1 | %fcheck-generic

module enter_exit_mapper_mod
  implicit none

  type :: field_type
    real, allocatable :: values(:)
  end type field_type

  type :: tile_type
    type(field_type) :: field
    integer, allocatable :: neighbors(:)
  end type tile_type

contains
  subroutine init_tile(tile)
    type(tile_type), intent(inout) :: tile
    integer :: j

    allocate(tile%field%values(4))
    allocate(tile%neighbors(4))
    do j = 1, 4
      tile%field%values(j) = 10.0 * j
      tile%neighbors(j) = j
    end do
  end subroutine init_tile

end module enter_exit_mapper_mod

program implicit_enter_exit
  use enter_exit_mapper_mod
  implicit none
  integer :: j
  type(tile_type) :: tile

  call init_tile(tile)

  !$omp target enter data map(alloc: tile%field%values)

  !$omp target
  do j = 1, size(tile%field%values)
    tile%field%values(j) = 5.0 * j
  end do
  !$omp end target

  !$omp target exit data map(from: tile%field%values)

  do j = 1, size(tile%field%values)
    if (tile%field%values(j) /= 5.0 * j) then
      print *, "======= Test Failed! ======="
      stop 1
    end if
    if (tile%neighbors(j) /= j) then
      print *, "======= Test Failed! ======="
      stop 1
    end if
  end do

  print *, "======= Test Passed! ======="
end program implicit_enter_exit

! CHECK: ======= Test Passed! =======