3 ! Test OpenMP 4.5 structure-element mapping
5 ! TODO: character(kind=4,...) needs to be tested, but depends on
7 ! TODO: ...%str4 should be tested but that currently fails due to
8 ! PR fortran/95868 (see commented lined)
9 ! TODO: Test also array-valued var, nested derived types,
10 ! type-extended types.
17 ! For complex, assume small integers are exactly representable
20 integer, pointer :: e => null(), f(:) => null()
21 character(len=5) :: str1
22 character(len=5) :: str2(4)
23 character(len=:), pointer :: str3 => null()
24 character(len=:), pointer :: str4(:) => null()
39 ! Implicitly mapped – but no pointers are mapped
41 type(t2) :: var, var2(4)
42 type(t2), pointer :: var3, var4(:)
44 print '(g0)', '==== TESTCASE "one" ===='
47 b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
48 d = [(-3*i, i = 1, 10)], &
50 str2 = ["12345", "67890", "ABCDE", "FGHIJ"])
51 allocate (var%e, source=99)
52 allocate (var%f, source=[22, 33, 44, 55])
53 allocate (var%str3, source="HelloWorld")
54 allocate (var%str4, source=["Let's", "Go!!!"])
56 !$omp target map(tofrom:var)
57 if (var%a /= 1) stop 1
58 if (var%b /= 2) stop 2
59 if (var%c%re /= -1.0_8 .or. var%c%im /= 2.0_8) stop 3
60 if (any (var%d /= [(-3*i, i = 1, 10)])) stop 4
61 if (var%str1 /= "abcde") stop 5
62 if (any (var%str2 /= ["12345", "67890", "ABCDE", "FGHIJ"])) stop 6
65 deallocate(var%e, var%f, var%str3, var%str4)
68 ! Explicitly mapped – all and full arrays
70 type(t2) :: var, var2(4)
71 type(t2), pointer :: var3, var4(:)
73 print '(g0)', '==== TESTCASE "two" ===='
76 b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
77 d = [(-3*i, i = 1, 10)], &
79 str2 = ["12345", "67890", "ABCDE", "FGHIJ"])
80 allocate (var%e, source=99)
81 allocate (var%f, source=[22, 33, 44, 55])
82 allocate (var%str3, source="HelloWorld")
83 allocate (var%str4, source=["Let's", "Go!!!"])
85 !$omp target map(tofrom: var%a, var%b, var%c, var%d, var%e, var%f, &
86 !$omp& var%str1, var%str2, var%str3, var%str4)
87 if (var%a /= 1) stop 1
88 if (var%b /= 2) stop 2
89 if (var%c%re /= -1.0_8 .or. var%c%im /= 2.0_8) stop 3
90 if (any (var%d /= [(-3*i, i = 1, 10)])) stop 4
91 if (var%str1 /= "abcde") stop 5
92 if (any (var%str2 /= ["12345", "67890", "ABCDE", "FGHIJ"])) stop 6
94 if (.not. associated (var%e)) stop 7
95 if (var%e /= 99) stop 8
96 if (.not. associated (var%f)) stop 9
97 if (size (var%f) /= 4) stop 10
98 if (any (var%f /= [22, 33, 44, 55])) stop 11
99 if (.not. associated (var%str3)) stop 12
100 if (len (var%str3) /= len ("HelloWorld")) stop 13
101 if (var%str3 /= "HelloWorld") stop 14
102 if (.not. associated (var%str4)) stop 15
103 if (len (var%str4) /= 5) stop 16
104 if (size (var%str4) /= 2) stop 17
105 if (any (var%str4 /= ["Let's", "Go!!!"])) stop 18
108 deallocate(var%e, var%f, var%str3, var%str4)
111 ! Explicitly mapped – one by one but full arrays
113 type(t2) :: var, var2(4)
114 type(t2), pointer :: var3, var4(:)
116 print '(g0)', '==== TESTCASE "three" ===='
119 b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
120 d = [(-3*i, i = 1, 10)], &
122 str2 = ["12345", "67890", "ABCDE", "FGHIJ"])
123 allocate (var%e, source=99)
124 allocate (var%f, source=[22, 33, 44, 55])
125 allocate (var%str3, source="HelloWorld")
126 allocate (var%str4, source=["Let's", "Go!!!"])
128 !$omp target map(tofrom: var%a)
129 if (var%a /= 1) stop 1
131 !$omp target map(tofrom: var%b)
132 if (var%b /= 2) stop 2
134 !$omp target map(tofrom: var%c)
135 if (var%c%re /= -1.0_8 .or. var%c%im /= 2.0_8) stop 3
137 !$omp target map(tofrom: var%d)
138 if (any (var%d /= [(-3*i, i = 1, 10)])) stop 4
140 !$omp target map(tofrom: var%str1)
141 if (var%str1 /= "abcde") stop 5
143 !$omp target map(tofrom: var%str2)
144 if (any (var%str2 /= ["12345", "67890", "ABCDE", "FGHIJ"])) stop 6
147 !$omp target map(tofrom: var%e)
148 if (.not. associated (var%e)) stop 7
149 if (var%e /= 99) stop 8
151 !$omp target map(tofrom: var%f)
152 if (.not. associated (var%f)) stop 9
153 if (size (var%f) /= 4) stop 10
154 if (any (var%f /= [22, 33, 44, 55])) stop 11
156 !$omp target map(tofrom: var%str3)
157 if (.not. associated (var%str3)) stop 12
158 if (len (var%str3) /= len ("HelloWorld")) stop 13
159 if (var%str3 /= "HelloWorld") stop 14
161 !$omp target map(tofrom: var%str4)
162 if (.not. associated (var%str4)) stop 15
163 if (len (var%str4) /= 5) stop 16
164 if (size (var%str4) /= 2) stop 17
165 if (any (var%str4 /= ["Let's", "Go!!!"])) stop 18
168 deallocate(var%e, var%f, var%str3, var%str4)
171 ! Explicitly mapped – all but only subarrays
173 type(t2) :: var, var2(4)
174 type(t2), pointer :: var3, var4(:)
176 print '(g0)', '==== TESTCASE "four" ===='
179 b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
180 d = [(-3*i, i = 1, 10)], &
182 str2 = ["12345", "67890", "ABCDE", "FGHIJ"])
183 allocate (var%f, source=[22, 33, 44, 55])
184 allocate (var%str4, source=["Let's", "Go!!!"])
186 ! !$omp target map(tofrom: var%d(4:7), var%f(2:3), var%str2(2:3), var%str4(2:2))
187 !$omp target map(tofrom: var%d(4:7), var%f(2:3), var%str2(2:3))
188 if (any (var%d(4:7) /= [(-3*i, i = 4, 7)])) stop 4
189 if (any (var%str2(2:3) /= ["67890", "ABCDE"])) stop 6
191 if (.not. associated (var%f)) stop 9
192 if (size (var%f) /= 4) stop 10
193 if (any (var%f(2:3) /= [33, 44])) stop 11
194 ! if (.not. associated (var%str4)) stop 15
195 ! if (len (var%str4) /= 5) stop 16
196 ! if (size (var%str4) /= 2) stop 17
197 ! if (var%str4(2) /= "Go!!!") stop 18
200 deallocate(var%f, var%str4)
203 ! Explicitly mapped – all but only subarrays and one by one
205 type(t2) :: var, var2(4)
206 type(t2), pointer :: var3, var4(:)
208 print '(g0)', '==== TESTCASE "five" ===='
211 b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
212 d = [(-3*i, i = 1, 10)], &
214 str2 = ["12345", "67890", "ABCDE", "FGHIJ"])
215 allocate (var%f, source=[22, 33, 44, 55])
216 allocate (var%str4, source=["Let's", "Go!!!"])
218 !$omp target map(tofrom: var%d(4:7))
219 if (any (var%d(4:7) /= [(-3*i, i = 4, 7)])) stop 4
221 !$omp target map(tofrom: var%str2(2:3))
222 if (any (var%str2(2:3) /= ["67890", "ABCDE"])) stop 6
225 !$omp target map(tofrom: var%f(2:3))
226 if (.not. associated (var%f)) stop 9
227 if (size (var%f) /= 4) stop 10
228 if (any (var%f(2:3) /= [33, 44])) stop 11
230 ! !$omp target map(tofrom: var%str4(2:2))
231 ! if (.not. associated (var%str4)) stop 15
232 ! if (len (var%str4) /= 5) stop 16
233 ! if (size (var%str4) /= 2) stop 17
234 ! if (var%str4(2) /= "Go!!!") stop 18
237 deallocate(var%f, var%str4)
240 ! Explicitly mapped – all but only array elements
242 type(t2) :: var, var2(4)
243 type(t2), pointer :: var3, var4(:)
245 print '(g0)', '==== TESTCASE "six" ===='
248 b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
249 d = [(-3*i, i = 1, 10)], &
251 str2 = ["12345", "67890", "ABCDE", "FGHIJ"])
252 allocate (var%f, source=[22, 33, 44, 55])
253 allocate (var%str4, source=["Let's", "Go!!!"])
255 ! !$omp target map(tofrom: var%d(5), var%f(3), var%str2(3), var%str4(2))
256 !$omp target map(tofrom: var%d(5), var%f(3), var%str2(3))
257 if (var%d(5) /= -3*5) stop 4
258 if (var%str2(3) /= "ABCDE") stop 6
260 if (.not. associated (var%f)) stop 9
261 if (size (var%f) /= 4) stop 10
262 if (var%f(3) /= 44) stop 11
263 ! if (.not. associated (var%str4)) stop 15
264 ! if (len (var%str4) /= 5) stop 16
265 ! if (size (var%str4) /= 2) stop 17
266 ! if (var%str4(2) /= "Go!!!") stop 18
269 deallocate(var%f, var%str4)
272 ! Explicitly mapped – all but only array elements and one by one
274 type(t2) :: var, var2(4)
275 type(t2), pointer :: var3, var4(:)
277 print '(g0)', '==== TESTCASE "seven" ===='
280 b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
281 d = [(-3*i, i = 1, 10)], &
283 str2 = ["12345", "67890", "ABCDE", "FGHIJ"])
284 allocate (var%f, source=[22, 33, 44, 55])
285 allocate (var%str4, source=["Let's", "Go!!!"])
287 !$omp target map(tofrom: var%d(5))
288 if (var%d(5) /= (-3*5)) stop 4
290 !$omp target map(tofrom: var%str2(2:3))
291 if (any (var%str2(2:3) /= ["67890", "ABCDE"])) stop 6
294 !$omp target map(tofrom: var%f(2:3))
295 if (.not. associated (var%f)) stop 9
296 if (size (var%f) /= 4) stop 10
297 if (any (var%f(2:3) /= [33, 44])) stop 11
299 ! !$omp target map(tofrom: var%str4(2:2))
300 ! if (.not. associated (var%str4)) stop 15
301 ! if (len (var%str4) /= 5) stop 16
302 ! if (size (var%str4) /= 2) stop 17
303 ! if (var%str4(2) /= "Go!!!") stop 18
306 deallocate(var%f, var%str4)
309 ! Check mapping of NULL pointers
311 type(t2) :: var, var2(4)
312 type(t2), pointer :: var3, var4(:)
314 print '(g0)', '==== TESTCASE "eight" ===='
317 b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
318 d = [(-3*i, i = 1, 10)], &
320 str2 = ["12345", "67890", "ABCDE", "FGHIJ"])
322 ! !$omp target map(tofrom: var%e, var%f, var%str3, var%str4)
323 !$omp target map(tofrom: var%e, var%str3)
324 if (associated (var%e)) stop 1
325 ! if (associated (var%f)) stop 2
326 if (associated (var%str3)) stop 3
327 ! if (associated (var%str4)) stop 4