15c93a94fSMichael Kruse // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++17 -fopenmp -fopenmp-version=60 -fsyntax-only -Wuninitialized -verify %s 25c93a94fSMichael Kruse 35c93a94fSMichael Kruse void func() { 45c93a94fSMichael Kruse 5*5b03efb8SMichael Kruse // expected-error@+1 {{expected '('}} 6*5b03efb8SMichael Kruse #pragma omp interchange permutation 7*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 8*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 9*5b03efb8SMichael Kruse ; 10*5b03efb8SMichael Kruse 11*5b03efb8SMichael Kruse // expected-error@+2 {{expected expression}} 12*5b03efb8SMichael Kruse // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 13*5b03efb8SMichael Kruse #pragma omp interchange permutation( 14*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 15*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 16*5b03efb8SMichael Kruse ; 17*5b03efb8SMichael Kruse 18*5b03efb8SMichael Kruse // expected-error@+1 {{expected expression}} 19*5b03efb8SMichael Kruse #pragma omp interchange permutation() 20*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 21*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 22*5b03efb8SMichael Kruse ; 23*5b03efb8SMichael Kruse 24*5b03efb8SMichael Kruse // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 25*5b03efb8SMichael Kruse #pragma omp interchange permutation(1 26*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 27*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 28*5b03efb8SMichael Kruse ; 29*5b03efb8SMichael Kruse 30*5b03efb8SMichael Kruse // expected-error@+2 {{expected expression}} 31*5b03efb8SMichael Kruse // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 32*5b03efb8SMichael Kruse #pragma omp interchange permutation(1, 33*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 34*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 35*5b03efb8SMichael Kruse ; 36*5b03efb8SMichael Kruse 37*5b03efb8SMichael Kruse // expected-error@+1 {{expected expression}} 38*5b03efb8SMichael Kruse #pragma omp interchange permutation(1,) 39*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 40*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 41*5b03efb8SMichael Kruse ; 42*5b03efb8SMichael Kruse 43*5b03efb8SMichael Kruse // expected-error@+2 {{expected expression}} 44*5b03efb8SMichael Kruse // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 45*5b03efb8SMichael Kruse #pragma omp interchange permutation(5+ 46*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 47*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 48*5b03efb8SMichael Kruse ; 49*5b03efb8SMichael Kruse 50*5b03efb8SMichael Kruse // expected-error@+1 {{expected expression}} 51*5b03efb8SMichael Kruse #pragma omp interchange permutation(5+) 52*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 53*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 54*5b03efb8SMichael Kruse ; 55*5b03efb8SMichael Kruse 56*5b03efb8SMichael Kruse // expected-error@+1 {{expected expression}} 57*5b03efb8SMichael Kruse #pragma omp interchange permutation(for) 58*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 59*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 60*5b03efb8SMichael Kruse ; 61*5b03efb8SMichael Kruse 62*5b03efb8SMichael Kruse // expected-error@+1 {{permutation index must be at least 1 and at most 1}} 63*5b03efb8SMichael Kruse #pragma omp interchange permutation(0) 64*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 65*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 66*5b03efb8SMichael Kruse ; 67*5b03efb8SMichael Kruse 68*5b03efb8SMichael Kruse // expected-error@+1 {{permutation index must be at least 1 and at most 2}} 69*5b03efb8SMichael Kruse #pragma omp interchange permutation(1,3) 70*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 71*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 72*5b03efb8SMichael Kruse ; 73*5b03efb8SMichael Kruse 74*5b03efb8SMichael Kruse // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}} 75*5b03efb8SMichael Kruse #pragma omp interchange permutation(1,1) 76*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 77*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 78*5b03efb8SMichael Kruse ; 79*5b03efb8SMichael Kruse 80*5b03efb8SMichael Kruse // expected-error@+4 {{expression is not an integral constant expression}} 81*5b03efb8SMichael Kruse // expected-note@+3 {{read of non-const variable 'a' is not allowed in a constant expression}} 82*5b03efb8SMichael Kruse // expected-note@+1 {{declared here}} 83*5b03efb8SMichael Kruse int a; 84*5b03efb8SMichael Kruse #pragma omp interchange permutation(a) 85*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 86*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 87*5b03efb8SMichael Kruse ; 88*5b03efb8SMichael Kruse 895c93a94fSMichael Kruse // expected-warning@+1 {{extra tokens at the end of '#pragma omp interchange' are ignored}} 905c93a94fSMichael Kruse #pragma omp interchange foo 915c93a94fSMichael Kruse for (int i = 0; i < 7; ++i) 925c93a94fSMichael Kruse for (int j = 0; j < 13; ++j) 935c93a94fSMichael Kruse ; 945c93a94fSMichael Kruse 95*5b03efb8SMichael Kruse // expected-error@+1 {{directive '#pragma omp interchange' cannot contain more than one 'permutation' clause}} 96*5b03efb8SMichael Kruse #pragma omp interchange permutation(2,1) permutation(2,1) 97*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 98*5b03efb8SMichael Kruse for (int j = 0; j < 13; ++j) 99*5b03efb8SMichael Kruse ; 100*5b03efb8SMichael Kruse 1015c93a94fSMichael Kruse // expected-error@+1 {{unexpected OpenMP clause 'collapse' in directive '#pragma omp interchange'}} 1025c93a94fSMichael Kruse #pragma omp interchange collapse(2) 1035c93a94fSMichael Kruse for (int i = 0; i < 7; ++i) 1045c93a94fSMichael Kruse for (int j = 0; j < 13; ++j) 1055c93a94fSMichael Kruse ; 1065c93a94fSMichael Kruse 1075c93a94fSMichael Kruse { 1085c93a94fSMichael Kruse // expected-error@+2 {{expected statement}} 1095c93a94fSMichael Kruse #pragma omp interchange 1105c93a94fSMichael Kruse } 1115c93a94fSMichael Kruse 1125c93a94fSMichael Kruse // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}} 1135c93a94fSMichael Kruse #pragma omp interchange 1145c93a94fSMichael Kruse int b = 0; 1155c93a94fSMichael Kruse 1165c93a94fSMichael Kruse // expected-error@+3 {{statement after '#pragma omp interchange' must be a for loop}} 1175c93a94fSMichael Kruse #pragma omp interchange 1185c93a94fSMichael Kruse for (int i = 0; i < 7; ++i) 1195c93a94fSMichael Kruse ; 1205c93a94fSMichael Kruse 1215c93a94fSMichael Kruse // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}} 1225c93a94fSMichael Kruse #pragma omp interchange 1235c93a94fSMichael Kruse for (int i = 0; i < 7; ++i) { 1245c93a94fSMichael Kruse int k = 3; 1255c93a94fSMichael Kruse for (int j = 0; j < 7; ++j) 1265c93a94fSMichael Kruse ; 1275c93a94fSMichael Kruse } 1285c93a94fSMichael Kruse 1295c93a94fSMichael Kruse // expected-error@+3 {{expected loop invariant expression}} 1305c93a94fSMichael Kruse #pragma omp interchange 1315c93a94fSMichael Kruse for (int i = 0; i < 7; ++i) 1325c93a94fSMichael Kruse for (int j = i; j < 7; ++j) 1335c93a94fSMichael Kruse ; 1345c93a94fSMichael Kruse 1355c93a94fSMichael Kruse // expected-error@+3 {{expected loop invariant expression}} 1365c93a94fSMichael Kruse #pragma omp interchange 1375c93a94fSMichael Kruse for (int i = 0; i < 7; ++i) 1385c93a94fSMichael Kruse for (int j = 0; j < i; ++j) 1395c93a94fSMichael Kruse ; 1405c93a94fSMichael Kruse 1415c93a94fSMichael Kruse // expected-error@+3 {{expected loop invariant expression}} 1425c93a94fSMichael Kruse #pragma omp interchange 1435c93a94fSMichael Kruse for (int i = 0; i < 7; ++i) 1445c93a94fSMichael Kruse for (int j = 0; j < i; ++j) 1455c93a94fSMichael Kruse ; 1465c93a94fSMichael Kruse 1475c93a94fSMichael Kruse // expected-error@+6 {{expected 3 for loops after '#pragma omp for', but found only 2}} 1485c93a94fSMichael Kruse // expected-note@+1 {{as specified in 'collapse' clause}} 1495c93a94fSMichael Kruse #pragma omp for collapse(3) 1505c93a94fSMichael Kruse #pragma omp interchange 1515c93a94fSMichael Kruse for (int i = 0; i < 7; ++i) 1525c93a94fSMichael Kruse for (int j = 0; j < 13; ++j) 1535c93a94fSMichael Kruse ; 1545c93a94fSMichael Kruse 1555c93a94fSMichael Kruse // expected-error@+2 {{statement after '#pragma omp interchange' must be a for loop}} 1565c93a94fSMichael Kruse #pragma omp interchange 1575c93a94fSMichael Kruse #pragma omp for 1585c93a94fSMichael Kruse for (int i = 0; i < 7; ++i) 1595c93a94fSMichael Kruse ; 1605c93a94fSMichael Kruse 1615c93a94fSMichael Kruse // expected-error@+3 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'j'}} 1625c93a94fSMichael Kruse #pragma omp interchange 1635c93a94fSMichael Kruse for (int i = 0; i < 7; ++i) 1645c93a94fSMichael Kruse for (int j = 0; j/3<7; ++j) 1655c93a94fSMichael Kruse ; 1665c93a94fSMichael Kruse } 1675c93a94fSMichael Kruse 168*5b03efb8SMichael Kruse 169*5b03efb8SMichael Kruse 170*5b03efb8SMichael Kruse template <typename T> 171*5b03efb8SMichael Kruse static void templated_func() { 172*5b03efb8SMichael Kruse // In a template context, but expression itself not instantiation-dependent 173*5b03efb8SMichael Kruse 174*5b03efb8SMichael Kruse // expected-error@+1 {{permutation index must be at least 1 and at most 2}} 175*5b03efb8SMichael Kruse #pragma omp interchange permutation(0,1) 176*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 177*5b03efb8SMichael Kruse for (int j = 0; j<7; ++j) 178*5b03efb8SMichael Kruse ; 179*5b03efb8SMichael Kruse 180*5b03efb8SMichael Kruse // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}} 181*5b03efb8SMichael Kruse #pragma omp interchange permutation(1,1) 182*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 183*5b03efb8SMichael Kruse for (int j = 0; j<7; ++j) 184*5b03efb8SMichael Kruse ; 185*5b03efb8SMichael Kruse } 186*5b03efb8SMichael Kruse 187*5b03efb8SMichael Kruse 188*5b03efb8SMichael Kruse 189*5b03efb8SMichael Kruse template <int S> 190*5b03efb8SMichael Kruse static void templated_func_value_dependent() { 191*5b03efb8SMichael Kruse // expected-error@+1 {{permutation index must be at least 1 and at most 2}} 192*5b03efb8SMichael Kruse #pragma omp interchange permutation(S,S+1) 193*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 194*5b03efb8SMichael Kruse for (int j = 0; j<7; ++j) 195*5b03efb8SMichael Kruse ; 196*5b03efb8SMichael Kruse 197*5b03efb8SMichael Kruse // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}} 198*5b03efb8SMichael Kruse #pragma omp interchange permutation(S+1,S+1) 199*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 200*5b03efb8SMichael Kruse for (int j = 0; j<7; ++j) 201*5b03efb8SMichael Kruse ; 202*5b03efb8SMichael Kruse } 203*5b03efb8SMichael Kruse 204*5b03efb8SMichael Kruse 205*5b03efb8SMichael Kruse template <typename T> 206*5b03efb8SMichael Kruse static void templated_func_type_dependent() { 207*5b03efb8SMichael Kruse constexpr T s = 0; 208*5b03efb8SMichael Kruse 209*5b03efb8SMichael Kruse // expected-error@+1 {{permutation index must be at least 1 and at most 2}} 210*5b03efb8SMichael Kruse #pragma omp interchange permutation(s,s+1) 211*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 212*5b03efb8SMichael Kruse for (int j = 0; j<7; ++j) 213*5b03efb8SMichael Kruse ; 214*5b03efb8SMichael Kruse 215*5b03efb8SMichael Kruse // expected-error@+1 {{index 1 must appear exactly once in the permutation clause}} 216*5b03efb8SMichael Kruse #pragma omp interchange permutation(s+1,s+1) 217*5b03efb8SMichael Kruse for (int i = 0; i < 7; ++i) 218*5b03efb8SMichael Kruse for (int j = 0; j<7; ++j) 219*5b03efb8SMichael Kruse ; 220*5b03efb8SMichael Kruse } 221*5b03efb8SMichael Kruse 222*5b03efb8SMichael Kruse 223*5b03efb8SMichael Kruse void template_inst() { 224*5b03efb8SMichael Kruse // expected-note@+1 {{in instantiation of function template specialization 'templated_func<int>' requested here}} 225*5b03efb8SMichael Kruse templated_func<int>(); 226*5b03efb8SMichael Kruse // expected-note@+1 {{in instantiation of function template specialization 'templated_func_value_dependent<0>' requested here}} 227*5b03efb8SMichael Kruse templated_func_value_dependent<0>(); 228*5b03efb8SMichael Kruse // expected-note@+1 {{in instantiation of function template specialization 'templated_func_type_dependent<int>' requested here}} 229*5b03efb8SMichael Kruse templated_func_type_dependent<int>(); 230*5b03efb8SMichael Kruse } 231*5b03efb8SMichael Kruse 232