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) call abort
8  !$omp parallel num_threads (4)
9  call test2
10  !$omp end parallel
11  if (i .ne. 64) call abort
12  !$omp parallel num_threads (4)
13  call test3
14  !$omp end parallel
15  if (i .ne. 14) 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
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) call abort
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) call abort
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) call abort
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) call abort
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) call abort
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) call abort
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) call abort
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) call abort
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) call abort
125  end subroutine test12
126end program lastprivate
127