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) :: y
116  call foo (y)
117contains
118  subroutine foo (y)
119    use m
120    type (dt) :: x, y, z(-3:-3,2:3)
121    logical, parameter :: F = .false.
122    logical, parameter :: T = .true.
123    logical :: l
124    call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
125    call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
126    call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
127    call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
128!$omp parallel private (x, y, z)
129    call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
130    call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
131    call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
132    call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
133    call alloc_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
134    call ver_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
135    call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
136    call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
137    call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
138    call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
139    call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
140    call ver_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
141!$omp end parallel
142    call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
143    call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
144    call ver_dt (y, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
145    call alloc_dt (y, 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
146    call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
147    call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
148    call ver_dt (z(-3,3), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
149    call alloc_dt (z(-3,3), 14, T, 3, 4, F, T, 1, 1, 2, 4, T)
150!$omp parallel private (x, y, z)
151    call ver_dt (x, 0, T, -3, -1, T, T, -1, -1, 2, 3, T)
152    call ver_dt (y, 0, T, 3, 4, F, T, 1, 1, 2, 4, T)
153    deallocate (x%h, x%k)
154    deallocate (y%h)
155    allocate (y%k)
156    call ver_dt (z(-3,2), 0, T, -3, -1, T, T, -1, -1, 2, 3, T)
157    call ver_dt (z(-3,3), 0, T, 3, 4, F, T, 1, 1, 2, 4, T)
158    deallocate (z(-3,2)%h, z(-3,2)%k)
159    deallocate (z(-3,3)%h)
160    allocate (z(-3,3)%k)
161!$omp end parallel
162    call alloc_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
163    call alloc_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
164    call alloc_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
165    call alloc_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
166!$omp parallel firstprivate (x, y, z)
167    call ver_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
168    call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
169    call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
170    call ver_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
171    call alloc_dt (y, 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
172    call ver_dt (y, 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
173    call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
174    call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
175    call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
176    call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
177    call alloc_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
178    call ver_dt (z(-3,3), 4, T, 3, 4, T, T, 1, 1, 2, 4, T)
179!$omp end parallel
180    call ver_dt (x, 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
181    call alloc_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
182    call ver_dt (y, 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
183    call alloc_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
184    call ver_dt (z(-3,2), 5, T, 1, 2, F, T, 2, 3, -2, -2, F)
185    call alloc_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
186    call ver_dt (z(-3,3), 15, F, 0, 0, T, T, 2, 2, 2, 2, T)
187    call alloc_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
188!$omp parallel firstprivate (x, y, z)
189    call ver_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
190    call alloc_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
191    call ver_dt (x, 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
192    call ver_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
193    call alloc_dt (y, 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
194    call ver_dt (y, 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
195    call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
196    call alloc_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
197    call ver_dt (z(-3,2), 4, T, -3, -1, T, T, -1, -1, 2, 3, T)
198    call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
199    call alloc_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
200    call ver_dt (z(-3,3), 17, T, 1, 2, F, T, 2, 2, 3, 3, F)
201!$omp end parallel
202    call ver_dt (x, 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
203    call ver_dt (y, 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
204    call alloc_dt (y, 18, T, 0, 1, T, T, 0, 1, 0, 1, T)
205    call ver_dt (z(-3,2), 4, F, 0, 0, F, F, 0, 0, 0, 0, F)
206    call ver_dt (z(-3,3), 16, F, 0, 0, F, F, 0, 0, 0, 0, F)
207    call alloc_dt (z(-3,3), 18, T, 0, 1, T, T, 0, 1, 0, 1, T)
208    l = F
209!$omp parallel sections lastprivate (x, y, z) firstprivate (l)
210!$omp section
211    if (l) then
212      call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
213      call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
214      call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
215      call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
216    else
217      call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
218      call ver_dt (y, 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
219      call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
220      call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
221    end if
222    l = T
223    call alloc_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
224    call ver_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
225    call alloc_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
226    call ver_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
227    call alloc_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
228    call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
229    call alloc_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
230    call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
231!$omp section
232    if (l) then
233      call ver_dt (x, 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
234      call ver_dt (y, 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
235      call ver_dt (z(-3,2), 7, T, 1, 1, T, T, 1, 2, 3, 3, T)
236      call ver_dt (z(-3,3), 20, T, 0, 0, F, T, 2, 2, 3, 4, F)
237    else
238      call ver_dt (x, 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
239      call ver_dt (y, 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
240      call ver_dt (z(-3,2), 0, F, 0, 0, F, F, 0, 0, 0, 0, F)
241      call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 0, 1, 0, 1, T)
242    end if
243    l = T
244    call alloc_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
245    call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
246    call alloc_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
247    call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
248    call alloc_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
249    call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
250    call alloc_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
251    call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
252!$omp section
253!$omp end parallel sections
254    call ver_dt (x, 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
255    call ver_dt (y, 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
256    call ver_dt (z(-3,2), 9, T, 1, 1, F, F, 0, 0, 0, 0, T)
257    call ver_dt (z(-3,3), 21, F, 0, 0, T, T, 1, 2, 3, 4, T)
258!$omp parallel sections lastprivate (x, y, z) firstprivate (l)
259!$omp section
260    if (l) then
261      call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
262      call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
263      call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
264      call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
265    else
266      call ver_dt (x, 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
267      call ver_dt (y, 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
268      call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
269      call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
270    end if
271    l = T
272    call alloc_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
273    call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
274    call alloc_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
275    call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
276    call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
277    call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
278    call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
279    call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
280!$omp section
281    if (l) then
282      call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
283      call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
284      call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
285      call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
286    else
287      call ver_dt (x, 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
288      call ver_dt (y, 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
289      call ver_dt (z(-3,2), 0, T, 1, 1, F, F, 0, 0, 0, 0, T)
290      call ver_dt (z(-3,3), 0, F, 0, 0, T, T, 1, 2, 3, 4, T)
291    end if
292    l = T
293    call alloc_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
294    call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
295    call alloc_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
296    call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
297    call alloc_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
298    call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
299    call alloc_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
300    call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
301!$omp section
302!$omp end parallel sections
303    call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
304    call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
305    call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
306    call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
307!$omp parallel private (x, y, z)
308    call ver_dt (x, 0, F, 0, 0, T, T, -1, -1, -1, -1, T)
309    call ver_dt (y, 0, T, 0, 1, T, T, 2, 2, 2, 2, F)
310    call ver_dt (z(-3,2), 0, F, 0, 0, T, T, -1, -1, -1, -1, T)
311    call ver_dt (z(-3,3), 0, T, 0, 1, T, T, 2, 2, 2, 2, F)
312!$omp single
313    call alloc_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
314    call alloc_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
315    call alloc_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
316    call alloc_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
317!$omp end single copyprivate (x, y, z)
318    call ver_dt (x, 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
319    call ver_dt (y, 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
320    call ver_dt (z(-3,2), 3, F, 0, 0, T, T, 0, 1, 0, 1, F)
321    call ver_dt (z(-3,3), 22, T, 5, 5, F, T, 2, 3, 2, 2, T)
322!$omp end parallel
323    call ver_dt (x, 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
324    call ver_dt (y, 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
325    call ver_dt (z(-3,2), 5, F, 0, 0, T, T, -1, -1, -1, -1, T)
326    call ver_dt (z(-3,3), 23, T, 0, 1, T, T, 2, 2, 2, 2, F)
327  end subroutine foo
328end
329