110e775f4SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp %s
2bbf78cdaSCharles Li // RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s
3bbf78cdaSCharles Li // RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s
410e775f4SAlexey Bataev 
5a8a9153aSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd %s
6a8a9153aSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -std=c++98 %s
7a8a9153aSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -std=c++11 %s
8*ebf6fd63SRichard Smith 
9*ebf6fd63SRichard Smith // expected-note@* 0+{{declared here}}
10a8a9153aSAlexey Bataev // SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
11a8a9153aSAlexey Bataev 
foo()1210e775f4SAlexey Bataev void foo() {
1310e775f4SAlexey Bataev }
1410e775f4SAlexey Bataev 
foobool(int argc)1510e775f4SAlexey Bataev bool foobool(int argc) {
1610e775f4SAlexey Bataev   return argc;
1710e775f4SAlexey Bataev }
1810e775f4SAlexey Bataev 
19*ebf6fd63SRichard Smith struct S1;
2010e775f4SAlexey Bataev 
21*ebf6fd63SRichard Smith template <class T, typename S, int N, int ST>
tmain(T argc,S ** argv)22*ebf6fd63SRichard Smith T tmain(T argc, S **argv) {
2310e775f4SAlexey Bataev #pragma omp for ordered
2410e775f4SAlexey Bataev   for (int i = ST; i < N; i++)
2510e775f4SAlexey Bataev     argv[0][i] = argv[0][i] - argv[0][i - ST];
2610e775f4SAlexey Bataev #pragma omp for ordered( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
2710e775f4SAlexey Bataev   for (int i = ST; i < N; i++)
2810e775f4SAlexey Bataev     argv[0][i] = argv[0][i] - argv[0][i - ST];
2910e775f4SAlexey Bataev #pragma omp for ordered() // expected-error {{expected expression}}
3010e775f4SAlexey Bataev   for (int i = ST; i < N; i++)
3110e775f4SAlexey Bataev     argv[0][i] = argv[0][i] - argv[0][i - ST];
32*ebf6fd63SRichard Smith // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
33*ebf6fd63SRichard Smith // expected-error@+1 2 {{integral constant expression}} expected-note@+1 0+{{constant expression}}
3410e775f4SAlexey Bataev #pragma omp for ordered(argc
3510e775f4SAlexey Bataev   for (int i = ST; i < N; i++)
3610e775f4SAlexey Bataev     argv[0][i] = argv[0][i] - argv[0][i - ST];
37a056935aSAlexey Bataev // expected-error@+1 2 {{argument to 'ordered' clause must be a strictly positive integer value}}
3810e775f4SAlexey Bataev #pragma omp for ordered(ST // expected-error {{expected ')'}} expected-note {{to match this '('}}
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(1)) // expected-warning {{extra tokens at the end of '#pragma omp for' are ignored}}
4210e775f4SAlexey Bataev   for (int i = ST; i < N; i++)
4310e775f4SAlexey Bataev     argv[0][i] = argv[0][i] - argv[0][i - ST];
4410e775f4SAlexey Bataev #pragma omp for ordered((ST > 0) ? 1 + ST : 2) // expected-note 2 {{as specified in 'ordered' clause}}
4510e775f4SAlexey Bataev   for (int i = ST; i < N; i++)
4610e775f4SAlexey 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}}
47*ebf6fd63SRichard Smith // expected-error@+3 2 {{directive '#pragma omp for' cannot contain more than one 'ordered' clause}}
48*ebf6fd63SRichard Smith // expected-error@+2 {{argument to 'ordered' clause must be a strictly positive integer value}}
49*ebf6fd63SRichard Smith // expected-error@+1 2 {{integral constant expression}} expected-note@+1 0+{{constant expression}}
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];
56bbf78cdaSCharles Li #if __cplusplus <= 199711L
57*ebf6fd63SRichard Smith // expected-error@+4 2 {{integral constant expression}} expected-note@+4 0+{{constant expression}}
58bbf78cdaSCharles Li #else
59bbf78cdaSCharles Li // expected-error@+2 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}
60bbf78cdaSCharles 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 
main(int argc,char ** argv)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*ebf6fd63SRichard Smith // expected-error@+1 {{integral constant expression}} expected-note@+1 0+{{constant expression}}
100bbf78cdaSCharles Li #pragma omp for ordered(foobool(1) > 0 ? 1 : 2)
10110e775f4SAlexey Bataev   for (int i = 4; i < 12; i++)
10210e775f4SAlexey Bataev     argv[0][i] = argv[0][i] - argv[0][i - 4];
103*ebf6fd63SRichard Smith // expected-error@+3 {{integral constant expression}} expected-note@+3 0+{{constant expression}}
10410e775f4SAlexey Bataev // expected-error@+2 2 {{directive '#pragma omp for' cannot contain more than one 'ordered' clause}}
1053234887fSJoel E. Denny // expected-error@+1 {{argument to 'ordered' clause must be a strictly positive integer value}}
10610e775f4SAlexey Bataev #pragma omp for ordered(foobool(argc)), ordered(true), ordered(-5)
10710e775f4SAlexey Bataev   for (int i = 4; i < 12; i++)
10810e775f4SAlexey Bataev     argv[0][i] = argv[0][i] - argv[0][i - 4];
10910e775f4SAlexey Bataev #pragma omp for ordered(S1) // expected-error {{'S1' does not refer to a value}}
11010e775f4SAlexey Bataev   for (int i = 4; i < 12; i++)
11110e775f4SAlexey Bataev     argv[0][i] = argv[0][i] - argv[0][i - 4];
112bbf78cdaSCharles Li #if __cplusplus <= 199711L
113*ebf6fd63SRichard Smith // expected-error@+4 {{integral constant expression}} expected-note@+4 0+{{constant expression}}
114bbf78cdaSCharles Li #else
115bbf78cdaSCharles Li // expected-error@+2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}
116bbf78cdaSCharles Li #endif
11710e775f4SAlexey Bataev #pragma omp for ordered(argv[1] = 2) // expected-error {{expected ')'}} expected-note {{to match this '('}}
11810e775f4SAlexey Bataev   for (int i = 4; i < 12; i++)
11910e775f4SAlexey Bataev     argv[0][i] = argv[0][i] - argv[0][i - 4];
12010e775f4SAlexey Bataev // expected-error@+3 {{statement after '#pragma omp for' must be a for loop}}
12110e775f4SAlexey Bataev // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}}
12210e775f4SAlexey Bataev #pragma omp for ordered(ordered(tmain < int, char, -1, -2 > (argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}}
12310e775f4SAlexey Bataev   foo();
12410e775f4SAlexey Bataev #pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}}
12510e775f4SAlexey Bataev   foo();                    // expected-error {{expected 2 for loops after '#pragma omp for'}}
126a056935aSAlexey Bataev #pragma omp for ordered(0)              // expected-error {{argument to 'ordered' clause must be a strictly positive integer value}}
1277b6bc88cSAlexey Bataev   for (int i = 4; i < 12; i++)
1287b6bc88cSAlexey Bataev     argv[0][i] = argv[0][i] - argv[0][i - 4];
1297b6bc88cSAlexey 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}}
1307b6bc88cSAlexey Bataev   for (int i = 0; i < 10; i++)
1317b6bc88cSAlexey Bataev     for (int j = 0; j < 11; j++)
1327b6bc88cSAlexey Bataev       for (int k = 0; k < 12; k++)
1337b6bc88cSAlexey Bataev         foo();
13410e775f4SAlexey Bataev   // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 1, 0>' requested here}}
13510e775f4SAlexey Bataev   return tmain<int, char, 1, 0>(argc, argv);
13610e775f4SAlexey Bataev }
13710e775f4SAlexey Bataev 
138