1module m
2  use iso_c_binding, only: c_loc
3  implicit none (type, external)
4  integer :: v
5  interface
6    subroutine foo (); end
7    integer function omp_get_thread_num (); end
8    integer function omp_get_num_threads (); end
9    integer function omp_get_cancellation (); end
10    integer(c_int) function omp_target_is_present(ptr, device_num) bind(c)
11      use, intrinsic :: iso_c_binding, only : c_ptr, c_int
12      type(c_ptr), value :: ptr
13      integer(c_int), value :: device_num
14    end
15  end interface
16
17contains
18subroutine f1(a)
19  integer :: a(0:)
20  integer :: i, j
21  !$omp simd order(concurrent)
22    do i = 0, 63
23      !$omp loop
24      do j = 0, 63
25        a(64 * i + j) = i + j
26      end do
27    end do
28end
29
30subroutine f2 (a)
31  integer :: a(0:)
32  integer :: i, j
33  !$omp do simd order(concurrent)
34    do i = 0, 63
35      !$omp loop
36      do j = 0, 63
37        a(64 * i + j) = i + j
38      end do
39    end do
40end
41
42subroutine f3 (a)
43  integer :: a(0:)
44  integer :: i, j
45  !$omp do order(concurrent)
46    do i = 0, 63
47      !$omp loop
48      do j = 0, 63
49        a(64 * i + j) = i + j
50      end do
51    end do
52end
53
54subroutine f4 (a)
55  integer, target :: a(0:)
56  integer :: i, j
57  !$omp loop order(concurrent) bind(parallel)
58    do i = 0, 63
59      !$omp parallel
60        call foo ()
61      !$omp end parallel
62    end do
63  !$omp loop order(concurrent) bind(parallel)
64    do i = 0, 63
65      !$omp simd
66      do j = 0, 63
67        a(64 * i + j) = i + j
68      end do
69    end do
70  !$omp loop order(concurrent) bind(parallel)
71    do i = 0, 63
72      !$omp loop
73      do j = 0, 63
74        a(64 * i + j) = i + j
75      end do
76    end do
77  !$omp loop order(concurrent) bind(parallel)
78    do i = 0, 63
79      !$omp critical  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
80        call foo ()
81      !$omp end critical
82    end do
83  !$omp loop order(concurrent) bind(parallel)
84    do i = 0, 63
85      !$omp ordered simd  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
86        call foo ()
87      !$omp end ordered
88    end do
89  !$omp loop order(concurrent) bind(parallel)
90    do i = 0, 63
91      !$omp atomic  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
92      v = v + 1
93    end do
94  !$omp loop order(concurrent) bind(parallel)
95    do i = 0, 63
96      !$omp atomic read   ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
97      a(i) = v
98    end do
99  !$omp loop order(concurrent) bind(parallel)
100    do i = 0, 63
101      !$omp atomic write  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
102      v = a(i)
103    end do
104  !$omp loop order(concurrent) bind(parallel)
105    do i = 0, 63
106      a(i) = a(i) + omp_get_thread_num ()  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
107    end do
108  !$omp loop order(concurrent) bind(parallel)
109    do i = 0, 63
110      a(i) = a(i) + omp_get_num_threads ()  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
111    end do
112  !$omp loop order(concurrent) bind(parallel)
113    do i = 0, 63
114      a(i) = a(i) + omp_target_is_present (c_loc (a(i)), 0)  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
115    end do
116  !$omp loop order(concurrent) bind(parallel)
117    do i = 0, 63
118      a(i) = a(i) + omp_get_cancellation ()  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
119    end do
120end
121
122subroutine f5 (a)
123 integer, target :: a(0:)
124 integer :: i, j
125 !$omp parallel
126  !$omp loop
127    do i = 0, 63
128      !$omp parallel
129        call foo ()
130      !$omp end parallel
131    end do
132  !$omp loop
133    do i = 0, 63
134      !$omp simd
135      do j = 0, 63
136        a(64 * i + j) = i + j
137      end do
138    end do
139  !$omp loop
140    do i = 0, 63
141      !$omp loop
142      do j = 0, 63
143        a(64 * i + j) = i + j
144      end do
145    end do
146  !$omp loop
147    do i = 0, 63
148      !$omp critical  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
149        call foo ()
150      !$omp end critical
151    end do
152  !$omp loop
153    do i = 0, 63
154      !$omp ordered simd  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
155        call foo ()
156      !$omp end ordered
157    end do
158  !$omp loop
159    do i = 0, 63
160      !$omp atomic  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
161      v = v + 1
162    end do
163  !$omp loop
164    do i = 0, 63
165      !$omp atomic read  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
166      a(i) = v
167    end do
168  !$omp loop
169    do i = 0, 63
170      !$omp atomic write  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
171      v = a(i)
172    end do
173  !$omp loop
174    do i = 0, 63
175      !$omp master  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
176        call foo ()
177      !$omp end master
178    end do
179  !$omp loop
180    do i = 0, 63
181      !$omp masked  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
182        call foo ()
183      !$omp end masked
184    end do
185  !$omp loop
186    do i = 0, 63
187      !$omp scope  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
188        call foo ()
189      !$omp end scope
190    end do
191  !$omp loop
192    do i = 0, 63
193      a(i) = a(i) + omp_get_thread_num ()  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
194    end do
195  !$omp loop
196    do i = 0, 63
197      a(i) = a(i) + omp_get_num_threads ()  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
198    end do
199  !$omp loop
200    do i = 0, 63
201      a(i) = a(i) + omp_target_is_present (c_loc(a(i)), 0)  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
202    end do
203  !$omp loop
204    do i = 0, 63
205      a(i) = a(i) + omp_get_cancellation ()  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
206    end do
207  !$omp end parallel
208end
209
210subroutine f6 (a)
211 integer, target :: a(0:)
212 integer :: i, j
213 !$omp master
214  !$omp loop
215    do i = 0, 63
216      !$omp parallel
217        call foo ()
218      !$omp end parallel
219    end do
220  !$omp loop
221    do i = 0, 63
222      !$omp simd
223      do j = 0, 63
224        a(64 * i + j) = i + j
225      end do
226    end do
227  !$omp loop
228    do i = 0, 63
229      !$omp loop
230      do j = 0, 63
231        a(64 * i + j) = i + j
232      end do
233    end do
234  !$omp loop
235    do i = 0, 63
236      !$omp critical  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
237        call foo ()
238      !$omp end critical
239    end do
240  !$omp loop
241    do i = 0, 63
242      !$omp ordered simd  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
243        call foo ()
244      !$omp end ordered
245    end do
246  !$omp loop
247    do i = 0, 63
248      !$omp atomic  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
249      v = v + 1
250    end do
251  !$omp loop
252    do i = 0, 63
253      !$omp atomic read  !  { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
254      a(i) = v
255    end do
256  !$omp loop
257    do i = 0, 63
258      !$omp atomic write  ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" }
259      v = a(i)
260    end do
261  !$omp loop
262    do i = 0, 63
263      a(i) = a(i) + omp_get_thread_num ()  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
264    end do
265  !$omp loop
266    do i = 0, 63
267      a(i) = a(i) + omp_get_num_threads ()  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
268    end do
269  !$omp loop
270    do i = 0, 63
271      a(i) = a(i) + omp_target_is_present (c_loc(a(i)), 0)  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
272    end do
273  !$omp loop
274    do i = 0, 63
275      a(i) = a(i) + omp_get_cancellation ()  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" }
276    end do
277 !$omp end master
278end
279end module
280