1! { dg-do compile  { target skip-all-targets } }
2! Only used by taskloop-5-a.f90
3! To avoid inlining
4
5module m2
6  use m_taskloop5
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(strict: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 3
24        w(k) = i
25      end if
26      j = j + 1
27      u(k) = j
28    end do
29end
30
31subroutine num_tasks (a, b, c, d)
32  integer, value :: a, b, c, d
33  integer :: i, j, k
34  j = 0
35  k = 0
36  !$omp taskloop firstprivate (j, k) num_tasks(strict:d)
37    do i = a, b - 1, c
38      if (j == 0) then
39        !$omp atomic capture
40          k = v
41          v = v + 1
42        !$omp end atomic
43        if (k >= 64) &
44          stop 4
45        w(k) = i
46      end if
47      j = j + 1
48      u(k) = j
49    end do
50end
51end module
52
53program main
54  use m2
55  implicit none (external, type)
56  !$omp parallel
57    !$omp single
58      block
59        integer :: min_iters, max_iters, ntasks, sep
60
61        ! If grainsize is present and has strict modifier, # of task loop iters is == grainsize,
62        ! except that it can be smaller on the last task.
63        if (test (0, 79, 1, 17, grainsize, ntasks, min_iters, max_iters, sep) /= 79) &
64          stop 5
65        if (ntasks /= 5 .or. min_iters /= 11 .or. max_iters /= 17 .or. sep /= 4) &
66          stop
67        if (test (-49, 2541, 7, 28, grainsize, ntasks, min_iters, max_iters, sep) /= 370) &
68          stop 6
69        if (ntasks /= 14 .or. min_iters /= 6 .or. max_iters /= 28 .or. sep /= 13) &
70          stop
71        if (test (7, 21, 2, 15, grainsize, ntasks, min_iters, max_iters, sep) /= 7) &
72          stop 7
73        if (ntasks /= 1 .or. min_iters /= 7 .or. max_iters /= 7 .or. sep /= 1) &
74          stop 8
75        !  If num_tasks is present, # of tasks is min (# of loop iters, num_tasks)
76        !  and each task has at least one iteration.  If strict modifier is present,
77        !  first set of tasks has ceil (# of loop iters / num_tasks) iterations,
78        !  followed by possibly empty set of tasks with floor (# of loop iters / num_tasks)
79        !  iterations.
80        if (test (-51, 2500, 48, 9, num_tasks, ntasks, min_iters, max_iters, sep) /= 54) &
81          stop 9
82        if (ntasks /= 9 .or. min_iters /= 6 .or. max_iters /= 6 .or. sep /= 9) &
83          stop 10
84        if (test (0, 57, 1, 9, num_tasks, ntasks, min_iters, max_iters, sep) /= 57) &
85          stop 11
86        if (ntasks /= 9 .or. min_iters /= 6 .or. max_iters /= 7 .or. sep /= 3) &
87          stop 12
88        if (test (0, 25, 2, 17, num_tasks, ntasks, min_iters, max_iters, sep) /= 13) &
89          stop 13
90        if (ntasks /= 13 .or. min_iters /= 1 .or. max_iters /= 1 .or. sep /= 13) &
91          stop 14
92      end block
93    !$omp end single
94  !$omp end parallel
95end program
96