1! Test 'allocatable' with OpenMP 'target' 'map' clauses.
2
3! See also '../libgomp.oacc-fortran/allocatable-1-1.f90'.
4
5! { dg-do run }
6! { dg-additional-options "-cpp" }
7! { dg-additional-options "-DMEM_SHARED" { target offload_device_shared_as } }
8
9program main
10  implicit none
11  integer, allocatable :: a, b, c, d, e
12
13  allocate (a)
14  a = 11
15
16  b = 25 ! Implicit allocation.
17
18  c = 52 ! Implicit allocation.
19
20  !No 'allocate (d)' here.
21
22  !No 'allocate (e)' here.
23
24  !$omp target map(to: a) map(tofrom: b, c, d) map(from: e)
25
26  if (.not. allocated (a)) stop 1
27  if (a .ne. 11) stop 2
28  a = 33
29
30  if (.not. allocated (b)) stop 3
31  if (b .ne. 25) stop 4
32
33  if (.not. allocated (c)) stop 5
34  if (c .ne. 52) stop 6
35  c = 10
36
37  if (allocated (d)) stop 7
38  d = 42 ! Implicit allocation, but on device only.
39  if (.not. allocated (d)) stop 8
40  deallocate (d) ! OpenMP requires must be "unallocated upon exit from the region".
41
42  if (allocated (e)) stop 9
43  e = 24 ! Implicit allocation, but on device only.
44  if (.not. allocated (e)) stop 10
45  deallocate (e) ! OpenMP requires must be "unallocated upon exit from the region".
46
47  !$omp end target
48
49  if (.not. allocated (a)) stop 20
50#ifdef MEM_SHARED
51  if (a .ne. 33) stop 21
52#else
53  if (a .ne. 11) stop 22
54#endif
55  deallocate (a)
56
57  if (.not. allocated (b)) stop 23
58  if (b .ne. 25) stop 24
59  deallocate (b)
60
61  if (.not. allocated (c)) stop 25
62  if (c .ne. 10) stop 26
63  deallocate (c)
64
65  if (allocated (d)) stop 27
66
67  if (allocated (e)) stop 28
68
69end program main
70