1! { dg-do run }
2! { dg-options "-O2" }
3! { dg-additional-sources taskloop-5-a.f90 }
4
5module m_taskloop5
6  implicit none (type, external)
7  integer :: u(0:63), v, w(0:63)
8
9contains
10integer function test (a, b, c, d, fn, num_tasks, min_iters, max_iters, sep)
11  integer, value :: a, b, c, d
12  interface
13    subroutine fn (n1, n2, n3, n4)
14      integer, value :: n1, n2, n3, n4
15    end
16  end interface
17  integer :: num_tasks, min_iters, max_iters, sep
18  integer :: i, j, t
19
20  t = 0
21  u = 0
22  v = 0
23  call fn (a, b, c, d)
24  min_iters = 0
25  max_iters = 0
26  num_tasks = v
27  sep = v
28  if (v /= 0) then
29    min_iters = u(0)
30    max_iters = u(0)
31    t = u(0)
32    do i = 1, v - 1
33      if (min_iters > u(i)) &
34        min_iters = u(i)
35      if (max_iters < u(i)) &
36        max_iters = u(i)
37      t = t + u(i)
38    end do
39
40    if (min_iters /= max_iters) then
41      do i = 0, v - 2
42        block
43          integer :: min_idx
44          min_idx = i
45          do j = i + 1, v - 1
46            if (w(min_idx) > w(j)) &
47              min_idx = j
48          end do
49          if (min_idx /= i) then
50            block
51              integer tem
52              tem = u(i)
53              u(i) = u(min_idx)
54              u(min_idx) = tem
55              tem = w(i)
56              w(i) = w(min_idx)
57              w(min_idx) = tem
58            end block
59          end if
60        end block
61      end do
62      if (u(0) /= max_iters) &
63        stop 1
64      do i = 1, v - 1
65        if (u(i) /= u(i - 1)) then
66          if (sep /= v .or. u(i) /= min_iters) &
67            stop 2
68          sep = i;
69        end if
70      end do
71    end if
72  end if
73  test = t
74end
75end module
76