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