1program lastprivate
2  integer :: i
3  common /c/ i
4  !$omp parallel num_threads (4)
5  call test1
6  !$omp end parallel
7  if (i .ne. 21) STOP 1
8  !$omp parallel num_threads (4)
9  call test2
10  !$omp end parallel
11  if (i .ne. 64) STOP 2
12  !$omp parallel num_threads (4)
13  call test3
14  !$omp end parallel
15  if (i .ne. 14) STOP 3
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
28    common /c/ i
29    !$omp do lastprivate (i)
30    do i = 1, 20
31    end do
32  end subroutine test1
33  subroutine test2
34    integer :: i
35    common /c/ i
36    !$omp do lastprivate (i)
37    do i = 7, 61, 3
38    end do
39  end subroutine test2
40  function ret3 ()
41    integer :: ret3
42    ret3 = 3
43  end function ret3
44  subroutine test3
45    integer :: i
46    common /c/ i
47    !$omp do lastprivate (i)
48    do i = -10, 11, ret3 ()
49    end do
50  end subroutine test3
51  subroutine test4
52    integer :: j
53    !$omp parallel do lastprivate (j) num_threads (4) default (none)
54    do j = 1, 20
55    end do
56    if (j .ne. 21) STOP 4
57  end subroutine test4
58  subroutine test5
59    integer :: j
60    !$omp parallel do lastprivate (j) num_threads (4) default (none)
61    do j = 7, 61, 3
62    end do
63    if (j .ne. 64) STOP 5
64  end subroutine test5
65  subroutine test6
66    integer :: j
67    !$omp parallel do lastprivate (j) num_threads (4) default (none)
68    do j = -10, 11, ret3 ()
69    end do
70    if (j .ne. 14) STOP 6
71  end subroutine test6
72  subroutine test7
73    integer :: i
74    common /c/ i
75    !$omp parallel do lastprivate (i) num_threads (4) default (none)
76    do i = 1, 20
77    end do
78    if (i .ne. 21) STOP 7
79  end subroutine test7
80  subroutine test8
81    integer :: i
82    common /c/ i
83    !$omp parallel do lastprivate (i) num_threads (4) default (none)
84    do i = 7, 61, 3
85    end do
86    if (i .ne. 64) STOP 8
87  end subroutine test8
88  subroutine test9
89    integer :: i
90    common /c/ i
91    !$omp parallel do lastprivate (i) num_threads (4) default (none)
92    do i = -10, 11, ret3 ()
93    end do
94    if (i .ne. 14) STOP 9
95  end subroutine test9
96  subroutine test10
97    integer :: i
98    common /c/ i
99    !$omp parallel num_threads (4) default (none) shared (i)
100    !$omp do lastprivate (i)
101    do i = 1, 20
102    end do
103    !$omp end parallel
104    if (i .ne. 21) STOP 10
105  end subroutine test10
106  subroutine test11
107    integer :: i
108    common /c/ i
109    !$omp parallel num_threads (4) default (none) shared (i)
110    !$omp do lastprivate (i)
111    do i = 7, 61, 3
112    end do
113    !$omp end parallel
114    if (i .ne. 64) STOP 11
115  end subroutine test11
116  subroutine test12
117    integer :: i
118    common /c/ i
119    !$omp parallel num_threads (4) default (none) shared (i)
120    !$omp do lastprivate (i)
121    do i = -10, 11, ret3 ()
122    end do
123    !$omp end parallel
124    if (i .ne. 14) STOP 12
125  end subroutine test12
126end program lastprivate
127