3 ! Test OpenMP 4.5 structure-element mapping
5 ! TODO: ...%str4 + %uni4 should be tested but that currently fails due to
6 ! PR fortran/95868 (see commented lined)
7 ! TODO: Test also 'var' as array and/or pointer; nested derived types,
15 ! For complex, assume small integers are exactly representable
18 integer, pointer :: e
=> null(), f(:) => null()
19 character(len
=5) :: str1
20 character(len
=5) :: str2(4)
21 character(len
=:), pointer :: str3
=> null()
22 character(len
=:), pointer :: str4(:) => null()
23 character(kind
=4, len
=5) :: uni1
24 character(kind
=4, len
=5) :: uni2(4)
25 character(kind
=4, len
=:), pointer :: uni3
=> null()
26 character(kind
=4, len
=:), pointer :: uni4(:) => null()
41 ! Implicitly mapped – but no pointers are mapped
45 print '(g0)', '==== TESTCASE "one" ===='
48 b
= 2, c
= cmplx(-1.0_8
, 2.0_8
,kind
=8), &
49 d
= [(-3*i
, i
= 1, 10)], &
51 str2
= ["12345", "67890", "ABCDE", "FGHIJ"], &
53 uni2
= [4_
"12345", 4_
"67890", 4_
"ABCDE", 4_
"FGHIJ"])
54 allocate (var
%e
, source
=99)
55 allocate (var
%f
, source
=[22, 33, 44, 55])
56 allocate (var
%str3
, source
="HelloWorld")
57 allocate (var
%str4
, source
=["Let's", "Go!!!"])
58 allocate (var
%uni3
, source
=4_
"HelloWorld")
59 allocate (var
%uni4
, source
=[4_
"Let's", 4_
"Go!!!"])
61 !$omp target map(tofrom:var)
62 if (var
%a
/= 1) stop 1
63 if (var
%b
/= 2) stop 2
64 if (var
%c
%re
/= -1.0_8
.or
. var
%c
%im
/= 2.0_8
) stop 3
65 if (any (var
%d
/= [(-3*i
, i
= 1, 10)])) stop 4
66 if (var
%str1
/= "abcde") stop 5
67 if (any (var
%str2
/= ["12345", "67890", "ABCDE", "FGHIJ"])) stop 6
68 if (var
%uni1
/= 4_
"abcde") stop 7
69 if (any (var
%uni2
/= [4_
"12345", 4_
"67890", 4_
"ABCDE", 4_
"FGHIJ"])) stop 8
72 deallocate(var
%e
, var
%f
, var
%str3
, var
%str4
, var
%uni3
, var
%uni4
)
75 ! Explicitly mapped – all and full arrays
79 print '(g0)', '==== TESTCASE "two" ===='
82 b
= 2, c
= cmplx(-1.0_8
, 2.0_8
,kind
=8), &
83 d
= [(-3*i
, i
= 1, 10)], &
85 str2
= ["12345", "67890", "ABCDE", "FGHIJ"], &
87 uni2
= [4_
"12345", 4_
"67890", 4_
"ABCDE", 4_
"FGHIJ"])
88 allocate (var
%e
, source
=99)
89 allocate (var
%f
, source
=[22, 33, 44, 55])
90 allocate (var
%str3
, source
="HelloWorld")
91 allocate (var
%str4
, source
=["Let's", "Go!!!"])
92 allocate (var
%uni3
, source
=4_
"HelloWorld")
93 allocate (var
%uni4
, source
=[4_
"Let's", 4_
"Go!!!"])
95 !$omp target map(tofrom: var%a, var%b, var%c, var%d, var%e, var%f, &
96 !$omp& var%str1, var%str2, var%str3, var%str4, &
97 !$omp& var%uni1, var%uni2, var%uni3, var%uni4)
98 if (var
%a
/= 1) stop 1
99 if (var
%b
/= 2) stop 2
100 if (var
%c
%re
/= -1.0_8
.or
. var
%c
%im
/= 2.0_8
) stop 3
101 if (any (var
%d
/= [(-3*i
, i
= 1, 10)])) stop 4
102 if (var
%str1
/= "abcde") stop 5
103 if (any (var
%str2
/= ["12345", "67890", "ABCDE", "FGHIJ"])) stop 6
105 if (.not
. associated (var
%e
)) stop 7
106 if (var
%e
/= 99) stop 8
107 if (.not
. associated (var
%f
)) stop 9
108 if (size (var
%f
) /= 4) stop 10
109 if (any (var
%f
/= [22, 33, 44, 55])) stop 11
110 if (.not
. associated (var
%str3
)) stop 12
111 if (len (var
%str3
) /= len ("HelloWorld")) stop 13
112 if (var
%str3
/= "HelloWorld") stop 14
113 if (.not
. associated (var
%str4
)) stop 15
114 if (len (var
%str4
) /= 5) stop 16
115 if (size (var
%str4
) /= 2) stop 17
116 if (any (var
%str4
/= ["Let's", "Go!!!"])) stop 18
118 if (var
%uni1
/= 4_
"abcde") stop 19
119 if (any (var
%uni2
/= [4_
"12345", 4_
"67890", 4_
"ABCDE", 4_
"FGHIJ"])) stop 20
120 if (.not
. associated (var
%uni3
)) stop 21
121 if (len (var
%uni3
) /= len (4_
"HelloWorld")) stop 22
122 if (var
%uni3
/= 4_
"HelloWorld") stop 23
123 if (.not
. associated (var
%uni4
)) stop 24
124 if (len (var
%uni4
) /= 5) stop 25
125 if (size (var
%uni4
) /= 2) stop 26
126 if (any (var
%uni4
/= [4_
"Let's", 4_
"Go!!!"])) stop 27
129 deallocate(var
%e
, var
%f
, var
%str3
, var
%str4
, var
%uni3
, var
%uni4
)
132 ! Explicitly mapped – one by one but full arrays
136 print '(g0)', '==== TESTCASE "three" ===='
139 b
= 2, c
= cmplx(-1.0_8
, 2.0_8
,kind
=8), &
140 d
= [(-3*i
, i
= 1, 10)], &
142 str2
= ["12345", "67890", "ABCDE", "FGHIJ"], &
144 uni2
= [4_
"12345", 4_
"67890", 4_
"ABCDE", 4_
"FGHIJ"])
145 allocate (var
%e
, source
=99)
146 allocate (var
%f
, source
=[22, 33, 44, 55])
147 allocate (var
%str3
, source
="HelloWorld")
148 allocate (var
%str4
, source
=["Let's", "Go!!!"])
149 allocate (var
%uni3
, source
=4_
"HelloWorld")
150 allocate (var
%uni4
, source
=[4_
"Let's", 4_
"Go!!!"])
152 !$omp target map(tofrom: var%a)
153 if (var
%a
/= 1) stop 1
155 !$omp target map(tofrom: var%b)
156 if (var
%b
/= 2) stop 2
158 !$omp target map(tofrom: var%c)
159 if (var
%c
%re
/= -1.0_8
.or
. var
%c
%im
/= 2.0_8
) stop 3
161 !$omp target map(tofrom: var%d)
162 if (any (var
%d
/= [(-3*i
, i
= 1, 10)])) stop 4
164 !$omp target map(tofrom: var%str1)
165 if (var
%str1
/= "abcde") stop 5
167 !$omp target map(tofrom: var%str2)
168 if (any (var
%str2
/= ["12345", "67890", "ABCDE", "FGHIJ"])) stop 6
171 !$omp target map(tofrom: var%e)
172 if (.not
. associated (var
%e
)) stop 7
173 if (var
%e
/= 99) stop 8
175 !$omp target map(tofrom: var%f)
176 if (.not
. associated (var
%f
)) stop 9
177 if (size (var
%f
) /= 4) stop 10
178 if (any (var
%f
/= [22, 33, 44, 55])) stop 11
180 !$omp target map(tofrom: var%str3)
181 if (.not
. associated (var
%str3
)) stop 12
182 if (len (var
%str3
) /= len ("HelloWorld")) stop 13
183 if (var
%str3
/= "HelloWorld") stop 14
185 !$omp target map(tofrom: var%str4)
186 if (.not
. associated (var
%str4
)) stop 15
187 if (len (var
%str4
) /= 5) stop 16
188 if (size (var
%str4
) /= 2) stop 17
189 if (any (var
%str4
/= ["Let's", "Go!!!"])) stop 18
192 !$omp target map(tofrom: var%uni1)
193 if (var
%uni1
/= 4_
"abcde") stop 19
195 !$omp target map(tofrom: var%uni2)
196 if (any (var
%uni2
/= [4_
"12345", 4_
"67890", 4_
"ABCDE", 4_
"FGHIJ"])) stop 20
198 !$omp target map(tofrom: var%uni3)
199 if (.not
. associated (var
%uni3
)) stop 21
200 if (len (var
%uni3
) /= len (4_
"HelloWorld")) stop 22
201 if (var
%uni3
/= 4_
"HelloWorld") stop 23
203 !$omp target map(tofrom: var%uni4)
204 if (.not
. associated (var
%uni4
)) stop 24
205 if (len (var
%uni4
) /= 5) stop 25
206 if (size (var
%uni4
) /= 2) stop 26
207 if (any (var
%uni4
/= [4_
"Let's", 4_
"Go!!!"])) stop 27
210 deallocate(var
%e
, var
%f
, var
%str3
, var
%str4
, var
%uni3
, var
%uni4
)
213 ! Explicitly mapped – all but only subarrays
217 print '(g0)', '==== TESTCASE "four" ===='
220 b
= 2, c
= cmplx(-1.0_8
, 2.0_8
,kind
=8), &
221 d
= [(-3*i
, i
= 1, 10)], &
223 str2
= ["12345", "67890", "ABCDE", "FGHIJ"], &
225 uni2
= [4_
"12345", 4_
"67890", 4_
"ABCDE", 4_
"FGHIJ"])
226 allocate (var
%f
, source
=[22, 33, 44, 55])
227 allocate (var
%str4
, source
=["Let's", "Go!!!"])
228 allocate (var
%uni4
, source
=[4_
"Let's", 4_
"Go!!!"])
230 ! !$omp target map(tofrom: var%d(4:7), var%f(2:3), var%str2(2:3)) &
231 ! !$omp& map(tofrom: var%str4(2:2), var%uni2(2:3), var%uni4(2:2))
232 !$omp target map(tofrom: var%d(4:7), var%f(2:3), var%str2(2:3), var%uni2(2:3))
233 if (any (var
%d(4:7) /= [(-3*i
, i
= 4, 7)])) stop 4
234 if (any (var
%str2(2:3) /= ["67890", "ABCDE"])) stop 6
236 if (.not
. associated (var
%f
)) stop 9
237 if (size (var
%f
) /= 4) stop 10
238 if (any (var
%f(2:3) /= [33, 44])) stop 11
239 ! if (.not. associated (var%str4)) stop 15
240 ! if (len (var%str4) /= 5) stop 16
241 ! if (size (var%str4) /= 2) stop 17
242 ! if (var%str4(2) /= "Go!!!") stop 18
244 if (any (var
%uni2(2:3) /= [4_
"67890", 4_
"ABCDE"])) stop 19
245 ! if (.not. associated (var%uni4)) stop 20
246 ! if (len (var%uni4) /= 5) stop 21
247 ! if (size (var%uni4) /= 2) stop 22
248 ! if (var%uni4(2) /= "Go!!!") stop 23
251 deallocate(var
%f
, var
%str4
)
254 ! Explicitly mapped – all but only subarrays and one by one
258 print '(g0)', '==== TESTCASE "five" ===='
261 b
= 2, c
= cmplx(-1.0_8
, 2.0_8
,kind
=8), &
262 d
= [(-3*i
, i
= 1, 10)], &
264 str2
= ["12345", "67890", "ABCDE", "FGHIJ"], &
266 uni2
= [4_
"12345", 4_
"67890", 4_
"ABCDE", 4_
"FGHIJ"])
267 allocate (var
%f
, source
=[22, 33, 44, 55])
268 allocate (var
%str4
, source
=["Let's", "Go!!!"])
270 !$omp target map(tofrom: var%d(4:7))
271 if (any (var
%d(4:7) /= [(-3*i
, i
= 4, 7)])) stop 4
273 !$omp target map(tofrom: var%str2(2:3))
274 if (any (var
%str2(2:3) /= ["67890", "ABCDE"])) stop 6
277 !$omp target map(tofrom: var%f(2:3))
278 if (.not
. associated (var
%f
)) stop 9
279 if (size (var
%f
) /= 4) stop 10
280 if (any (var
%f(2:3) /= [33, 44])) stop 11
282 ! !$omp target map(tofrom: var%str4(2:2))
283 ! if (.not. associated (var%str4)) stop 15
284 ! if (len (var%str4) /= 5) stop 16
285 ! if (size (var%str4) /= 2) stop 17
286 ! if (var%str4(2) /= "Go!!!") stop 18
288 ! !$omp target map(tofrom: var%uni4(2:2))
289 ! if (.not. associated (var%uni4)) stop 15
290 ! if (len (var%uni4) /= 5) stop 16
291 ! if (size (var%uni4) /= 2) stop 17
292 ! if (var%uni4(2) /= 4_"Go!!!") stop 18
295 deallocate(var
%f
, var
%str4
)
298 ! Explicitly mapped – all but only array elements
302 print '(g0)', '==== TESTCASE "six" ===='
305 b
= 2, c
= cmplx(-1.0_8
, 2.0_8
,kind
=8), &
306 d
= [(-3*i
, i
= 1, 10)], &
308 str2
= ["12345", "67890", "ABCDE", "FGHIJ"], &
310 uni2
= [4_
"12345", 4_
"67890", 4_
"ABCDE", 4_
"FGHIJ"])
311 allocate (var
%f
, source
=[22, 33, 44, 55])
312 allocate (var
%str4
, source
=["Let's", "Go!!!"])
313 allocate (var
%uni4
, source
=[4_
"Let's", 4_
"Go!!!"])
315 ! !$omp target map(tofrom: var%d(5), var%f(3), var%str2(3), &
316 ! !$omp var%str4(2), var%uni2(3), var%uni4(2))
317 !$omp target map(tofrom: var%d(5), var%f(3), var%str2(3), var%uni2(3))
318 if (var
%d(5) /= -3*5) stop 4
319 if (var
%str2(3) /= "ABCDE") stop 6
320 if (var
%uni2(3) /= 4_
"ABCDE") stop 7
322 if (.not
. associated (var
%f
)) stop 9
323 if (size (var
%f
) /= 4) stop 10
324 if (var
%f(3) /= 44) stop 11
325 ! if (.not. associated (var%str4)) stop 15
326 ! if (len (var%str4) /= 5) stop 16
327 ! if (size (var%str4) /= 2) stop 17
328 ! if (var%str4(2) /= "Go!!!") stop 18
329 ! if (.not. associated (var%uni4)) stop 19
330 ! if (len (var%uni4) /= 5) stop 20
331 ! if (size (var%uni4) /= 2) stop 21
332 ! if (var%uni4(2) /= 4_"Go!!!") stop 22
335 deallocate(var
%f
, var
%str4
, var
%uni4
)
338 ! Explicitly mapped – all but only array elements and one by one
342 print '(g0)', '==== TESTCASE "seven" ===='
345 b
= 2, c
= cmplx(-1.0_8
, 2.0_8
,kind
=8), &
346 d
= [(-3*i
, i
= 1, 10)], &
348 str2
= ["12345", "67890", "ABCDE", "FGHIJ"], &
350 uni2
= [4_
"12345", 4_
"67890", 4_
"ABCDE", 4_
"FGHIJ"])
351 allocate (var
%f
, source
=[22, 33, 44, 55])
352 allocate (var
%str4
, source
=["Let's", "Go!!!"])
353 allocate (var
%uni4
, source
=[4_
"Let's", 4_
"Go!!!"])
355 !$omp target map(tofrom: var%d(5))
356 if (var
%d(5) /= (-3*5)) stop 4
358 !$omp target map(tofrom: var%str2(2:3))
359 if (any (var
%str2(2:3) /= ["67890", "ABCDE"])) stop 6
361 !$omp target map(tofrom: var%uni2(2:3))
362 if (any (var
%uni2(2:3) /= [4_
"67890", 4_
"ABCDE"])) stop 7
365 !$omp target map(tofrom: var%f(2:3))
366 if (.not
. associated (var
%f
)) stop 9
367 if (size (var
%f
) /= 4) stop 10
368 if (any (var
%f(2:3) /= [33, 44])) stop 11
370 ! !$omp target map(tofrom: var%str4(2:2))
371 ! if (.not. associated (var%str4)) stop 15
372 ! if (len (var%str4) /= 5) stop 16
373 ! if (size (var%str4) /= 2) stop 17
374 ! if (var%str4(2) /= "Go!!!") stop 18
376 ! !$omp target map(tofrom: var%uni4(2:2))
377 ! if (.not. associated (var%uni4)) stop 15
378 ! if (len (var%uni4) /= 5) stop 16
379 ! if (size (var%uni4) /= 2) stop 17
380 ! if (var%uni4(2) /= 4_"Go!!!") stop 18
383 deallocate(var
%f
, var
%str4
, var
%uni4
)
386 ! Check mapping of NULL pointers
390 print '(g0)', '==== TESTCASE "eight" ===='
393 b
= 2, c
= cmplx(-1.0_8
, 2.0_8
,kind
=8), &
394 d
= [(-3*i
, i
= 1, 10)], &
396 str2
= ["12345", "67890", "ABCDE", "FGHIJ"], &
398 uni2
= [4_
"12345", 4_
"67890", 4_
"ABCDE", 4_
"FGHIJ"])
400 ! !$omp target map(tofrom: var%e, var%f, var%str3, var%str4, var%uni3, var%uni4)
401 !$omp target map(tofrom: var%e, var%str3, var%uni3)
402 if (associated (var
%e
)) stop 1
403 ! if (associated (var%f)) stop 2
404 if (associated (var
%str3
)) stop 3
405 ! if (associated (var%str4)) stop 4
406 if (associated (var
%uni3
)) stop 5
407 ! if (associated (var%uni4)) stop 6