1! { dg-do run }
2! Don't cycle by default through all options, just test -O0 and -O2,
3! as this is quite large test.
4! { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } }
5
6module m
7  type dl
8    integer :: a, b
9    integer, allocatable :: c(:,:)
10    integer :: d, e
11    integer, allocatable :: f
12  end type
13  type dt
14    integer :: g
15    type (dl), allocatable :: h(:)
16    integer :: i
17    type (dl) :: j(2, 2)
18    type (dl), allocatable :: k
19  end type
20contains
21  subroutine ver_dl (obj, val, c, cl1, cu1, cl2, cu2, f)
22    type (dl), intent (in) :: obj
23    integer, intent (in) :: val, cl1, cu1, cl2, cu2
24    logical, intent (in) :: c, f
25    if ((c .neqv. allocated (obj%c)) .or. (f .neqv. allocated (obj%f))) stop 1
26    if (c) then
27      if (lbound (obj%c, 1) /= cl1 .or. ubound (obj%c, 1) /= cu1) stop 2
28      if (lbound (obj%c, 2) /= cl2 .or. ubound (obj%c, 2) /= cu2) stop 3
29    end if
30    if (val /= 0) then
31      if (obj%a /= val .or. obj%b /= val) stop 4
32      if (obj%d /= val .or. obj%e /= val) stop 5
33      if (c) then
34        if (any (obj%c /= val)) stop 6
35      end if
36      if (f) then
37        if (obj%f /= val) stop 7
38      end if
39    end if
40  end subroutine ver_dl
41  subroutine ver_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f)
42    type (dt), intent (in) :: obj
43    integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2
44    logical, intent (in) :: h, k, c, f
45    integer :: i, j
46    if ((h .neqv. allocated (obj%h)) .or. (k .neqv. allocated (obj%k))) stop 8
47    if (h) then
48      if (lbound (obj%h, 1) /= hl .or. ubound (obj%h, 1) /= hu) stop 9
49      do i = hl, hu
50        call ver_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f)
51      end do
52    end if
53    do i = 1, 2
54      do j = 1, 2
55        call ver_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f)
56      end do
57    end do
58    if (k) call ver_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f)
59    if (val /= 0) then
60      if (obj%g /= val .or. obj%i /= val) stop 10
61    end if
62  end subroutine ver_dt
63  subroutine alloc_dl (obj, val, c, cl1, cu1, cl2, cu2, f)
64    type (dl), intent (inout) :: obj
65    integer, intent (in) :: val, cl1, cu1, cl2, cu2
66    logical, intent (in) :: c, f
67    if (val /= 0) then
68      obj%a = val
69      obj%b = val
70      obj%d = val
71      obj%e = val
72    end if
73    if (allocated (obj%c)) deallocate (obj%c)
74    if (c) then
75      allocate (obj%c(cl1:cu1, cl2:cu2))
76      if (val /= 0) obj%c = val
77    end if
78    if (f) then
79      if (.not.allocated (obj%f)) allocate (obj%f)
80      if (val /= 0) obj%f = val
81    else
82      if (allocated (obj%f)) deallocate (obj%f)
83    end if
84  end subroutine alloc_dl
85  subroutine alloc_dt (obj, val, h, hl, hu, k, c, cl1, cu1, cl2, cu2, f)
86    type (dt), intent (inout) :: obj
87    integer, intent (in) :: val, hl, hu, cl1, cu1, cl2, cu2
88    logical, intent (in) :: h, k, c, f
89    integer :: i, j
90    if (val /= 0) then
91      obj%g = val
92      obj%i = val
93    end if
94    if (allocated (obj%h)) deallocate (obj%h)
95    if (h) then
96      allocate (obj%h(hl:hu))
97      do i = hl, hu
98        call alloc_dl (obj%h(i), val, c, cl1, cu1, cl2, cu2, f)
99      end do
100    end if
101    do i = 1, 2
102      do j = 1, 2
103        call alloc_dl (obj%j(i, j), val, c, cl1, cu1, cl2, cu2, f)
104      end do
105    end do
106    if (k) then
107      if (.not.allocated (obj%k)) allocate (obj%k)
108      call alloc_dl (obj%k, val, c, cl1, cu1, cl2, cu2, f)
109    else
110      if (allocated (obj%k)) deallocate (obj%k)
111    end if
112  end subroutine alloc_dt
113end module m
114  use m
115  type (dt), allocatable :: z(:,:)
116  type (dt) :: y(2:3)
117  call foo (y, z, 4)
118contains
119  subroutine foo (y, z, n)
120    use m
121    integer :: n
122    type (dt) :: x(2:n), y(3:)
123    type (dt), allocatable :: z(:,:)
124    logical, parameter :: F = .false.
125    logical, parameter :: T = .true.
126    logical :: l
127    if (lbound (x, 1) /= 2 .or. ubound (x, 1) /= 4) stop 11
128    if (lbound (y, 1) /= 3 .or. ubound (y, 1) /= 4) stop 12
129    call ver_dt (x(2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
130    call ver_dt (x(n), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
131    call ver_dt (y(3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
132    call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
133!$omp parallel private (z)
134    if (allocated (z)) stop 13
135!$omp end parallel
136!$omp parallel firstprivate (z)
137    if (allocated (z)) stop 14
138!$omp end parallel
139    l = F
140!$omp parallel sections lastprivate (z) firstprivate (l)
141!$omp section
142    if (.not. l) then
143      if (allocated (z)) stop 15
144    end if
145!$omp section
146    if (.not. l) then
147      if (allocated (z)) stop 16
148    end if
149    allocate (z(-3:-3,2:3))
150    call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
151    call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
152    call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
153    call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
154!$omp section
155!$omp end parallel sections
156    if (.not.allocated (z)) stop 17
157    if (lbound (z, 1) /= -3 .or. ubound (z, 1) /= -3) stop 18
158    if (lbound (z, 2) /= 2 .or. ubound (z, 2) /= 3) stop 19
159    call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
160    call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
161    call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
162    call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
163    call alloc_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
164    call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
165    call alloc_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
166    call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
167!$omp parallel private (x, y, z)
168    call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
169    call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
170    call ver_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
171    call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
172    call alloc_dt (y(4), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
173    call ver_dt (y(4), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
174    call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
175    call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
176    call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
177    call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
178    call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
179    call ver_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
180!$omp end parallel
181    call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
182    call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
183    call ver_dt (y(4), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
184    call alloc_dt (y(4), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
185    call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
186    call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
187    call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
188    call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
189!$omp parallel private (x, y, z)
190    call ver_dt (x(n - 1), 0, T, -3, -1, T, T, -1, -1, 2, 3, T)
191    call ver_dt (y(4), 0, T, 3, 4, F, T, 1, 1, 2, 4, T)
192    deallocate (x(n - 1)%h, x(n - 1)%k)
193    deallocate (y(4)%h)
194    allocate (y(4)%k)
195    call ver_dt (z(-3,2), 0, T, -3, -1, T, T, -1, -1, 2, 3, T)
196    call ver_dt (z(-3,3), 0, T, 3, 4, F, T, 1, 1, 2, 4, T)
197    deallocate (z(-3,2)%h, z(-3,2)%k)
198    deallocate (z(-3,3)%h)
199    allocate (z(-3,3)%k)
200!$omp end parallel
201    call alloc_dt (x(n - 1), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
202    call alloc_dt (y(4), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
203    call alloc_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
204    call alloc_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
205!$omp parallel firstprivate (x, y, z)
206    if (lbound (x, 1) /= 2 .or. ubound (x, 1) /= 4) stop 20
207    if (lbound (y, 1) /= 3 .or. ubound (y, 1) /= 4) stop 21
208    call ver_dt (x(n - 1), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
209    call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
210    call ver_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
211    call ver_dt (y(4), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
212    call alloc_dt (y(4), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
213    call ver_dt (y(4), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
214    call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
215    call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
216    call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
217    call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
218    call alloc_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
219    call ver_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
220!$omp end parallel
221    call ver_dt (x(n - 1), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
222    call alloc_dt (x(n - 1), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
223    call ver_dt (y(4), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
224    call alloc_dt (y(4), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
225    call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
226    call alloc_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
227    call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
228    call alloc_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
229!$omp parallel firstprivate (x, y, z)
230    call ver_dt (x(n - 1), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
231    call alloc_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
232    call ver_dt (x(n - 1), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
233    call ver_dt (y(4), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
234    call alloc_dt (y(4), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
235    call ver_dt (y(4), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
236    call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
237    call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
238    call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
239    call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
240    call alloc_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
241    call ver_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
242!$omp end parallel
243    call ver_dt (x(n - 1), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
244    call ver_dt (y(4), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
245    call alloc_dt (y(4), 18, T, 0, 1, T, T, 0, 1, 0, 1, T)
246    call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
247    call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
248    call alloc_dt (z(-3,3), 18, T, 0, 1, T, T, 0, 1, 0, 1, T)
249    l = F
250!$omp parallel sections lastprivate (x, y, z) firstprivate (l)
251!$omp section
252    if (l) then
253      call ver_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
254      call ver_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
255      call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
256      call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
257    else
258      call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
259      call ver_dt (y(4), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
260      call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
261      call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
262    end if
263    l = T
264    call alloc_dt (x(n - 1), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
265    call ver_dt (x(n - 1), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
266    call alloc_dt (y(4), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
267    call ver_dt (y(4), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
268    call alloc_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
269    call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
270    call alloc_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
271    call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
272!$omp section
273    if (l) then
274      call ver_dt (x(n - 1), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
275      call ver_dt (y(4), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
276      call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
277      call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
278    else
279      call ver_dt (x(n - 1), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
280      call ver_dt (y(4), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
281      call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
282      call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
283    end if
284    l = T
285    call alloc_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
286    call ver_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
287    call alloc_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
288    call ver_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
289    call alloc_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
290    call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
291    call alloc_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
292    call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
293!$omp section
294!$omp end parallel sections
295    call ver_dt (x(n - 1), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
296    call ver_dt (y(4), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
297    call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
298    call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
299!$omp parallel sections lastprivate (x, y, z) firstprivate (l)
300!$omp section
301    if (l) then
302      call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
303      call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
304      call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
305      call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
306    else
307      call ver_dt (x(n - 1), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
308      call ver_dt (y(4), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
309      call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
310      call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
311    end if
312    l = T
313    call alloc_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
314    call ver_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
315    call alloc_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
316    call ver_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
317    call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
318    call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
319    call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
320    call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
321!$omp section
322    if (l) then
323      call ver_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
324      call ver_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
325      call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
326      call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
327    else
328      call ver_dt (x(n - 1), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
329      call ver_dt (y(4), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
330      call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
331      call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
332    end if
333    l = T
334    call alloc_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
335    call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
336    call alloc_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
337    call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
338    call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
339    call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
340    call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
341    call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
342!$omp section
343!$omp end parallel sections
344    call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
345    call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
346    call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
347    call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
348!$omp parallel private (x, y, z)
349    call ver_dt (x(n - 1), 0, F, 0, 0, T, T, -1, -1, -1, -1, T)
350    call ver_dt (y(4), 0, T, 0, 1, T, T, 2, 2, 2, 2, F)
351    call ver_dt (z(-3,2), 0, F, 0, 0, T, T, -1, -1, -1, -1, T)
352    call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 2, 2, 2, 2, F)
353!$omp single
354    call alloc_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
355    call alloc_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
356    call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
357    call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
358!$omp end single copyprivate (x, y, z)
359    call ver_dt (x(n - 1), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
360    call ver_dt (y(4), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
361    call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
362    call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
363!$omp end parallel
364    call ver_dt (x(n - 1), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
365    call ver_dt (y(4), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
366    call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
367    call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
368    call ver_dt (x(2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
369    call ver_dt (x(n), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
370    call ver_dt (y(3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
371  end subroutine foo
372end
373