program foo integer :: i, j, k integer :: a(10), c(10) k = 2 a(:) = 0 call test1 call test2 do i = 1, 10 if (a(i) .ne. 10 * i) call abort end do !$omp parallel do reduction (+:c) do i = 1, 10 c = c + a end do do i = 1, 10 if (c(i) .ne. 10 * a(i)) call abort end do !$omp parallel do lastprivate (j) do j = 1, 10, k end do if (j .ne. 11) call abort contains subroutine test1 integer :: i integer :: b(10) do i = 1, 10 b(i) = i end do c(:) = 0 !$omp parallel do reduction (+:a) do i = 1, 10 a = a + b end do end subroutine test1 subroutine test2 !$omp parallel do lastprivate (j) do j = 1, 10, k end do if (j .ne. 11) call abort end subroutine test2 end program foo