1! { dg-do run }
2! { dg-options "-O2" }
3
4  integer, save :: g
5  integer :: i
6  !$omp parallel
7  !$omp single
8    if (f1 (74) .ne. 63 + 4) STOP 1
9    g = 77
10    call f2
11    !$omp taskwait
12    if (g .ne. 63 + 9) STOP 2
13    if (f3 (7_8, 11_8, 2_8) .ne. 11 * 7 + 13) STOP 3
14    if (f4 (0_8, 31_8, 16_8, 46_8, 1_8, 2_8, 73) .ne. 32 + 5 * 48 &
15&       + 11 * 31 + 17 * 46) STOP 4
16  !$omp end single
17  !$omp end parallel
18contains
19  function f1 (y)
20    integer, intent(in) :: y
21    integer :: i, f1, x
22    x = y
23    !$omp taskloop firstprivate(x)lastprivate(x)
24    do i = 0, 63
25      if (x .ne. 74) STOP 5
26      if (i .eq. 63) then
27        x = i + 4
28      end if
29    end do
30    f1 = x
31  end function f1
32  subroutine f2 ()
33    integer :: i
34    !$omp taskloop firstprivate(g)lastprivate(g)nogroup
35    do i = 0, 63
36      if (g .ne. 77) STOP 6
37      if (i .eq. 63) then
38        g = i + 9
39      end if
40    end do
41  end subroutine f2
42  function f3 (a, b, c)
43    integer(kind=8), intent(in) :: a, b, c
44    integer(kind=8) :: i, f3
45    integer :: l
46    !$omp taskloop default(none) lastprivate (i, l)
47    do i = a, b, c
48      l = i
49    end do
50    !$omp end taskloop
51    f3 = l * 7 + i
52  end function f3
53  function f4 (a, b, c, d, e, f, m)
54    integer(kind=8), intent(in) :: a, b, c, d, e, f
55    integer(kind=8) :: i, j, f4
56    integer, intent(in) :: m
57    integer :: l, k
58    k = m
59    !$omp taskloop default (none) collapse (2) firstprivate (k) &
60    !$omp & lastprivate (i, j, k, l)
61    do i = a, b, e
62      do j = c, d, f
63        if (k .ne. 73) STOP 7
64        if (i .eq. 31 .and. j .eq. 46) then
65          k = i
66        end if
67        l = j
68      end do
69    end do
70    f4 = i + 5 * j + 11 * k + 17 * l
71  end function f4
72end
73