1! { dg-do run } 2program lastprivate 3 integer :: i, k 4 common /c/ i, k 5 !$omp parallel num_threads (4) 6 call test1 7 !$omp end parallel 8 if (i .ne. 21 .or. k .ne. 20) stop 1 9 !$omp parallel num_threads (4) 10 call test2 11 !$omp end parallel 12 if (i .ne. 64 .or. k .ne. 61) stop 2 13 !$omp parallel num_threads (4) 14 call test3 15 !$omp end parallel 16 if (i .ne. 14 .or. k .ne. 11) stop 3 17 call test4 18 call test5 19 call test6 20 call test7 21 call test8 22 call test9 23 call test10 24 call test11 25 call test12 26contains 27 subroutine test1 28 integer :: i, k 29 common /c/ i, k 30 !$omp do lastprivate (i, k) 31 do i = 1, 20 32 k = i 33 end do 34 end subroutine test1 35 subroutine test2 36 integer :: i, k 37 common /c/ i, k 38 !$omp do lastprivate (i, k) 39 do i = 7, 61, 3 40 k = i 41 end do 42 end subroutine test2 43 function ret3 () 44 integer :: ret3 45 ret3 = 3 46 end function ret3 47 subroutine test3 48 integer :: i, k 49 common /c/ i, k 50 !$omp do lastprivate (i, k) 51 do i = -10, 11, ret3 () 52 k = i 53 end do 54 end subroutine test3 55 subroutine test4 56 integer :: j, l 57 !$omp parallel do lastprivate (j, l) num_threads (4) 58 do j = 1, 20 59 l = j 60 end do 61 if (j .ne. 21 .or. l .ne. 20) stop 4 62 end subroutine test4 63 subroutine test5 64 integer :: j, l 65 l = 77 66 !$omp parallel do lastprivate (j, l) num_threads (4) firstprivate (l) 67 do j = 7, 61, 3 68 l = j 69 end do 70 if (j .ne. 64 .or. l .ne. 61) stop 5 71 end subroutine test5 72 subroutine test6 73 integer :: j, l 74 !$omp parallel do lastprivate (j, l) num_threads (4) 75 do j = -10, 11, ret3 () 76 l = j 77 end do 78 if (j .ne. 14 .or. l .ne. 11) stop 6 79 end subroutine test6 80 subroutine test7 81 integer :: i, k 82 common /c/ i, k 83 !$omp parallel do lastprivate (i, k) num_threads (4) 84 do i = 1, 20 85 k = i 86 end do 87 if (i .ne. 21 .or. k .ne. 20) stop 7 88 end subroutine test7 89 subroutine test8 90 integer :: i, k 91 common /c/ i, k 92 !$omp parallel do lastprivate (i, k) num_threads (4) 93 do i = 7, 61, 3 94 k = i 95 end do 96 if (i .ne. 64 .or. k .ne. 61) stop 8 97 end subroutine test8 98 subroutine test9 99 integer :: i, k 100 common /c/ i, k 101 k = 77 102 !$omp parallel do lastprivate (i, k) num_threads (4) firstprivate (k) 103 do i = -10, 11, ret3 () 104 k = i 105 end do 106 if (i .ne. 14 .or. k .ne. 11) stop 9 107 end subroutine test9 108 subroutine test10 109 integer :: i, k 110 common /c/ i, k 111 !$omp parallel num_threads (4) 112 !$omp do lastprivate (i, k) 113 do i = 1, 20 114 k = i 115 end do 116 !$omp end parallel 117 if (i .ne. 21 .or. k .ne. 20) stop 10 118 end subroutine test10 119 subroutine test11 120 integer :: i, k 121 common /c/ i, k 122 !$omp parallel num_threads (4) 123 !$omp do lastprivate (i, k) 124 do i = 7, 61, 3 125 k = i 126 end do 127 !$omp end parallel 128 if (i .ne. 64 .or. k .ne. 61) stop 11 129 end subroutine test11 130 subroutine test12 131 integer :: i, k 132 common /c/ i, k 133 k = 77 134 !$omp parallel num_threads (4) 135 !$omp do lastprivate (i, k) firstprivate (k) 136 do i = -10, 11, ret3 () 137 k = i 138 end do 139 !$omp end parallel 140 if (i .ne. 14 .or. k .ne. 11) stop 12 141 end subroutine test12 142end program lastprivate 143