1 ! Check that 'map(alloc:' properly works with
2 ! - deferred-length character strings
3 ! - arrays with array descriptors
4 ! For those, the array descriptor / string length must be mapped with 'to:'
11 character(len
=11) :: ccstr(3:4)
12 character(len
=11,kind
=4) :: cc4str(3:7)
13 integer, pointer :: pc(:)
14 character(len
=:), pointer :: pcstr(:)
15 character(len
=:,kind
=4), pointer :: pc4str(:)
21 character(len
=11) :: clstr(-1:1)
22 character(len
=11,kind
=4) :: cl4str(0:3)
23 integer, pointer :: ip(:)
24 integer, allocatable
:: ia(:)
25 character(len
=:), pointer :: pstr(:)
26 character(len
=:), allocatable
:: astr(:)
27 character(len
=:,kind
=4), pointer :: p4str(:)
28 character(len
=:,kind
=4), allocatable
:: a4str(:)
31 allocate(character(len
=2) :: dt
%pcstr(2))
33 allocate(character(len
=3,kind
=4) :: dt
%pc4str(2:3))
35 allocate(ip(5), ia(8))
36 allocate(character(len
=2) :: pstr(-2:0))
37 allocate(character(len
=6) :: astr(3:5))
39 allocate(character(len
=3,kind
=4) :: p4str(2:4))
40 allocate(character(len
=7,kind
=4) :: a4str(-2:3))
45 !$omp target enter data map(alloc: dt%ic(3:5))
47 !$omp target map(alloc: dt%ic(3:5))
48 if (size(dt
%ic
) /= 4) error
stop
49 if (lbound(dt
%ic
, 1) /= 2) error
stop
50 if (ubound(dt
%ic
, 1) /= 5) error
stop
51 dt
%ic(3:5) = [33, 44, 55]
53 !$omp target exit data map(from: dt%ic(3:5))
54 if (size(dt
%ic
) /= 4) error
stop
55 if (lbound(dt
%ic
, 1) /= 2) error
stop
56 if (ubound(dt
%ic
, 1) /= 5) error
stop
57 if (any (dt
%ic
/= [22, 33, 44, 55])) error
stop
59 ! character(len=11) :: ccstr(3:4)
61 !$omp target enter data map(alloc: dt%ccstr(4:4))
62 dt
%ccstr(3) = "12345678901"
63 !$omp target map(alloc: dt%ccstr(4:4))
64 if (len(dt
%ccstr
) /= 11) error
stop
65 if (size(dt
%ccstr
) /= 2) error
stop
66 if (lbound(dt
%ccstr
, 1) /= 3) error
stop
67 if (ubound(dt
%ccstr
, 1) /= 4) error
stop
68 dt
%ccstr(4:4) = ["abcdefghijk"]
70 !$omp target exit data map(from: dt%ccstr(4:4))
71 if (len(dt
%ccstr
) /= 11) error
stop
72 if (size(dt
%ccstr
) /= 2) error
stop
73 if (lbound(dt
%ccstr
, 1) /= 3) error
stop
74 if (ubound(dt
%ccstr
, 1) /= 4) error
stop
75 if (any (dt
%ccstr
/= ["12345678901", "abcdefghijk"])) error
stop
78 ! character(len=11,kind=4) :: cc4str(3:7)
81 !$omp target enter data map(alloc: dt%cc4str(4:7))
82 dt
%cc4str(3) = 4_
"12345678901"
83 !$omp target map(alloc: dt%cc4str(4:7))
84 if (len(dt
%cc4str
) /= 11) error
stop
85 if (size(dt
%cc4str
) /= 5) error
stop
86 if (lbound(dt
%cc4str
, 1) /= 3) error
stop
87 if (ubound(dt
%cc4str
, 1) /= 7) error
stop
88 dt
%cc4str(4:7) = [4_
"abcdefghijk", &
89 4_
"qerftcea6ds", 4_
"a1f9g37ga4.", &
92 !$omp target exit data map(from: dt%cc4str(4:7))
93 if (len(dt
%cc4str
) /= 11) error
stop
94 if (size(dt
%cc4str
) /= 5) error
stop
95 if (lbound(dt
%cc4str
, 1) /= 3) error
stop
96 if (ubound(dt
%cc4str
, 1) /= 7) error
stop
97 if (dt
%cc4str(3) /= 4_
"12345678901") error
stop
98 if (dt
%cc4str(4) /= 4_
"abcdefghijk") error
stop
99 if (dt
%cc4str(5) /= 4_
"qerftcea6ds") error
stop
100 if (dt
%cc4str(6) /= 4_
"a1f9g37ga4.") error
stop
101 if (dt
%cc4str(7) /= 4_
"45ngwj56sj2") error
stop
103 ! integer, pointer :: pc(:)
106 ! libgomp: GOMP_target_enter_exit_data unhandled kind 0x00
108 !$omp target enter data map(alloc: dt%pc(2:5))
110 !$omp target map(alloc: dt%pc(2:5))
111 if (.not
. associated(dt
%pc
)) error
stop
112 if (size(dt
%pc
) /= 5) error
stop
113 if (lbound(dt
%pc
, 1) /= 1) error
stop
114 if (ubound(dt
%pc
, 1) /= 5) error
stop
115 dt
%pc(2:5) = [22, 33, 44, 55]
117 !$omp target exit data map(from: dt%pc(2:5))
118 if (.not
. associated(dt
%pc
)) error
stop
119 if (size(dt
%pc
) /= 5) error
stop
120 if (lbound(dt
%pc
, 1) /= 1) error
stop
121 if (ubound(dt
%pc
, 1) /= 5) error
stop
122 if (any (dt
%pc
/= [11, 22, 33, 44, 55])) error
stop
124 ! character(len=:), pointer :: pcstr(:)
125 ! allocate(character(len=2) :: dt%pcstr(2))
127 ! libgomp: GOMP_target_enter_exit_data unhandled kind 0x00
129 ! FIXME: Disabled befause of PR108837
131 !!$omp target enter data map(alloc: dt%pcstr(2:2))
133 !!$omp target map(alloc: dt%pcstr(2:2))
134 ! if (.not. associated(dt%pcstr)) error stop
135 ! if (len(dt%pcstr) /= 2) error stop
136 ! if (size(dt%pcstr) /= 2) error stop
137 ! if (lbound(dt%pcstr, 1) /= 1) error stop
138 ! if (ubound(dt%pcstr, 1) /= 2) error stop
139 ! dt%pcstr(2:2) = ["jk"]
141 !!$omp target exit data map(from: dt%pcstr(2:2))
142 !if (.not. associated(dt%pcstr)) error stop
143 !if (len(dt%pcstr) /= 2) error stop
144 !if (size(dt%pcstr) /= 2) error stop
145 !if (lbound(dt%pcstr, 1) /= 1) error stop
146 !if (ubound(dt%pcstr, 1) /= 2) error stop
147 !if (any (dt%pcstr /= ["01", "jk"])) error stop
150 ! character(len=:,kind=4), pointer :: pc4str(:)
151 ! allocate(character(len=3,kind=4) :: dt%pc4str(2:3))
153 ! libgomp: GOMP_target_enter_exit_data unhandled kind 0x00
154 ! structure element when other mapped elements from the same structure weren't mapped together with it
156 ! FIXME: Disabled befause of PR108837
158 !!$omp target enter data map(alloc: dt%pc4str(3:3))
159 !dt%pc4str(2) = 4_"456"
160 !!$omp target map(alloc: dt%pc4str(3:3))
161 ! if (.not. associated(dt%pc4str)) error stop
162 ! if (len(dt%pc4str) /= 3) error stop
163 ! if (size(dt%pc4str) /= 2) error stop
164 ! if (lbound(dt%pc4str, 1) /= 2) error stop
165 ! if (ubound(dt%pc4str, 1) /= 3) error stop
166 ! dt%pc4str(3:3) = [4_"tzu"]
168 !!$omp target exit data map(from: dt%pc4str(3:3))
169 !if (.not. associated(dt%pc4str)) error stop
170 !if (len(dt%pc4str) /= 3) error stop
171 !if (size(dt%pc4str) /= 2) error stop
172 !if (lbound(dt%pc4str, 1) /= 2) error stop
173 !if (ubound(dt%pc4str, 1) /= 3) error stop
174 !if (dt%pc4str(2) /= 4_"456") error stop
175 !if (dt%pc4str(3) /= 4_"tzu") error stop
177 ! libgomp: GOMP_target_enter_exit_data unhandled kind 0x01
181 !$omp target enter data map(alloc: ii(2:5))
183 !$omp target map(alloc: ii(2:5))
184 if (size(ii
) /= 5) error
stop
185 if (lbound(ii
, 1) /= 1) error
stop
186 if (ubound(ii
, 1) /= 5) error
stop
187 ii(2:5) = [-2, -3, -4, -5]
189 !$omp target exit data map(from: ii(2:5))
190 if (size(ii
) /= 5) error
stop
191 if (lbound(ii
, 1) /= 1) error
stop
192 if (ubound(ii
, 1) /= 5) error
stop
193 if (any (ii
/= [-1, -2, -3, -4, -5])) error
stop
196 ! character(len=11) :: clstr(-1:1)
198 !$omp target enter data map(alloc: clstr(0:1))
199 clstr(-1) = "12345678901"
200 !$omp target map(alloc: clstr(0:1))
201 if (len(clstr
) /= 11) error
stop
202 if (size(clstr
) /= 3) error
stop
203 if (lbound(clstr
, 1) /= -1) error
stop
204 if (ubound(clstr
, 1) /= 1) error
stop
205 clstr(0:1) = ["abcdefghijk", "ABCDEFGHIJK"]
207 !$omp target exit data map(from: clstr(0:1))
208 if (len(clstr
) /= 11) error
stop
209 if (size(clstr
) /= 3) error
stop
210 if (lbound(clstr
, 1) /= -1) error
stop
211 if (ubound(clstr
, 1) /= 1) error
stop
212 if (any (clstr
/= ["12345678901", "abcdefghijk", "ABCDEFGHIJK"])) error
stop
214 ! character(len=11,kind=4) :: cl4str(0:3)
216 !$omp target enter data map(alloc: cl4str(1:3))
217 cl4str(0) = 4_
"12345678901"
218 !$omp target map(alloc: cl4str(1:3))
219 if (len(cl4str
) /= 11) error
stop
220 if (size(cl4str
) /= 4) error
stop
221 if (lbound(cl4str
, 1) /= 0) error
stop
222 if (ubound(cl4str
, 1) /= 3) error
stop
223 cl4str(1:3) = [4_
"abcdefghijk", &
224 4_
"qerftcea6ds", 4_
"a1f9g37ga4."]
226 !$omp target exit data map(from: cl4str(1:3))
227 if (len(cl4str
) /= 11) error
stop
228 if (size(cl4str
) /= 4) error
stop
229 if (lbound(cl4str
, 1) /= 0) error
stop
230 if (ubound(cl4str
, 1) /= 3) error
stop
231 if (cl4str(0) /= 4_
"12345678901") error
stop
232 if (cl4str(1) /= 4_
"abcdefghijk") error
stop
233 if (cl4str(2) /= 4_
"qerftcea6ds") error
stop
234 if (cl4str(3) /= 4_
"a1f9g37ga4.") error
stop
237 ! allocate(ip(5), ia(8))
239 !$omp target enter data map(alloc: ip(2:5))
241 !$omp target map(alloc: ip(2:5))
242 if (.not
. associated(ip
)) error
stop
243 if (size(ip
) /= 5) error
stop
244 if (lbound(ip
, 1) /= 1) error
stop
245 if (ubound(ip
, 1) /= 5) error
stop
246 ip(2:5) = [22, 33, 44, 55]
248 !$omp target exit data map(from: ip(2:5))
249 if (.not
. associated(ip
)) error
stop
250 if (size(ip
) /= 5) error
stop
251 if (lbound(ip
, 1) /= 1) error
stop
252 if (ubound(ip
, 1) /= 5) error
stop
253 if (any (ip
/= [11, 22, 33, 44, 55])) error
stop
255 ! allocate(ip(5), ia(8))
257 !$omp target enter data map(alloc: ia(2:8))
259 !$omp target map(alloc: ia(2:8))
260 if (.not
. allocated(ia
)) error
stop
261 if (size(ia
) /= 8) error
stop
262 if (lbound(ia
, 1) /= 1) error
stop
263 if (ubound(ia
, 1) /= 8) error
stop
264 ia(2:8) = [2,3,4,5,6,7,8]
266 !$omp target exit data map(from: ia(2:8))
267 if (.not
. allocated(ia
)) error
stop
268 if (size(ia
) /= 8) error
stop
269 if (lbound(ia
, 1) /= 1) error
stop
270 if (ubound(ia
, 1) /= 8) error
stop
271 if (any (ia
/= [1,2,3,4,5,6,7,8])) error
stop
274 ! character(len=:), pointer :: pstr(:)
275 ! allocate(character(len=2) :: pstr(-2:0))
277 ! libgomp: nvptx_alloc error: out of memory
279 ! FIXME: array offset wrongly calculated as it uses TYPE_SIZE_UNIT, which is a SAVE_EXPR
281 !!$omp target enter data map(alloc: pstr(-1:0))
283 !!$omp target map(alloc: pstr(-1:0))
284 ! if (.not. associated(pstr)) error stop
285 ! if (len(pstr) /= 2) error stop
286 ! if (size(pstr) /= 3) error stop
287 ! if (lbound(pstr, 1) /= -2) error stop
288 ! if (ubound(pstr, 1) /= 0) error stop
289 ! pstr(-1:0) = ["jk", "aq"]
291 !!$omp target exit data map(from: pstr(-1:0))
292 !if (.not. associated(pstr)) error stop
293 !if (len(pstr) /= 2) error stop
294 !if (size(pstr) /= 3) error stop
295 !if (lbound(pstr, 1) /= -2) error stop
296 !if (ubound(pstr, 1) /= 0) error stop
297 !if (any (pstr /= ["01", "jk", "aq"])) error stop
300 ! character(len=:), allocatable :: astr(:)
301 ! allocate(character(len=6) :: astr(3:5))
303 ! libgomp: nvptx_alloc error: out of memory
306 !!$omp target enter data map(alloc: astr(4:5))
308 !!$omp target map(alloc: astr(4:5))
309 ! if (.not. allocated(astr)) error stop
310 ! if (len(astr) /= 6) error stop
311 ! if (size(astr) /= 3) error stop
312 ! if (lbound(astr, 1) /= 3) error stop
313 ! if (ubound(astr, 1) /= 5) error stop
314 !!! astr(4:5) = ["jk$D%S", "zutg47"]
316 !!!$omp target exit data map(from: astr(4:5))
317 !!if (.not. allocated(astr)) error stop
318 !!!if (len(astr) /= 6) error stop
319 !if (size(astr) /= 3) error stop
320 !if (lbound(astr, 1) /= 3) error stop
321 !if (ubound(astr, 1) /= 5) error stop
322 !if (any (astr /= ["01db45", "jk$D%S", "zutg47"])) error stop
325 ! character(len=:,kind=4), pointer :: p4str(:)
326 ! allocate(character(len=3,kind=4) :: p4str(2:4))
328 ! FAILS with value check
330 ! FIXME: array offset wrongly calculated as it uses TYPE_SIZE_UNIT, which is a SAVE_EXPR
332 !!$omp target enter data map(alloc: p4str(3:4))
334 !!$omp target map(alloc: p4str(3:4))
335 ! if (.not. associated(p4str)) error stop
336 ! if (len(p4str) /= 3) error stop
337 ! if (size(p4str) /= 3) error stop
338 ! if (lbound(p4str, 1) /= 2) error stop
339 ! if (ubound(p4str, 1) /= 4) error stop
340 ! p4str(3:4) = [4_"8af", 4_"A%F"]
342 !!$omp target exit data map(from: p4str(3:4))
343 !if (.not. associated(p4str)) error stop
344 !if (len(p4str) /= 3) error stop
345 !if (size(p4str) /= 3) error stop
346 !if (lbound(p4str, 1) /= 2) error stop
347 !if (ubound(p4str, 1) /= 4) error stop
348 !if (p4str(2) /= 4_"f85") error stop
349 !if (p4str(3) /= 4_"8af") error stop
350 !if (p4str(4) /= 4_"A%F") error stop
352 ! character(len=:,kind=4), allocatable :: a4str(:)
353 ! allocate(character(len=7,kind=4) :: a4str(-2:3))
355 ! libgomp: Trying to map into device [0x1027ba0..0x251050bb9c9ebba0) object when [0x7ffd026e6708..0x7ffd026e6710) is already mapped
357 ! FIXME: Disabled befause of PR108838
358 !!$omp target enter data map(alloc: a4str(-1:3))
359 !!a4str(-2) = 4_"sf456aq"
360 !!$omp target map(alloc: a4str(-1:3))
361 ! if (.not. allocated(a4str)) error stop
362 ! if (len(a4str) /= 7) error stop
363 ! if (size(a4str) /= 6) error stop
364 ! if (lbound(a4str, 1) /= -2) error stop
365 ! if (ubound(a4str, 1) /= 3) error stop
366 ! a4str(-1:3) = [4_"3dtzu24", 4_"_4fh7sm", 4_"=ff85s7", 4_"j=8af4d", 4_".,A%Fsz"]
368 !!$omp target exit data map(from: a4str(-1:3))
369 !if (.not. allocated(a4str)) error stop
370 !if (len(a4str) /= 7) error stop
371 !if (size(a4str) /= 6) error stop
372 !if (lbound(a4str, 1) /= -2) error stop
373 !if (ubound(a4str, 1) /= 3) error stop
374 !if (a4str(-2) /= 4_"sf456aq") error stop
375 !if (a4str(-1) /= 4_"3dtzu24") error stop
376 !if (a4str(0) /= 4_"_4fh7sm") error stop
377 !if (a4str(1) /= 4_"=ff85s7") error stop
378 !if (a4str(2) /= 4_"j=8af4d") error stop
379 !if (a4str(3) /= 4_".,A%Fsz") error stop
384 deallocate(dt
%pc4str
)