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