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