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