14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -fopenmp -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify %s
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass S {
44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int a;
54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  S() : a(0) {}
64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  S(int v) : a(v) {}
94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  S(const S &s) : a(s.a) {}
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic int sii;
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+1 {{defined as threadprivate or thread local}}
144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp threadprivate(sii)
154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic int globalii;
164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint test_iteration_spaces() {
184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const int N = 100;
194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  float a[N], b[N], c[N];
204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int ii, jj, kk;
214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  float fii;
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  double dii;
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0; i < 10; i += 1) {
254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i] + b[i];
264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (char i = 0; i < 10; i++) {
294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i] + b[i];
304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (char i = 0; i < 10; i += '\1') {
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i] + b[i];
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (long long i = 0; i < 10; i++) {
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i] + b[i];
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'double'}}
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (long long i = 0; i < 10; i += 1.5) {
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i] + b[i];
434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (long long i = 0; i < 'z'; i += 1u) {
464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i] + b[i];
474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{variable must be of integer or random access iterator type}}
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (float fi = 0; fi < 10.0; fi++) {
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[(int)fi] = a[(int)fi] + b[(int)fi];
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{variable must be of integer or random access iterator type}}
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (double fi = 0; fi < 10.0; fi++) {
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[(int)fi] = a[(int)fi] + b[(int)fi];
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int &ref = ii; ref < 10; ref++) {
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i; i < 10; i++)
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i];
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0, j = 0; i < 10; ++i)
704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i];
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (; ii < 10; ++ii)
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-warning@+3 {{expression result unused}}
784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii + 1; ii < 10; ++ii)
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (c[ii] = 0; ii < 10; ++ii)
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Ok to skip parenthesises.
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (((ii)) = 0; ii < 10; ++ii)
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0; i; i++)
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i];
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}}
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0; jj < kk; ii++)
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i];
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0; !!i; i++)
1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i];
1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0; i != 1; i++)
1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i];
1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}}
1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0;; i++)
1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i];
1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Ok.
1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 11; i > 10; i--)
1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i];
1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Ok.
1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0; i < 10; ++i)
1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i];
1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Ok.
1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ++ii)
1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ++jj)
1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[jj];
1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ++++ii)
1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Ok but undefined behavior (in general, cannot check that incr
1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// is really loop-invariant).
1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ii = ii + ii)
1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'float'}}
1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ii = ii + 1.0f)
1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Ok - step was converted to integer type.
1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ii = ii + (int)1.1f)
1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; jj = ii + 2)
1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-warning@+3 {{relational comparison result unused}}
1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii<10; jj> kk + 2)
1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
1724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10;)
1744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-warning@+3 {{expression result unused}}
1774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
1784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; !ii)
1804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
1834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ii ? ++ii : ++jj)
1854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}}
1884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ii = ii < 10)
1904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be positive due to this condition}}
1934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
1944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
1954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ii = ii + 0)
1964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
1974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be positive due to this condition}}
1994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
2004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ii = ii + (int)(0.8 - 0.45))
2024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
2034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be positive due to this condition}}
2054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
2064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; (ii) < 10; ii -= 25)
2084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
2094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be positive due to this condition}}
2114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
2124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; (ii < 10); ii -= 0)
2144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
2154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be negative due to this condition}}
2174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
2184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii > 10; (ii += 0))
2204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
2214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be positive due to this condition}}
2234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
2244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; (ii) = (1 - 1) + (ii))
2264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
2274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be negative due to this condition}}
2294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}}
2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for ((ii = 0); ii > 10; (ii -= 0))
2324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
2334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be positive due to this condition}}
2354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}}
2364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; (ii < 10); (ii -= 0))
2384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
2394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+2  {{defined as firstprivate}}
2414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{loop iteration variable in the associated loop of 'omp target parallel for simd' directive may not be firstprivate, predetermined as private}}
2424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd firstprivate(ii)
2434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ii++)
2444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
2454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+2  {{defined as linear}}
2474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{loop iteration variable in the associated loop of 'omp target parallel for simd' directive may not be linear, predetermined as private}}
2484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd linear(ii)
2494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ii++)
2504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
2514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd private(ii)
2534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ii++)
2544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
2554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd lastprivate(ii)
2574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ii = 0; ii < 10; ii++)
2584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[ii] = a[ii];
2594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {
2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{loop iteration variable in the associated loop of 'omp target parallel for simd' directive may not be threadprivate or thread local, predetermined as private}}
2624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (sii = 0; sii < 10; sii += 1)
2644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      c[sii] = a[sii];
2654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {
2684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (globalii = 0; globalii < 10; globalii += 1)
2704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      c[globalii] = a[globalii];
2714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {
2744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd collapse(2)
2754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (ii = 0; ii < 10; ii += 1)
2764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (globalii = 0; globalii < 10; globalii += 1)
2774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      c[globalii] += a[globalii] + ii;
2784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{statement after '#pragma omp target parallel for simd' must be a for loop}}
2814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (auto &item : a) {
2834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    item = item + 1;
2844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be positive due to this condition}}
2874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'i' to increase on each iteration of OpenMP for loop}}
2884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (unsigned i = 9; i < 10; i--) {
2904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i] + b[i];
2914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int(*lb)[4] = nullptr;
2944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
2954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int(*p)[4] = lb; p < lb + 8; ++p) {
2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
2994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
3004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int a{0}; a < 10; ++a) {
3014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
3024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return 0;
3044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Iterators allowed in openmp for-loops.
3074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace std {
3084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct random_access_iterator_tag {};
3094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <class Iter>
3104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct iterator_traits {
3114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef typename Iter::difference_type difference_type;
3124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef typename Iter::iterator_category iterator_category;
3134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
3144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <class Iter>
3154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypename iterator_traits<Iter>::difference_type
3164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainardistance(Iter first, Iter last) { return first - last; }
3174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass Iter0 {
3194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
3204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Iter0() {}
3214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Iter0(const Iter0 &) {}
3224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Iter0 operator++() { return *this; }
3234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Iter0 operator--() { return *this; }
3244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool operator<(Iter0 a) { return true; }
3254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
3264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'Iter0' for 1st argument}}
3274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'Iter0' for 1st argument}}
3284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint operator-(Iter0 a, Iter0 b) { return 0; }
3294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass Iter1 {
3304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
3314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Iter1(float f = 0.0f, double d = 0.0) {}
3324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Iter1(const Iter1 &) {}
3334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Iter1 operator++() { return *this; }
3344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Iter1 operator--() { return *this; }
3354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool operator<(Iter1 a) { return true; }
3364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool operator>=(Iter1 a) { return false; }
3374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
3384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass GoodIter {
3394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
3404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter() {}
3414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter(const GoodIter &) {}
3424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter(int fst, int snd) {}
3434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter &operator=(const GoodIter &that) { return *this; }
3444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter &operator=(const Iter0 &that) { return *this; }
3454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter &operator+=(int x) { return *this; }
3464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter &operator-=(int x) { return *this; }
3474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit GoodIter(void *) {}
3484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter operator++() { return *this; }
3494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter operator--() { return *this; }
3504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool operator!() { return true; }
3514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool operator<(GoodIter a) { return true; }
3524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool operator<=(GoodIter a) { return true; }
3534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool operator>=(GoodIter a) { return false; }
3544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef int difference_type;
3554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  typedef std::random_access_iterator_tag iterator_category;
3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
3574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'GoodIter' for 2nd argument}}
3584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}}
3594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint operator-(GoodIter a, GoodIter b) { return 0; }
3604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+1 3 {{candidate function not viable: requires single argument 'a', but 2 arguments were provided}}
3614967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarGoodIter operator-(GoodIter a) { return a; }
3624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'int' for 2nd argument}}
3634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}}
3644967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarGoodIter operator-(GoodIter a, int v) { return GoodIter(); }
3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'GoodIter' for 1st argument}}
3664967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarGoodIter operator+(GoodIter a, int v) { return GoodIter(); }
3674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'int' for 1st argument}}
3684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'int' for 1st argument}}
3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarGoodIter operator-(int v, GoodIter a) { return GoodIter(); }
3704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'int' for 1st argument}}
3714967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarGoodIter operator+(int v, GoodIter a) { return GoodIter(); }
3724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint test_with_random_access_iterator() {
3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter begin, end;
3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Iter0 begin0, end0;
3764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I = begin; I < end; ++I)
3784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
3794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
3814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter &I = begin; I < end; ++I)
3824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
3834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
3844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I = begin; I >= end; --I)
3854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
3864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
3874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
3884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I(begin); I < end; ++I)
3894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
3904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
3914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
3924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I(nullptr); I < end; ++I)
3934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
3944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
3954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
3964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I(0); I < end; ++I)
3974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
3984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
3994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I(1, 2); I < end; ++I)
4014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (begin = GoodIter(0); begin < end; ++begin)
4044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++begin;
4054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+3 {{invalid operands to binary expression ('GoodIter' and 'const Iter0')}}
4064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
4074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (begin = begin0; begin < end; ++begin)
4094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++begin;
4104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
4114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (++begin; begin < end; ++begin)
4134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++begin;
4144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (begin = end; begin < end; ++begin)
4164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++begin;
4174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
4184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I = begin; I - I; ++I)
4204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
4224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I = begin; begin < end; ++I)
4244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}}
4264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I = begin; !I; ++I)
4284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be negative due to this condition}}
4304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
4314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I = begin; I >= end; I = I + 1)
4334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I = begin; I >= end; I = I - 1)
4364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
4384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I = begin; I >= end; I = -I)
4404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be negative due to this condition}}
4424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
4434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I = begin; I >= end; I = 2 + I)
4454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}}
4474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (GoodIter I = begin; I >= end; I = 2 - I)
4494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{invalid operands to binary expression ('Iter0' and 'int')}}
4514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (Iter0 I = begin0; I < end0; ++I)
4534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Initializer is constructor without params.
4554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+3 {{invalid operands to binary expression ('Iter0' and 'int')}}
4564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
4574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (Iter0 I; I < end0; ++I)
4594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Iter1 begin1, end1;
4614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+3 {{invalid operands to binary expression ('Iter1' and 'Iter1')}}
4624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
4634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (Iter1 I = begin1; I < end1; ++I)
4654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be negative due to this condition}}
4674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
4684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (Iter1 I = begin1; I >= end1; ++I)
4704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
4714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'float')}}
4724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+4 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}}
4734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Initializer is constructor with all default params.
4744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}}
4754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (Iter1 I; I < end1; ++I) {
4774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
4784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return 0;
4794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename IT, int ST>
4824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass TC {
4834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
4844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int dotest_lt(IT begin, IT end) {
4854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be positive due to this condition}}
4864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
4874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (IT I = begin; I < end; I = I + ST) {
4894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ++I;
4904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
4914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be positive due to this condition}}
4924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}}
4934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (IT I = begin; I <= end; I += ST) {
4954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ++I;
4964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
4974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
4984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (IT I = begin; I < end; ++I) {
4994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ++I;
5004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
5014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
5024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  static IT step() {
5044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return IT(ST);
5054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
5064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
5074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename IT, int ST = 0>
5084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint dotest_gt(IT begin, IT end) {
5094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
5104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
5114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
5124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (IT I = begin; I >= end; I = I + ST) {
5134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
5144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
5154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 2 {{loop step is expected to be negative due to this condition}}
5164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
5174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
5184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (IT I = begin; I >= end; I += ST) {
5194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
5204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
5214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+3 {{loop step is expected to be negative due to this condition}}
5234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}}
5244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
5254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (IT I = begin; I >= end; ++I) {
5264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
5274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
5284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
5304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (IT I = begin; I < end; I += TC<int, ST>::step()) {
5314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ++I;
5324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
5334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid test_with_template() {
5364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  GoodIter begin, end;
5374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TC<GoodIter, 100> t1;
5384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TC<GoodIter, -100> t2;
5394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  t1.dotest_lt(begin, end);
5404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  t2.dotest_lt(begin, end);         // expected-note {{in instantiation of member function 'TC<GoodIter, -100>::dotest_lt' requested here}}
5414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dotest_gt(begin, end);            // expected-note {{in instantiation of function template specialization 'dotest_gt<GoodIter, 0>' requested here}}
5424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  dotest_gt<unsigned, -10>(0, 100); // expected-note {{in instantiation of function template specialization 'dotest_gt<unsigned int, -10>' requested here}}
5434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid test_loop_break() {
5464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const int N = 100;
5474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  float a[N], b[N], c[N];
5484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
5494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0; i < 10; i++) {
5504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i] + b[i];
5514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (int j = 0; j < 10; ++j) {
5524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (a[i] > b[j])
5534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        break; // OK in nested loop
5544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
5554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    switch (i) {
5564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    case 1:
5574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      b[i]++;
5584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      break;
5594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    default:
5604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      break;
5614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
5624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (c[i] > 10)
5634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
5644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (c[i] > 11)
5664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      break; // expected-error {{'break' statement cannot be used in OpenMP for loop}}
5674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
5684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
5704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0; i < 10; i++) {
5714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (int j = 0; j < 10; j++) {
5724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      c[i] = a[i] + b[i];
5734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (c[i] > 10) {
5744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (c[i] < 20) {
5754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          break; // OK
5764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        }
5774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
5784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
5794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
5804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid test_loop_eh() {
5834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const int N = 100;
5844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  float a[N], b[N], c[N];
5854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
5864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0; i < 10; i++) {
5874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    c[i] = a[i] + b[i];
5884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    try {
5894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      for (int j = 0; j < 10; ++j) {
5904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (a[i] > b[j])
5914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          throw a[i];
5924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
5934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      throw a[i];
5944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    } catch (float f) {
5954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (f > 0.1)
5964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        throw a[i];
5974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return; // expected-error {{cannot return from OpenMP region}}
5984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
5994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    switch (i) {
6004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    case 1:
6014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      b[i]++;
6024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      break;
6034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    default:
6044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      break;
6054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
6064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    for (int j = 0; j < 10; j++) {
6074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (c[i] > 10)
6084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        throw c[i];
6094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
6104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
6114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (c[9] > 10)
6124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    throw c[9]; // OK
6134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd
6154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0; i < 10; ++i) {
6164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    struct S {
6174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      void g() { throw 0; }
6184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    };
6194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
6204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid test_loop_firstprivate_lastprivate() {
6234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  S s(4);
6244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp target parallel for simd lastprivate(s) firstprivate(s)
6254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (int i = 0; i < 16; ++i)
6264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ;
6274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
628