1program foo
2  integer :: i, j, k
3  integer :: a(10), c(10)
4  k = 2
5  a(:) = 0
6  call test1
7  call test2
8  do i = 1, 10
9    if (a(i) .ne. 10 * i) STOP 1
10  end do
11  !$omp parallel do reduction (+:c)
12  do i = 1, 10
13    c = c + a
14  end do
15  do i = 1, 10
16    if (c(i) .ne. 10 * a(i)) STOP 2
17  end do
18  !$omp parallel do lastprivate (j)
19  do j = 1, 10, k
20  end do
21  if (j .ne. 11) STOP 3
22contains
23  subroutine test1
24    integer :: i
25    integer :: b(10)
26    do i = 1, 10
27      b(i) = i
28    end do
29    c(:) = 0
30    !$omp parallel do reduction (+:a)
31    do i = 1, 10
32      a = a + b
33    end do
34  end subroutine test1
35  subroutine test2
36    !$omp parallel do lastprivate (j)
37    do j = 1, 10, k
38    end do
39    if (j .ne. 11) STOP 4
40  end subroutine test2
41end program foo
42