| program lastprivate |
| integer :: i, k |
| common /c/ i, k |
| !$omp parallel num_threads (4) |
| call test1 |
| !$omp end parallel |
| if (i .ne. 21 .or. k .ne. 20) call abort |
| !$omp parallel num_threads (4) |
| call test2 |
| !$omp end parallel |
| if (i .ne. 64 .or. k .ne. 61) call abort |
| !$omp parallel num_threads (4) |
| call test3 |
| !$omp end parallel |
| if (i .ne. 14 .or. k .ne. 11) call abort |
| call test4 |
| call test5 |
| call test6 |
| call test7 |
| call test8 |
| call test9 |
| call test10 |
| call test11 |
| call test12 |
| contains |
| subroutine test1 |
| integer :: i, k |
| common /c/ i, k |
| !$omp do lastprivate (i, k) |
| do i = 1, 20 |
| k = i |
| end do |
| end subroutine test1 |
| subroutine test2 |
| integer :: i, k |
| common /c/ i, k |
| !$omp do lastprivate (i, k) |
| do i = 7, 61, 3 |
| k = i |
| end do |
| end subroutine test2 |
| function ret3 () |
| integer :: ret3 |
| ret3 = 3 |
| end function ret3 |
| subroutine test3 |
| integer :: i, k |
| common /c/ i, k |
| !$omp do lastprivate (i, k) |
| do i = -10, 11, ret3 () |
| k = i |
| end do |
| end subroutine test3 |
| subroutine test4 |
| integer :: j, l |
| !$omp parallel do lastprivate (j, l) num_threads (4) |
| do j = 1, 20 |
| l = j |
| end do |
| if (j .ne. 21 .or. l .ne. 20) call abort |
| end subroutine test4 |
| subroutine test5 |
| integer :: j, l |
| l = 77 |
| !$omp parallel do lastprivate (j, l) num_threads (4) firstprivate (l) |
| do j = 7, 61, 3 |
| l = j |
| end do |
| if (j .ne. 64 .or. l .ne. 61) call abort |
| end subroutine test5 |
| subroutine test6 |
| integer :: j, l |
| !$omp parallel do lastprivate (j, l) num_threads (4) |
| do j = -10, 11, ret3 () |
| l = j |
| end do |
| if (j .ne. 14 .or. l .ne. 11) call abort |
| end subroutine test6 |
| subroutine test7 |
| integer :: i, k |
| common /c/ i, k |
| !$omp parallel do lastprivate (i, k) num_threads (4) |
| do i = 1, 20 |
| k = i |
| end do |
| if (i .ne. 21 .or. k .ne. 20) call abort |
| end subroutine test7 |
| subroutine test8 |
| integer :: i, k |
| common /c/ i, k |
| !$omp parallel do lastprivate (i, k) num_threads (4) |
| do i = 7, 61, 3 |
| k = i |
| end do |
| if (i .ne. 64 .or. k .ne. 61) call abort |
| end subroutine test8 |
| subroutine test9 |
| integer :: i, k |
| common /c/ i, k |
| k = 77 |
| !$omp parallel do lastprivate (i, k) num_threads (4) firstprivate (k) |
| do i = -10, 11, ret3 () |
| k = i |
| end do |
| if (i .ne. 14 .or. k .ne. 11) call abort |
| end subroutine test9 |
| subroutine test10 |
| integer :: i, k |
| common /c/ i, k |
| !$omp parallel num_threads (4) |
| !$omp do lastprivate (i, k) |
| do i = 1, 20 |
| k = i |
| end do |
| !$omp end parallel |
| if (i .ne. 21 .or. k .ne. 20) call abort |
| end subroutine test10 |
| subroutine test11 |
| integer :: i, k |
| common /c/ i, k |
| !$omp parallel num_threads (4) |
| !$omp do lastprivate (i, k) |
| do i = 7, 61, 3 |
| k = i |
| end do |
| !$omp end parallel |
| if (i .ne. 64 .or. k .ne. 61) call abort |
| end subroutine test11 |
| subroutine test12 |
| integer :: i, k |
| common /c/ i, k |
| k = 77 |
| !$omp parallel num_threads (4) |
| !$omp do lastprivate (i, k) firstprivate (k) |
| do i = -10, 11, ret3 () |
| k = i |
| end do |
| !$omp end parallel |
| if (i .ne. 14 .or. k .ne. 11) call abort |
| end subroutine test12 |
| end program lastprivate |