1b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -fsyntax-only -fopenmp -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify %s 2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass S { 4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int a; 5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S() : a(0) {} 6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S(int v) : a(v) {} 9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S(const S &s) : a(s.a) {} 10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 12176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic int sii; 134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+1 {{defined as threadprivate or thread local}} 14b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#pragma omp threadprivate(sii) 15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic int globalii; 16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint test_iteration_spaces() { 18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const int N = 100; 19176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines float a[N], b[N], c[N]; 20176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int ii, jj, kk; 21176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines float fii; 22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines double dii; 23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 24176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i < 10; i += 1) { 25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i] + b[i]; 26176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (char i = 0; i < 10; i++) { 29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i] + b[i]; 30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 32176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (char i = 0; i < 10; i += '\1') { 33176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i] + b[i]; 34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 35176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 36176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (long long i = 0; i < 10; i++) { 37176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i] + b[i]; 38176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 39176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'double'}} 40176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (long long i = 0; i < 10; i += 1.5) { 42176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i] + b[i]; 43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (long long i = 0; i < 'z'; i += 1u) { 46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i] + b[i]; 47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{variable must be of integer or random access iterator type}} 49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (float fi = 0; fi < 10.0; fi++) { 51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[(int)fi] = a[(int)fi] + b[(int)fi]; 52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{variable must be of integer or random access iterator type}} 54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (double fi = 0; fi < 10.0; fi++) { 56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[(int)fi] = a[(int)fi] + b[(int)fi]; 57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int &ref = ii; ref < 10; ref++) { 61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i; i < 10; i++) 65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i]; 66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0, j = 0; i < 10; ++i) 70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i]; 71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 73176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 74176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (; ii < 10; ++ii) 75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 76176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-warning@+3 {{expression result unused}} 7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii + 1; ii < 10; ++ii) 81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 84176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (c[ii] = 0; ii < 10; ++ii) 86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 87176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 88176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Ok to skip parenthesises. 89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (((ii)) = 0; ii < 10; ++ii) 91176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 93176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} 94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 95176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i; i++) 96176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i]; 97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 98176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} 99176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'i'}} 100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; jj < kk; ii++) 102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i]; 103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} 105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; !!i; i++) 107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i]; 108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} 110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i != 1; i++) 112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i]; 113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'i'}} 115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0;; i++) 117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i]; 118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Ok. 120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 11; i > 10; i--) 122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i]; 123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Ok. 125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i < 10; ++i) 127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i]; 128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Ok. 130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ++ii) 132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ++jj) 137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[jj]; 138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ++++ii) 142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Ok but undefined behavior (in general, cannot check that incr 145176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// is really loop-invariant). 146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii = ii + ii) 148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{expression must have integral or unscoped enumeration type, not 'float'}} 151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii = ii + 1.0f) 153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Ok - step was converted to integer type. 156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii = ii + (int)1.1f) 158176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 159176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 161176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 162176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; jj = ii + 2) 163176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 164176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 165176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-warning@+3 {{relational comparison result unused}} 166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 168176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii<10; jj> kk + 2) 169176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 170176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 171176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 172176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10;) 174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 175176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 176176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-warning@+3 {{expression result unused}} 177176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; !ii) 180176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 181176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 184176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii ? ++ii : ++jj) 185176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 186176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 187176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'ii'}} 188176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 189176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii = ii < 10) 190176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 191176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 192176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}} 193176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 195176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii = ii + 0) 196176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 197176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 198176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}} 199176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 200176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 201176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii = ii + (int)(0.8 - 0.45)) 202176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 203176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 204176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}} 205176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 206176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 207176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; (ii) < 10; ii -= 25) 208176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 209176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 210176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}} 211176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 213176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; (ii < 10); ii -= 0) 214176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 215176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 216176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}} 217176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}} 218176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 219176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii > 10; (ii += 0)) 220176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 221176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 222176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}} 223176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 224176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 225176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; (ii) = (1 - 1) + (ii)) 226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 227176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 228176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}} 229176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'ii' to decrease on each iteration of OpenMP for loop}} 230176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 231176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for ((ii = 0); ii > 10; (ii -= 0)) 232176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 233176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 234176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}} 235176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'ii' to increase on each iteration of OpenMP for loop}} 236176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 237176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; (ii < 10); (ii -= 0)) 238176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 239176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 240176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+2 {{defined as firstprivate}} 241176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{loop iteration variable in the associated loop of 'omp parallel for simd' directive may not be firstprivate, predetermined as linear}} 242176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd firstprivate(ii) 243176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii++) 244176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 246176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd linear(ii) 247176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii++) 248176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 250176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+2 {{defined as private}} 251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{loop iteration variable in the associated loop of 'omp parallel for simd' directive may not be private, predetermined as linear}} 252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd private(ii) 253176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii++) 254176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 255176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+2 {{defined as lastprivate}} 257176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{loop iteration variable in the associated loop of 'omp parallel for simd' directive may not be lastprivate, predetermined as linear}} 258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd lastprivate(ii) 259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii++) 260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[ii] = a[ii]; 261176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines { 2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+2 {{loop iteration variable in the associated loop of 'omp parallel for simd' directive may not be threadprivate or thread local, predetermined as linear}} 264176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (sii = 0; sii < 10; sii += 1) 266176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[sii] = a[sii]; 267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines { 270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (globalii = 0; globalii < 10; globalii += 1) 272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[globalii] = a[globalii]; 273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 275176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines { 276176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd collapse(2) 277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (ii = 0; ii < 10; ii += 1) 278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (globalii = 0; globalii < 10; globalii += 1) 279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[globalii] += a[globalii] + ii; 280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{statement after '#pragma omp parallel for simd' must be a for loop}} 283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 284176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (auto &item : a) { 285176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines item = item + 1; 286176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 287176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 288176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}} 289176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'i' to increase on each iteration of OpenMP for loop}} 290176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 291176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (unsigned i = 9; i < 10; i--) { 292176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i] + b[i]; 293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int(*lb)[4] = nullptr; 296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int(*p)[4] = lb; p < lb + 8; ++p) { 298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 299176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 300176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 302176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int a{0}; a < 10; ++a) { 303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 304176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return 0; 306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 307176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 308176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Iterators allowed in openmp for-loops. 309176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace std { 310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct random_access_iterator_tag {}; 311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <class Iter> 312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct iterator_traits { 313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines typedef typename Iter::difference_type difference_type; 314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines typedef typename Iter::iterator_category iterator_category; 315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 316176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <class Iter> 317176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestypename iterator_traits<Iter>::difference_type 318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesdistance(Iter first, Iter last) { return first - last; } 319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 320176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass Iter0 { 321176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Iter0() {} 323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Iter0(const Iter0 &) {} 324176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Iter0 operator++() { return *this; } 325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Iter0 operator--() { return *this; } 326176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool operator<(Iter0 a) { return true; } 327176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 328176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'Iter0' for 1st argument}} 329176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'Iter0' for 1st argument}} 330176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint operator-(Iter0 a, Iter0 b) { return 0; } 331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass Iter1 { 332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 333176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Iter1(float f = 0.0f, double d = 0.0) {} 334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Iter1(const Iter1 &) {} 335176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Iter1 operator++() { return *this; } 336176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Iter1 operator--() { return *this; } 337176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool operator<(Iter1 a) { return true; } 338176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool operator>=(Iter1 a) { return false; } 339176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass GoodIter { 341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GoodIter() {} 343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GoodIter(const GoodIter &) {} 344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GoodIter(int fst, int snd) {} 345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GoodIter &operator=(const GoodIter &that) { return *this; } 346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GoodIter &operator=(const Iter0 &that) { return *this; } 347176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GoodIter &operator+=(int x) { return *this; } 348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines explicit GoodIter(void *) {} 349176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GoodIter operator++() { return *this; } 350176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GoodIter operator--() { return *this; } 351176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool operator!() { return true; } 352176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool operator<(GoodIter a) { return true; } 353176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool operator<=(GoodIter a) { return true; } 354176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool operator>=(GoodIter a) { return false; } 355176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines typedef int difference_type; 356176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines typedef std::random_access_iterator_tag iterator_category; 357176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 3584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'GoodIter' for 2nd argument}} 359176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}} 360176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint operator-(GoodIter a, GoodIter b) { return 0; } 361176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 3 {{candidate function not viable: requires single argument 'a', but 2 arguments were provided}} 362176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesGoodIter operator-(GoodIter a) { return a; } 3634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-note@+2 {{candidate function not viable: no known conversion from 'const Iter0' to 'int' for 2nd argument}} 364176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'GoodIter' for 1st argument}} 365176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesGoodIter operator-(GoodIter a, int v) { return GoodIter(); } 366176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'GoodIter' for 1st argument}} 367176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesGoodIter operator+(GoodIter a, int v) { return GoodIter(); } 368176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+2 {{candidate function not viable: no known conversion from 'GoodIter' to 'int' for 1st argument}} 369176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter1' to 'int' for 1st argument}} 370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesGoodIter operator-(int v, GoodIter a) { return GoodIter(); } 371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+1 2 {{candidate function not viable: no known conversion from 'Iter0' to 'int' for 1st argument}} 372176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesGoodIter operator+(int v, GoodIter a) { return GoodIter(); } 373176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint test_with_random_access_iterator() { 375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GoodIter begin, end; 376176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Iter0 begin0, end0; 377176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 378176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I = begin; I < end; ++I) 379176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 38087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 381176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 382176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter &I = begin; I < end; ++I) 383176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 384176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 385176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I = begin; I >= end; --I) 386176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 387176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 388176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 389176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I(begin); I < end; ++I) 390176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 391176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 392176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 393176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I(nullptr); I < end; ++I) 394176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 395176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 396176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 397176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I(0); I < end; ++I) 398176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 400176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 401176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I(1, 2); I < end; ++I) 402176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 403176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 404176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (begin = GoodIter(0); begin < end; ++begin) 405176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++begin; 4064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-error@+3 {{invalid operands to binary expression ('GoodIter' and 'const Iter0')}} 407176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} 408176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 409176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (begin = begin0; begin < end; ++begin) 410176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++begin; 41187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 412176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 413176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (++begin; begin < end; ++begin) 414176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++begin; 415176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 416176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (begin = end; begin < end; ++begin) 417176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++begin; 418176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} 419176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 420176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I = begin; I - I; ++I) 421176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 422176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} 423176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 424176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I = begin; begin < end; ++I) 425176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 426176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', or '>=') of loop variable 'I'}} 427176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 428176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I = begin; !I; ++I) 429176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 430176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}} 431176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 432176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 433176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I = begin; I >= end; I = I + 1) 434176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 435176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 436176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I = begin; I >= end; I = I - 1) 437176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 438176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}} 439176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 440176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I = begin; I >= end; I = -I) 441176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 442176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}} 443176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 444176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 445176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I = begin; I >= end; I = 2 + I) 446176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 447176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable 'I'}} 448176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 449176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (GoodIter I = begin; I >= end; I = 2 - I) 450176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 451176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{invalid operands to binary expression ('Iter0' and 'int')}} 452176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 453176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (Iter0 I = begin0; I < end0; ++I) 454176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 455176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Initializer is constructor without params. 456176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+3 {{invalid operands to binary expression ('Iter0' and 'int')}} 457176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 458176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (Iter0 I; I < end0; ++I) 460176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Iter1 begin1, end1; 462176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+3 {{invalid operands to binary expression ('Iter1' and 'Iter1')}} 463176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} 464176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 465176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (Iter1 I = begin1; I < end1; ++I) 466176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 467176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}} 468176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 469176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 470176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (Iter1 I = begin1; I >= end1; ++I) 471176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 47287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// expected-error@+5 {{invalid operands to binary expression ('Iter1' and 'float')}} 473176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+4 {{could not calculate number of iterations calling 'operator-' with upper and lower loop bounds}} 474176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Initializer is constructor with all default params. 475176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-warning@+2 {{initialization clause of OpenMP for loop is not in canonical form ('var = init' or 'T var = init')}} 476176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 477176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (Iter1 I; I < end1; ++I) { 478176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 479176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return 0; 480176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 481176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 482176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename IT, int ST> 483176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass TC { 484176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic: 485176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines int dotest_lt(IT begin, IT end) { 486176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}} 487176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}} 488176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 489176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (IT I = begin; I < end; I = I + ST) { 490176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 491176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 492176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be positive due to this condition}} 493176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'I' to increase on each iteration of OpenMP for loop}} 494176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 495176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (IT I = begin; I <= end; I += ST) { 496176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 497176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 498176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 499176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (IT I = begin; I < end; ++I) { 500176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 501176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 502176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 503176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 504176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines static IT step() { 505176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return IT(ST); 506176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 507176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 508176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename IT, int ST = 0> 509176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint dotest_gt(IT begin, IT end) { 510176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 2 {{loop step is expected to be negative due to this condition}} 511176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 512176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 513176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (IT I = begin; I >= end; I = I + ST) { 514176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 515176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 516176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 2 {{loop step is expected to be negative due to this condition}} 517176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 518176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 519176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (IT I = begin; I >= end; I += ST) { 520176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 521176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 522176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 523176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-note@+3 {{loop step is expected to be negative due to this condition}} 524176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+2 {{increment expression must cause 'I' to decrease on each iteration of OpenMP for loop}} 525176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 526176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (IT I = begin; I >= end; ++I) { 527176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 528176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 529176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 530176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 531176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (IT I = begin; I < end; I += TC<int, ST>::step()) { 532176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ++I; 533176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 534176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 535176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 536176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid test_with_template() { 537176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines GoodIter begin, end; 538176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TC<GoodIter, 100> t1; 539176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TC<GoodIter, -100> t2; 540176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines t1.dotest_lt(begin, end); 541176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines t2.dotest_lt(begin, end); // expected-note {{in instantiation of member function 'TC<GoodIter, -100>::dotest_lt' requested here}} 542176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines dotest_gt(begin, end); // expected-note {{in instantiation of function template specialization 'dotest_gt<GoodIter, 0>' requested here}} 543176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines dotest_gt<unsigned, -10>(0, 100); // expected-note {{in instantiation of function template specialization 'dotest_gt<unsigned int, -10>' requested here}} 544176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 545176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 546176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid test_loop_break() { 547176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const int N = 100; 548176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines float a[N], b[N], c[N]; 549176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 550176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i < 10; i++) { 551176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i] + b[i]; 552176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int j = 0; j < 10; ++j) { 553176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (a[i] > b[j]) 554176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; // OK in nested loop 555176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 556176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines switch (i) { 557176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case 1: 558176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines b[i]++; 559176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 560176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines default: 561176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 562176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 563176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (c[i] > 10) 564176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; // expected-error {{'break' statement cannot be used in OpenMP for loop}} 565176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 566176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (c[i] > 11) 567176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; // expected-error {{'break' statement cannot be used in OpenMP for loop}} 568176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 569176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 570176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 571176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i < 10; i++) { 572176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int j = 0; j < 10; j++) { 573176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i] + b[i]; 574176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (c[i] > 10) { 575176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (c[i] < 20) { 576176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; // OK 577176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 578176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 579176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 580176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 581176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 582176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 583176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid test_loop_eh() { 584176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const int N = 100; 585176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines float a[N], b[N], c[N]; 586176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 587176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i < 10; i++) { 588176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines c[i] = a[i] + b[i]; 589176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines try { // expected-error {{'try' statement cannot be used in OpenMP simd region}} 590176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int j = 0; j < 10; ++j) { 591176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (a[i] > b[j]) 592176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines throw a[i]; // expected-error {{'throw' statement cannot be used in OpenMP simd region}} 593176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 594176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines throw a[i]; // expected-error {{'throw' statement cannot be used in OpenMP simd region}} 595176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } catch (float f) { 596176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (f > 0.1) 597176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines throw a[i]; // expected-error {{'throw' statement cannot be used in OpenMP simd region}} 598176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return; // expected-error {{cannot return from OpenMP region}} 599176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 600176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines switch (i) { 601176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case 1: 602176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines b[i]++; 603176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 604176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines default: 605176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines break; 606176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 607176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int j = 0; j < 10; j++) { 608176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (c[i] > 10) 609176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines throw c[i]; // expected-error {{'throw' statement cannot be used in OpenMP simd region}} 610176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 611176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 612176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (c[9] > 10) 613176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines throw c[9]; // OK 614176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 615176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd 616176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i < 10; ++i) { 617176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct S { 618176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void g() { throw 0; } 619176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 620176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 621176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 622176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 623176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid test_loop_firstprivate_lastprivate() { 624176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S s(4); 625176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd lastprivate(s) firstprivate(s) 626176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i < 16; ++i) 627176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ; 628176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 629176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 630176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid test_ordered() { 631176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd ordered ordered // expected-error {{directive '#pragma omp parallel for simd' cannot contain more than one 'ordered' clause}} 632176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i < 16; ++i) 633176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ; 6344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp parallel for simd ordered 6354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (int i = 0; i < 16; ++i) 6364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ; 6374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//expected-error@+1 {{'ordered' clause with a parameter can not be specified in '#pragma omp parallel for simd' directive}} 6384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp parallel for simd ordered(1) 6394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (int i = 0; i < 16; ++i) 6404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ; 641176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 642176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 643176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid test_nowait() { 644176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// expected-error@+1 2 {{unexpected OpenMP clause 'nowait' in directive '#pragma omp parallel for simd'}} 645176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel for simd nowait nowait // expected-error {{directive '#pragma omp parallel for simd' cannot contain more than one 'nowait' clause}} 646176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (int i = 0; i < 16; ++i) 647176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ; 648176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 649176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 650