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