1! Offloading test checking interaction of an explicit member map from two large
2! nested derived types
3! REQUIRES: flang, amdgpu
4
5! RUN: %libomptarget-compile-fortran-run-and-check-generic
6program main
7    type :: bottom_layer1
8    real(4) :: i4
9    real(4) :: j4
10    real(4) :: k4
11    end type bottom_layer1
12
13    type :: bottom_layer2
14      integer(4) :: i3
15      integer(4) :: j3
16      integer(4) :: k3
17    end type bottom_layer2
18
19    type :: middle_layer
20     real(4) :: array_i2(10)
21     real(4) :: i2
22     real(4) :: array_j2(10)
23     type(bottom_layer1) :: nest
24     type(bottom_layer2) :: nest2
25    end type middle_layer
26
27    type :: top_layer
28    real(4) :: i
29    integer(4) :: array_i(10)
30    real(4) :: j
31    integer, allocatable :: array_j(:)
32    integer(4) :: k
33    type(middle_layer) :: nested
34    end type top_layer
35
36    type(top_layer) :: top_dtype
37    type(top_layer) :: top_dtype2
38
39    top_dtype2%nested%nest%i4 = 10
40    top_dtype2%nested%nest%j4 = 12
41    top_dtype2%nested%nest%k4 = 54
42
43    top_dtype2%nested%nest2%i3 = 20
44    top_dtype2%nested%nest2%j3 = 40
45    top_dtype2%nested%nest2%k3 = 60
46
47    top_dtype2%nested%i2 = 200
48
49      do i = 1, 10
50        top_dtype2%array_i(i) = i
51      end do
52
53!$omp target map(from: top_dtype%nested%nest%j4, top_dtype%nested%nest%i4, top_dtype%nested%nest%k4) &
54!$omp map(from: top_dtype%array_i, top_dtype%nested%nest2%i3, top_dtype%nested%i2) &
55!$omp map(from: top_dtype%nested%nest2%k3, top_dtype%nested%nest2%j3) &
56!$omp map(to: top_dtype2%nested%nest%j4, top_dtype2%nested%nest%i4, top_dtype2%nested%nest%k4) &
57!$omp map(to: top_dtype2%array_i, top_dtype2%nested%nest2%i3, top_dtype2%nested%i2) &
58!$omp map(to: top_dtype2%nested%nest2%k3, top_dtype2%nested%nest2%j3)
59    top_dtype%nested%nest%i4 = top_dtype2%nested%nest%i4
60    top_dtype%nested%nest%j4 = top_dtype2%nested%nest%j4
61    top_dtype%nested%nest%k4 = top_dtype2%nested%nest%k4
62
63    top_dtype%nested%nest2%i3 = top_dtype2%nested%nest2%i3
64    top_dtype%nested%nest2%j3 = top_dtype2%nested%nest2%j3
65    top_dtype%nested%nest2%k3 = top_dtype2%nested%nest2%k3
66
67    top_dtype%nested%i2 = top_dtype2%nested%i2
68
69    do i = 1, 10
70      top_dtype%array_i(i) = top_dtype2%array_i(i)
71    end do
72!$omp end target
73
74  print *, top_dtype%nested%nest%i4
75  print *, top_dtype%nested%nest%j4
76  print *, top_dtype%nested%nest%k4
77
78  print *, top_dtype%nested%nest2%i3
79  print *, top_dtype%nested%nest2%j3
80  print *, top_dtype%nested%nest2%k3
81
82  print *, top_dtype%nested%i2
83
84  print *, top_dtype%array_i
85end program main
86
87!CHECK: 10.
88!CHECK: 12.
89!CHECK: 54.
90!CHECK: 20
91!CHECK: 40
92!CHECK: 60
93!CHECK: 200.
94!CHECK: 1 2 3 4 5 6 7 8 9 10
95