1! { dg-do compile  { target skip-all-targets } }
2! Only used by taskloop-4.f90
3! To avoid inlining
4
5module m2
6  use m_taskloop4
7  implicit none (external, type)
8contains
9
10subroutine grainsize (a, b, c, d)
11  integer, value :: a, b, c, d
12  integer :: i, j, k
13  j = 0
14  k = 0
15  !$omp taskloop firstprivate (j, k) grainsize(d)
16    do i = a, b - 1, c
17      if (j == 0) then
18        !$omp atomic capture
19          k = v
20          v = v + 1
21        !$omp end atomic
22        if (k >= 64) &
23          stop 1
24      end if
25      j = j + 1
26      u(k) = j
27    end do
28end
29
30subroutine num_tasks (a, b, c, d)
31  integer, value :: a, b, c, d
32  integer :: i, j, k
33  j = 0
34  k = 0
35  !$omp taskloop firstprivate (j, k) num_tasks(d)
36    do i = a, b - 1, c
37      if (j == 0) then
38	!$omp atomic capture
39          k = v
40          v = v + 1
41        !$omp end atomic
42        if (k >= 64) &
43          stop 2
44      end if
45      j = j + 1
46      u(k) = j
47    end do
48  end
49end module
50
51program main
52  use m2
53  implicit none (external, type)
54  !$omp parallel
55    !$omp single
56      block
57        integer :: min_iters, max_iters, ntasks
58
59        ! If grainsize is present, # of task loop iters is >= grainsize && < 2 * grainsize,
60        ! unless # of loop iterations is smaller than grainsize.
61        if (test (0, 79, 1, 17, grainsize, ntasks, min_iters, max_iters) /= 79) &
62          stop 3
63        if (min_iters < 17 .or. max_iters >= 17 * 2) &
64          stop 4
65        if (test (-49, 2541, 7, 28, grainsize, ntasks, min_iters, max_iters) /= 370) &
66          stop 5
67        if (min_iters < 28 .or. max_iters >= 28 * 2) &
68          stop 6
69        if (test (7, 21, 2, 15, grainsize, ntasks, min_iters, max_iters) /= 7) &
70          stop 7
71        if (ntasks /= 1 .or. min_iters /= 7 .or. max_iters /= 7) &
72          stop 8
73        ! If num_tasks is present, # of tasks is min (# of loop iters, num_tasks)
74        ! and each task has at least one iteration.
75        if (test (-51, 2500, 48, 9, num_tasks, ntasks, min_iters, max_iters) /= 54) &
76          stop 9
77        if (ntasks /= 9) &
78          stop 10
79        if (test (0, 25, 2, 17, num_tasks, ntasks, min_iters, max_iters) /= 13) &
80          stop 11
81        if (ntasks /= 13) &
82          stop 12
83      end block
84    !$omp end single
85  !$omp end parallel
86end program
87