blob: d6cde82c61765c955297b8fee18cb15bd8b38cb0 [file] [log] [blame]
Alexander Musmana8e9d2e2014-06-03 10:16:47 +00001// RUN: %clang_cc1 -fsyntax-only -fopenmp=libiomp5 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify %s
2
3static int sii;
Alexander Musman1bb328c2014-06-04 13:06:39 +00004#pragma omp threadprivate(sii) // expected-note {{defined as threadprivate or thread local}}
Alexander Musmana8e9d2e2014-06-03 10:16:47 +00005
6int test_iteration_spaces() {
7 const int N = 100;
8 float a[N], b[N], c[N];
9 int ii, jj, kk;
10 float fii;
11 double dii;
12 #pragma omp simd
13 for (int i = 0; i < 10; i+=1) {
14 c[i] = a[i] + b[i];
15 }
16 #pragma omp simd
17 for (char i = 0; i < 10; i++) {
18 c[i] = a[i] + b[i];
19 }
20 #pragma omp simd
21 for (char i = 0; i < 10; i+='\1') {
22 c[i] = a[i] + b[i];
23 }
24 #pragma omp simd
25 for (long long i = 0; i < 10; i++) {
26 c[i] = a[i] + b[i];
27 }
28 // expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'double'}}
29 #pragma omp simd
30 for (long long i = 0; i < 10; i+=1.5) {
31 c[i] = a[i] + b[i];
32 }
33 #pragma omp simd
34 for (long long i = 0; i < 'z'; i+=1u) {
35 c[i] = a[i] + b[i];
36 }
37 // expected-error@+2 {{variable must be of integer or random access iterator type}}
38 #pragma omp simd
39 for (float fi = 0; fi < 10.0; fi++) {
40 c[(int)fi] = a[(int)fi] + b[(int)fi];
41 }
42 // expected-error@+2 {{variable must be of integer or random access iterator type}}
43 #pragma omp simd
44 for (double fi = 0; fi < 10.0; fi++) {
45 c[(int)fi] = a[(int)fi] + b[(int)fi];
46 }
47 // expected-error@+2 {{variable must be of integer or random access iterator type}}
48 #pragma omp simd
49 for (int &ref = ii; ref < 10; ref++) {
50 }
51 // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
52 #pragma omp simd
53 for (int i; i < 10; i++)
54 c[i] = a[i];
55
56 // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
57 #pragma omp simd
58 for (int i = 0, j = 0; i < 10; ++i)
59 c[i] = a[i];
60
61 // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
62 #pragma omp simd
63 for (;ii < 10; ++ii)
64 c[ii] = a[ii];
65
66 // expected-warning@+3 {{expression result unused}}
67 // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
68 #pragma omp simd
69 for (ii + 1;ii < 10; ++ii)
70 c[ii] = a[ii];
71
72 // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
73 #pragma omp simd
74 for (c[ii] = 0;ii < 10; ++ii)
75 c[ii] = a[ii];
76
77 // Ok to skip parenthesises.
78 #pragma omp simd
79 for (((ii)) = 0;ii < 10; ++ii)
80 c[ii] = a[ii];
81
82 // expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
83 #pragma omp simd
84 for (int i = 0; i; i++)
85 c[i] = a[i];
86
87 // expected-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
88 // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}}
89 #pragma omp simd
90 for (int i = 0; jj < kk; ii++)
91 c[i] = a[i];
92
93 // expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
94 #pragma omp simd
95 for (int i = 0; !!i; i++)
96 c[i] = a[i];
97
98 // expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
99 #pragma omp simd
100 for (int i = 0; i != 1; i++)
101 c[i] = a[i];
102
103 // expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
104 #pragma omp simd
105 for (int i = 0; ; i++)
106 c[i] = a[i];
107
108 // Ok.
109 #pragma omp simd
110 for (int i = 11; i > 10; i--)
111 c[i] = a[i];
112
113 // Ok.
114 #pragma omp simd
115 for (int i = 0; i < 10; ++i)
116 c[i] = a[i];
117
118 // Ok.
119 #pragma omp simd
120 for (ii = 0; ii < 10; ++ii)
121 c[ii] = a[ii];
122
123 // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
124 #pragma omp simd
125 for (ii = 0; ii < 10; ++jj)
126 c[ii] = a[jj];
127
128 // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
129 #pragma omp simd
130 for (ii = 0; ii < 10; ++ ++ ii)
131 c[ii] = a[ii];
132
133 // Ok but undefined behavior (in general, cannot check that incr
134 // is really loop-invariant).
135 #pragma omp simd
136 for (ii = 0; ii < 10; ii = ii + ii)
137 c[ii] = a[ii];
138
139 // expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'float'}}
140 #pragma omp simd
141 for (ii = 0; ii < 10; ii = ii + 1.0f)
142 c[ii] = a[ii];
143
144 // Ok - step was converted to integer type.
145 #pragma omp simd
146 for (ii = 0; ii < 10; ii = ii + (int)1.1f)
147 c[ii] = a[ii];
148
149 // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
150 #pragma omp simd
151 for (ii = 0; ii < 10; jj = ii + 2)
152 c[ii] = a[ii];
153
154 // expected-warning@+3 {{relational comparison result unused}}
155 // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
156 #pragma omp simd
157 for (ii = 0; ii < 10; jj > kk + 2)
158 c[ii] = a[ii];
159
160 // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
161 #pragma omp simd
162 for (ii = 0; ii < 10;)
163 c[ii] = a[ii];
164
165 // expected-warning@+3 {{expression result unused}}
166 // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
167 #pragma omp simd
168 for (ii = 0; ii < 10; !ii)
169 c[ii] = a[ii];
170
171 // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
172 #pragma omp simd
173 for (ii = 0; ii < 10; ii ? ++ii : ++jj)
174 c[ii] = a[ii];
175
176 // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
177 #pragma omp simd
178 for (ii = 0; ii < 10; ii = ii < 10)
179 c[ii] = a[ii];
180
181 // expected-note@+3 {{loop step is expected to be positive due to this condition}}
182 // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
183 #pragma omp simd
184 for (ii = 0; ii < 10; ii = ii + 0)
185 c[ii] = a[ii];
186
187 // expected-note@+3 {{loop step is expected to be positive due to this condition}}
188 // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
189 #pragma omp simd
190 for (ii = 0; ii < 10; ii = ii + (int)(0.8 - 0.45))
191 c[ii] = a[ii];
192
193 // expected-note@+3 {{loop step is expected to be positive due to this condition}}
194 // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
195 #pragma omp simd
196 for (ii = 0; (ii) < 10; ii-=25)
197 c[ii] = a[ii];
198
199 // expected-note@+3 {{loop step is expected to be positive due to this condition}}
200 // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
201 #pragma omp simd
202 for (ii = 0; (ii < 10); ii-=0)
203 c[ii] = a[ii];
204
205 // expected-note@+3 {{loop step is expected to be negative due to this condition}}
206 // expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
207 #pragma omp simd
208 for (ii = 0; ii > 10; (ii+=0))
209 c[ii] = a[ii];
210
211 // expected-note@+3 {{loop step is expected to be positive due to this condition}}
212 // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
213 #pragma omp simd
214 for (ii = 0; ii < 10; (ii) = (1-1)+(ii))
215 c[ii] = a[ii];
216
217 // expected-note@+3 {{loop step is expected to be negative due to this condition}}
218 // expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
219 #pragma omp simd
220 for ((ii = 0); ii > 10; (ii-=0))
221 c[ii] = a[ii];
222
223 // expected-note@+3 {{loop step is expected to be positive due to this condition}}
224 // expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
225 #pragma omp simd
226 for (ii = 0; (ii < 10); (ii-=0))
227 c[ii] = a[ii];
228
229 // expected-note@+2 {{defined as private}}
230 // expected-error@+2 {{loop iteration variable may not be private}}
231 #pragma omp simd private(ii)
232 for (ii = 0; ii < 10; ii++)
233 c[ii] = a[ii];
234
235 // expected-error@+3 {{unexpected OpenMP clause 'shared' in directive '#pragma omp simd'}}
236 // expected-note@+2 {{defined as shared}}
237 // expected-error@+2 {{loop iteration variable may not be shared}}
238 #pragma omp simd shared(ii)
239 for (ii = 0; ii < 10; ii++)
240 c[ii] = a[ii];
241
242 #pragma omp simd linear(ii)
243 for (ii = 0; ii < 10; ii++)
244 c[ii] = a[ii];
245
Alexey Bataevf29276e2014-06-18 04:14:57 +0000246 #pragma omp simd lastprivate(ii)
247 for (ii = 0; ii < 10; ii++)
248 c[ii] = a[ii];
249
Alexander Musmana8e9d2e2014-06-03 10:16:47 +0000250
251 #pragma omp parallel
252 {
Alexander Musman1bb328c2014-06-04 13:06:39 +0000253 // expected-error@+2 {{loop iteration variable may not be threadprivate or thread local}}
Alexander Musmana8e9d2e2014-06-03 10:16:47 +0000254 #pragma omp simd
255 for (sii = 0; sii < 10; sii+=1)
256 c[sii] = a[sii];
257 }
258
259 // expected-error@+2 {{statement after '#pragma omp simd' must be a for loop}}
260 #pragma omp simd
261 for (auto &item : a) {
262 item = item + 1;
263 }
264
265 // expected-note@+3 {{loop step is expected to be positive due to this condition}}
266 // expected-error@+2 {{increment expression must cause 'i' to increase on each iteration of OpenMP for loop}}
267 #pragma omp simd
268 for (unsigned i = 9; i < 10; i--) {
269 c[i] = a[i] + b[i];
270 }
271
272 int (*lb)[4] = nullptr;
273 #pragma omp simd
274 for (int (*p)[4] = lb; p < lb + 8; ++p) {
275 }
276
277 // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
278 #pragma omp simd
279 for (int a{0}; a<10; ++a) {
280 }
281
282 return 0;
283}
284
285// Iterators allowed in openmp for-loops.
286namespace std {
287struct random_access_iterator_tag { };
288template <class Iter> struct iterator_traits {
289 typedef typename Iter::difference_type difference_type;
290 typedef typename Iter::iterator_category iterator_category;
291};
292template <class Iter>
293typename iterator_traits<Iter>::difference_type
294distance(Iter first, Iter last) { return first - last; }
295}
296class Iter0 {
297 public:
298 Iter0() { }
299 Iter0(const Iter0 &) { }
300 Iter0 operator ++() { return *this; }
301 Iter0 operator --() { return *this; }
302 bool operator <(Iter0 a) { return true; }
303};
304int operator -(Iter0 a, Iter0 b) { return 0; }
305class Iter1 {
306 public:
307 Iter1(float f=0.0f, double d=0.0) { }
308 Iter1(const Iter1 &) { }
309 Iter1 operator ++() { return *this; }
310 Iter1 operator --() { return *this; }
311 bool operator <(Iter1 a) { return true; }
312 bool operator >=(Iter1 a) { return false; }
313};
314class GoodIter {
315 public:
316 GoodIter() { }
317 GoodIter(const GoodIter &) { }
318 GoodIter(int fst, int snd) { }
319 GoodIter &operator =(const GoodIter &that) { return *this; }
320 GoodIter &operator =(const Iter0 &that) { return *this; }
321 GoodIter &operator +=(int x) { return *this; }
322 explicit GoodIter(void *) { }
323 GoodIter operator ++() { return *this; }
324 GoodIter operator --() { return *this; }
325 bool operator !() { return true; }
326 bool operator <(GoodIter a) { return true; }
327 bool operator <=(GoodIter a) { return true; }
328 bool operator >=(GoodIter a) { return false; }
329 typedef int difference_type;
330 typedef std::random_access_iterator_tag iterator_category;
331};
332int operator -(GoodIter a, GoodIter b) { return 0; }
333GoodIter operator -(GoodIter a) { return a; }
334GoodIter operator -(GoodIter a, int v) { return GoodIter(); }
335GoodIter operator +(GoodIter a, int v) { return GoodIter(); }
336GoodIter operator -(int v, GoodIter a) { return GoodIter(); }
337GoodIter operator +(int v, GoodIter a) { return GoodIter(); }
338
339int test_with_random_access_iterator() {
340 GoodIter begin, end;
341 Iter0 begin0, end0;
342 #pragma omp simd
343 for (GoodIter I = begin; I < end; ++I)
344 ++I;
345 // expected-error@+2 {{variable must be of integer or random access iterator type}}
346 #pragma omp simd
347 for (GoodIter &I = begin; I < end; ++I)
348 ++I;
349 #pragma omp simd
350 for (GoodIter I = begin; I >= end; --I)
351 ++I;
352 // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
353 #pragma omp simd
354 for (GoodIter I(begin); I < end; ++I)
355 ++I;
356 // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
357 #pragma omp simd
358 for (GoodIter I(nullptr); I < end; ++I)
359 ++I;
360 // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
361 #pragma omp simd
362 for (GoodIter I(0); I < end; ++I)
363 ++I;
364 // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
365 #pragma omp simd
366 for (GoodIter I(1,2); I < end; ++I)
367 ++I;
368 #pragma omp simd
369 for (begin = GoodIter(0); begin < end; ++begin)
370 ++begin;
371 #pragma omp simd
372 for (begin = begin0; begin < end; ++begin)
373 ++begin;
374 // expected-error@+2 {{initialization clause of OpenMP for loop must be of the form 'var = init' or 'T var = init'}}
375 #pragma omp simd
376 for (++begin; begin < end; ++begin)
377 ++begin;
378 #pragma omp simd
379 for (begin = end; begin < end; ++begin)
380 ++begin;
381 // expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
382 #pragma omp simd
383 for (GoodIter I = begin; I - I; ++I)
384 ++I;
385 // expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
386 #pragma omp simd
387 for (GoodIter I = begin; begin < end; ++I)
388 ++I;
389 // expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
390 #pragma omp simd
391 for (GoodIter I = begin; !I; ++I)
392 ++I;
393 // expected-note@+3 {{loop step is expected to be negative due to this condition}}
394 // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
395 #pragma omp simd
396 for (GoodIter I = begin; I >= end; I = I + 1)
397 ++I;
398 #pragma omp simd
399 for (GoodIter I = begin; I >= end; I = I - 1)
400 ++I;
401 // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
402 #pragma omp simd
403 for (GoodIter I = begin; I >= end; I = -I)
404 ++I;
405 // expected-note@+3 {{loop step is expected to be negative due to this condition}}
406 // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
407 #pragma omp simd
408 for (GoodIter I = begin; I >= end; I = 2 + I)
409 ++I;
410 // expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
411 #pragma omp simd
412 for (GoodIter I = begin; I >= end; I = 2 - I)
413 ++I;
414 #pragma omp simd
415 for (Iter0 I = begin0; I < end0; ++I)
416 ++I;
417 // Initializer is constructor without params.
418 // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
419 #pragma omp simd
420 for (Iter0 I; I < end0; ++I)
421 ++I;
422 Iter1 begin1, end1;
423 #pragma omp simd
424 for (Iter1 I = begin1; I < end1; ++I)
425 ++I;
426 // expected-note@+3 {{loop step is expected to be negative due to this condition}}
427 // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
428 #pragma omp simd
429 for (Iter1 I = begin1; I >= end1; ++I)
430 ++I;
431 // Initializer is constructor with all default params.
432 // expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
433 #pragma omp simd
434 for (Iter1 I; I < end1; ++I) {
435 }
436 return 0;
437}
438
439template <typename IT, int ST> class TC {
440 public:
441 int dotest_lt(IT begin, IT end) {
442 // expected-note@+3 {{loop step is expected to be positive due to this condition}}
443 // expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
444 #pragma omp simd
445 for (IT I = begin; I < end; I = I + ST) {
446 ++I;
447 }
448 // expected-note@+3 {{loop step is expected to be positive due to this condition}}
449 // expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
450 #pragma omp simd
451 for (IT I = begin; I <= end; I += ST) {
452 ++I;
453 }
454 #pragma omp simd
455 for (IT I = begin; I < end; ++I) {
456 ++I;
457 }
458 }
459
460 static IT step() {
461 return IT(ST);
462 }
463};
464template <typename IT, int ST=0> int dotest_gt(IT begin, IT end) {
465 // expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
466 // expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
467 #pragma omp simd
468 for (IT I = begin; I >= end; I = I + ST) {
469 ++I;
470 }
471 // expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
472 // expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
473 #pragma omp simd
474 for (IT I = begin; I >= end; I += ST) {
475 ++I;
476 }
477
478 // expected-note@+3 {{loop step is expected to be negative due to this condition}}
479 // expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
480 #pragma omp simd
481 for (IT I = begin; I >= end; ++I) {
482 ++I;
483 }
484
485 #pragma omp simd
486 for (IT I = begin; I < end; I+=TC<int,ST>::step()) {
487 ++I;
488 }
489}
490
491void test_with_template() {
492 GoodIter begin, end;
493 TC<GoodIter, 100> t1;
494 TC<GoodIter, -100> t2;
495 t1.dotest_lt(begin, end);
496 t2.dotest_lt(begin, end); // expected-note {{in instantiation of member function 'TC<GoodIter, -100>::dotest_lt' requested here}}
497 dotest_gt(begin, end); // expected-note {{in instantiation of function template specialization 'dotest_gt<GoodIter, 0>' requested here}}
498 dotest_gt<unsigned, -10>(0, 100); // expected-note {{in instantiation of function template specialization 'dotest_gt<unsigned int, -10>' requested here}}
499}
500
501void test_loop_break() {
502 const int N = 100;
503 float a[N], b[N], c[N];
504 #pragma omp simd
505 for (int i = 0; i < 10; i++) {
506 c[i] = a[i] + b[i];
507 for (int j = 0; j < 10; ++j) {
508 if (a[i] > b[j])
509 break; // OK in nested loop
510 }
511 switch(i) {
512 case 1:
513 b[i]++;
514 break;
515 default:
516 break;
517 }
518 if (c[i] > 10)
519 break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
520
521 if (c[i] > 11)
522 break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
523 }
524
525 #pragma omp simd
526 for (int i = 0; i < 10; i++) {
527 for (int j = 0; j < 10; j++) {
528 c[i] = a[i] + b[i];
529 if (c[i] > 10) {
530 if (c[i] < 20) {
531 break; // OK
532 }
533 }
534 }
535 }
536}
537
538void test_loop_eh() {
539 const int N = 100;
540 float a[N], b[N], c[N];
541 #pragma omp simd
542 for (int i = 0; i < 10; i++) {
543 c[i] = a[i] + b[i];
544 try { // expected-error {{'try' statement cannot be used in OpenMP simd region}}
545 for (int j = 0; j < 10; ++j) {
546 if (a[i] > b[j])
547 throw a[i]; // expected-error {{'throw' statement cannot be used in OpenMP simd region}}
548 }
549 throw a[i]; // expected-error {{'throw' statement cannot be used in OpenMP simd region}}
550 }
551 catch (float f) {
552 if (f > 0.1)
553 throw a[i]; // expected-error {{'throw' statement cannot be used in OpenMP simd region}}
554 return; // expected-error {{cannot return from OpenMP region}}
555 }
556 switch(i) {
557 case 1:
558 b[i]++;
559 break;
560 default:
561 break;
562 }
563 for (int j = 0; j < 10; j++) {
564 if (c[i] > 10)
565 throw c[i]; // expected-error {{'throw' statement cannot be used in OpenMP simd region}}
566 }
567 }
568 if (c[9] > 10)
569 throw c[9]; // OK
570
571 #pragma omp simd
572 for (int i = 0; i < 10; ++i) {
573 struct S {
574 void g() { throw 0; }
575 };
576 }
577}
578