110e775f4SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp %s 2*bbf78cdaSCharles Li // RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s 3*bbf78cdaSCharles Li // RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s 410e775f4SAlexey Bataev 510e775f4SAlexey Bataev void foo() { 610e775f4SAlexey Bataev } 710e775f4SAlexey Bataev 8*bbf78cdaSCharles Li #if __cplusplus >= 201103L 9*bbf78cdaSCharles Li // expected-note@+2 4 {{declared here}} 10*bbf78cdaSCharles Li #endif 1110e775f4SAlexey Bataev bool foobool(int argc) { 1210e775f4SAlexey Bataev return argc; 1310e775f4SAlexey Bataev } 1410e775f4SAlexey Bataev 1510e775f4SAlexey Bataev struct S1; // expected-note {{declared here}} 1610e775f4SAlexey Bataev 1710e775f4SAlexey Bataev template <class T, typename S, int N, int ST> // expected-note {{declared here}} 1810e775f4SAlexey Bataev T tmain(T argc, S **argv) { //expected-note 2 {{declared here}} 1910e775f4SAlexey Bataev #pragma omp for ordered 2010e775f4SAlexey Bataev for (int i = ST; i < N; i++) 2110e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 2210e775f4SAlexey Bataev #pragma omp for ordered( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 2310e775f4SAlexey Bataev for (int i = ST; i < N; i++) 2410e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 2510e775f4SAlexey Bataev #pragma omp for ordered() // expected-error {{expected expression}} 2610e775f4SAlexey Bataev for (int i = ST; i < N; i++) 2710e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 2810e775f4SAlexey Bataev // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}} 2910e775f4SAlexey Bataev // expected-error@+2 2 {{expression is not an integral constant expression}} 3010e775f4SAlexey Bataev // expected-note@+1 2 {{read of non-const variable 'argc' is not allowed in a constant expression}} 3110e775f4SAlexey Bataev #pragma omp for ordered(argc 3210e775f4SAlexey Bataev for (int i = ST; i < N; i++) 3310e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 34a056935aSAlexey Bataev // expected-error@+1 2 {{argument to 'ordered' clause must be a strictly positive integer value}} 3510e775f4SAlexey Bataev #pragma omp for ordered(ST // expected-error {{expected ')'}} expected-note {{to match this '('}} 3610e775f4SAlexey Bataev for (int i = ST; i < N; i++) 3710e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 3810e775f4SAlexey Bataev #pragma omp for ordered(1)) // expected-warning {{extra tokens at the end of '#pragma omp for' are ignored}} 3910e775f4SAlexey Bataev for (int i = ST; i < N; i++) 4010e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 4110e775f4SAlexey Bataev #pragma omp for ordered((ST > 0) ? 1 + ST : 2) // expected-note 2 {{as specified in 'ordered' clause}} 4210e775f4SAlexey Bataev for (int i = ST; i < N; i++) 4310e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; // expected-error 2 {{expected 2 for loops after '#pragma omp for', but found only 1}} 44*bbf78cdaSCharles Li // expected-error@+6 2 {{directive '#pragma omp for' cannot contain more than one 'ordered' clause}} 45*bbf78cdaSCharles Li // expected-error@+5 2 {{argument to 'ordered' clause must be a strictly positive integer value}} 46*bbf78cdaSCharles Li // expected-error@+4 2 {{expression is not an integral constant expression}} 47*bbf78cdaSCharles Li #if __cplusplus >= 201103L 48*bbf78cdaSCharles Li // expected-note@+2 2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} 49*bbf78cdaSCharles Li #endif 5010e775f4SAlexey Bataev #pragma omp for ordered(foobool(argc)), ordered(true), ordered(-5) 5110e775f4SAlexey Bataev for (int i = ST; i < N; i++) 5210e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 5310e775f4SAlexey Bataev #pragma omp for ordered(S) // expected-error {{'S' does not refer to a value}} 5410e775f4SAlexey Bataev for (int i = ST; i < N; i++) 5510e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 56*bbf78cdaSCharles Li #if __cplusplus <= 199711L 57*bbf78cdaSCharles Li // expected-error@+4 2 {{expression is not an integral constant expression}} 58*bbf78cdaSCharles Li #else 59*bbf78cdaSCharles Li // expected-error@+2 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}} 60*bbf78cdaSCharles Li #endif 6110e775f4SAlexey Bataev #pragma omp for ordered(argv[1] = 2) // expected-error {{expected ')'}} expected-note {{to match this '('}} 6210e775f4SAlexey Bataev for (int i = ST; i < N; i++) 6310e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 6410e775f4SAlexey Bataev #pragma omp for ordered(1) 6510e775f4SAlexey Bataev for (int i = ST; i < N; i++) 6610e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 67a056935aSAlexey Bataev #pragma omp for ordered(N-1) // expected-error 2 {{argument to 'ordered' clause must be a strictly positive integer value}} 687b6bc88cSAlexey Bataev for (int i = ST; i < N; i++) 697b6bc88cSAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 70a056935aSAlexey Bataev #pragma omp for ordered(N) // expected-error {{argument to 'ordered' clause must be a strictly positive integer value}} 7110e775f4SAlexey Bataev for (T i = ST; i < N; i++) 7210e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - ST]; 7310e775f4SAlexey Bataev #pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}} 7410e775f4SAlexey Bataev foo(); // expected-error {{expected 2 for loops after '#pragma omp for'}} 75a056935aSAlexey Bataev #pragma omp for ordered(N) collapse(N + 2) // expected-error {{the parameter of the 'ordered' clause must be greater than or equal to the parameter of the 'collapse' clause}} expected-note {{parameter of the 'collapse' clause}} expected-error {{argument to 'ordered' clause must be a strictly positive integer value}} 767b6bc88cSAlexey Bataev for (int i = ST; i < N; i++) 777b6bc88cSAlexey Bataev for (int j = ST; j < N; j++) 787b6bc88cSAlexey Bataev for (int k = ST; k < N; k++) 797b6bc88cSAlexey Bataev foo(); 8010e775f4SAlexey Bataev return argc; 8110e775f4SAlexey Bataev } 8210e775f4SAlexey Bataev 8310e775f4SAlexey Bataev int main(int argc, char **argv) { 8410e775f4SAlexey Bataev #pragma omp for ordered 8510e775f4SAlexey Bataev for (int i = 4; i < 12; i++) 8610e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - 4]; 8710e775f4SAlexey Bataev #pragma omp for ordered( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 8810e775f4SAlexey Bataev for (int i = 4; i < 12; i++) 8910e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - 4]; 9010e775f4SAlexey Bataev #pragma omp for ordered() // expected-error {{expected expression}} 9110e775f4SAlexey Bataev for (int i = 4; i < 12; i++) 9210e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - 4]; 9310e775f4SAlexey Bataev #pragma omp for ordered(4 // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-note {{as specified in 'ordered' clause}} 9410e775f4SAlexey Bataev for (int i = 4; i < 12; i++) 9510e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - 4]; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}} 9610e775f4SAlexey Bataev #pragma omp for ordered(2 + 2)) // expected-warning {{extra tokens at the end of '#pragma omp for' are ignored}} expected-note {{as specified in 'ordered' clause}} 9710e775f4SAlexey Bataev for (int i = 4; i < 12; i++) 9810e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - 4]; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}} 99*bbf78cdaSCharles Li // expected-error@+4 {{expression is not an integral constant expression}} 100*bbf78cdaSCharles Li #if __cplusplus >= 201103L 101*bbf78cdaSCharles Li // expected-note@+2 {{non-constexpr function 'foobool' cannot be used in a constant expression}} 102*bbf78cdaSCharles Li #endif 103*bbf78cdaSCharles Li #pragma omp for ordered(foobool(1) > 0 ? 1 : 2) 10410e775f4SAlexey Bataev for (int i = 4; i < 12; i++) 10510e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - 4]; 106*bbf78cdaSCharles Li // expected-error@+6 {{expression is not an integral constant expression}} 107*bbf78cdaSCharles Li #if __cplusplus >= 201103L 108*bbf78cdaSCharles Li // expected-note@+4 {{non-constexpr function 'foobool' cannot be used in a constant expression}} 109*bbf78cdaSCharles Li #endif 11010e775f4SAlexey Bataev // expected-error@+2 2 {{directive '#pragma omp for' cannot contain more than one 'ordered' clause}} 111a056935aSAlexey Bataev // expected-error@+1 2 {{argument to 'ordered' clause must be a strictly positive integer value}} 11210e775f4SAlexey Bataev #pragma omp for ordered(foobool(argc)), ordered(true), ordered(-5) 11310e775f4SAlexey Bataev for (int i = 4; i < 12; i++) 11410e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - 4]; 11510e775f4SAlexey Bataev #pragma omp for ordered(S1) // expected-error {{'S1' does not refer to a value}} 11610e775f4SAlexey Bataev for (int i = 4; i < 12; i++) 11710e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - 4]; 118*bbf78cdaSCharles Li #if __cplusplus <= 199711L 119*bbf78cdaSCharles Li // expected-error@+4 {{expression is not an integral constant expression}} 120*bbf78cdaSCharles Li #else 121*bbf78cdaSCharles Li // expected-error@+2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}} 122*bbf78cdaSCharles Li #endif 12310e775f4SAlexey Bataev #pragma omp for ordered(argv[1] = 2) // expected-error {{expected ')'}} expected-note {{to match this '('}} 12410e775f4SAlexey Bataev for (int i = 4; i < 12; i++) 12510e775f4SAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - 4]; 12610e775f4SAlexey Bataev // expected-error@+3 {{statement after '#pragma omp for' must be a for loop}} 12710e775f4SAlexey Bataev // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}} 12810e775f4SAlexey Bataev #pragma omp for ordered(ordered(tmain < int, char, -1, -2 > (argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}} 12910e775f4SAlexey Bataev foo(); 13010e775f4SAlexey Bataev #pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}} 13110e775f4SAlexey Bataev foo(); // expected-error {{expected 2 for loops after '#pragma omp for'}} 132a056935aSAlexey Bataev #pragma omp for ordered(0) // expected-error {{argument to 'ordered' clause must be a strictly positive integer value}} 1337b6bc88cSAlexey Bataev for (int i = 4; i < 12; i++) 1347b6bc88cSAlexey Bataev argv[0][i] = argv[0][i] - argv[0][i - 4]; 1357b6bc88cSAlexey Bataev #pragma omp for ordered(2) collapse(3) // expected-error {{the parameter of the 'ordered' clause must be greater than or equal to the parameter of the 'collapse' clause}} expected-note {{parameter of the 'collapse' clause}} 1367b6bc88cSAlexey Bataev for (int i = 0; i < 10; i++) 1377b6bc88cSAlexey Bataev for (int j = 0; j < 11; j++) 1387b6bc88cSAlexey Bataev for (int k = 0; k < 12; k++) 1397b6bc88cSAlexey Bataev foo(); 14010e775f4SAlexey Bataev // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 1, 0>' requested here}} 14110e775f4SAlexey Bataev return tmain<int, char, 1, 0>(argc, argv); 14210e775f4SAlexey Bataev } 14310e775f4SAlexey Bataev 144