1 // RUN: %clang_cc1 -verify -fopenmp %s
2 // RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s
3 // RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s
4 
5 // RUN: %clang_cc1 -verify -fopenmp-simd %s
6 // RUN: %clang_cc1 -verify -fopenmp-simd -std=c++98 %s
7 // RUN: %clang_cc1 -verify -fopenmp-simd -std=c++11 %s
8 // SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
9 
10 void foo() {
11 }
12 
13 #if __cplusplus >= 201103L
14 // expected-note@+2 4 {{declared here}}
15 #endif
16 bool foobool(int argc) {
17   return argc;
18 }
19 
20 struct S1; // expected-note {{declared here}}
21 
22 template <class T, typename S, int N, int ST> // expected-note {{declared here}}
23 T tmain(T argc, S **argv) {                   //expected-note 2 {{declared here}}
24 #pragma omp for ordered
25   for (int i = ST; i < N; i++)
26     argv[0][i] = argv[0][i] - argv[0][i - ST];
27 #pragma omp for ordered( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
28   for (int i = ST; i < N; i++)
29     argv[0][i] = argv[0][i] - argv[0][i - ST];
30 #pragma omp for ordered() // expected-error {{expected expression}}
31   for (int i = ST; i < N; i++)
32     argv[0][i] = argv[0][i] - argv[0][i - ST];
33 // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}}
34 // expected-error@+2 2 {{expression is not an integral constant expression}}
35 // expected-note@+1 2 {{read of non-const variable 'argc' is not allowed in a constant expression}}
36 #pragma omp for ordered(argc
37   for (int i = ST; i < N; i++)
38     argv[0][i] = argv[0][i] - argv[0][i - ST];
39 // expected-error@+1 2 {{argument to 'ordered' clause must be a strictly positive integer value}}
40 #pragma omp for ordered(ST // expected-error {{expected ')'}} expected-note {{to match this '('}}
41   for (int i = ST; i < N; i++)
42     argv[0][i] = argv[0][i] - argv[0][i - ST];
43 #pragma omp for ordered(1)) // expected-warning {{extra tokens at the end of '#pragma omp for' are ignored}}
44   for (int i = ST; i < N; i++)
45     argv[0][i] = argv[0][i] - argv[0][i - ST];
46 #pragma omp for ordered((ST > 0) ? 1 + ST : 2) // expected-note 2 {{as specified in 'ordered' clause}}
47   for (int i = ST; i < N; i++)
48     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}}
49 // expected-error@+6 2 {{directive '#pragma omp for' cannot contain more than one 'ordered' clause}}
50 // expected-error@+5 2 {{argument to 'ordered' clause must be a strictly positive integer value}}
51 // expected-error@+4 2 {{expression is not an integral constant expression}}
52 #if __cplusplus >= 201103L
53 // expected-note@+2 2 {{non-constexpr function 'foobool' cannot be used in a constant expression}}
54 #endif
55 #pragma omp for ordered(foobool(argc)), ordered(true), ordered(-5)
56   for (int i = ST; i < N; i++)
57     argv[0][i] = argv[0][i] - argv[0][i - ST];
58 #pragma omp for ordered(S) // expected-error {{'S' does not refer to a value}}
59   for (int i = ST; i < N; i++)
60     argv[0][i] = argv[0][i] - argv[0][i - ST];
61 #if __cplusplus <= 199711L
62 // expected-error@+4 2 {{expression is not an integral constant expression}}
63 #else
64 // expected-error@+2 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}
65 #endif
66 #pragma omp for ordered(argv[1] = 2) // expected-error {{expected ')'}} expected-note {{to match this '('}}
67   for (int i = ST; i < N; i++)
68     argv[0][i] = argv[0][i] - argv[0][i - ST];
69 #pragma omp for ordered(1)
70   for (int i = ST; i < N; i++)
71     argv[0][i] = argv[0][i] - argv[0][i - ST];
72 #pragma omp for ordered(N-1) // expected-error 2 {{argument to 'ordered' clause must be a strictly positive integer value}}
73   for (int i = ST; i < N; i++)
74     argv[0][i] = argv[0][i] - argv[0][i - ST];
75 #pragma omp for ordered(N) // expected-error {{argument to 'ordered' clause must be a strictly positive integer value}}
76   for (T i = ST; i < N; i++)
77     argv[0][i] = argv[0][i] - argv[0][i - ST];
78 #pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}}
79   foo();                    // expected-error {{expected 2 for loops after '#pragma omp for'}}
80 #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}}
81   for (int i = ST; i < N; i++)
82     for (int j = ST; j < N; j++)
83       for (int k = ST; k < N; k++)
84         foo();
85   return argc;
86 }
87 
88 int main(int argc, char **argv) {
89 #pragma omp for ordered
90   for (int i = 4; i < 12; i++)
91     argv[0][i] = argv[0][i] - argv[0][i - 4];
92 #pragma omp for ordered( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
93   for (int i = 4; i < 12; i++)
94     argv[0][i] = argv[0][i] - argv[0][i - 4];
95 #pragma omp for ordered() // expected-error {{expected expression}}
96   for (int i = 4; i < 12; i++)
97     argv[0][i] = argv[0][i] - argv[0][i - 4];
98 #pragma omp for ordered(4 // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-note {{as specified in 'ordered' clause}}
99   for (int i = 4; i < 12; i++)
100     argv[0][i] = argv[0][i] - argv[0][i - 4]; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
101 #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}}
102   for (int i = 4; i < 12; i++)
103     argv[0][i] = argv[0][i] - argv[0][i - 4];    // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
104 // expected-error@+4 {{expression is not an integral constant expression}}
105 #if __cplusplus >= 201103L
106 // expected-note@+2 {{non-constexpr function 'foobool' cannot be used in a constant expression}}
107 #endif
108 #pragma omp for ordered(foobool(1) > 0 ? 1 : 2)
109   for (int i = 4; i < 12; i++)
110     argv[0][i] = argv[0][i] - argv[0][i - 4];
111 // expected-error@+6 {{expression is not an integral constant expression}}
112 #if __cplusplus >= 201103L
113 // expected-note@+4 {{non-constexpr function 'foobool' cannot be used in a constant expression}}
114 #endif
115 // expected-error@+2 2 {{directive '#pragma omp for' cannot contain more than one 'ordered' clause}}
116 // expected-error@+1 2 {{argument to 'ordered' clause must be a strictly positive integer value}}
117 #pragma omp for ordered(foobool(argc)), ordered(true), ordered(-5)
118   for (int i = 4; i < 12; i++)
119     argv[0][i] = argv[0][i] - argv[0][i - 4];
120 #pragma omp for ordered(S1) // expected-error {{'S1' does not refer to a value}}
121   for (int i = 4; i < 12; i++)
122     argv[0][i] = argv[0][i] - argv[0][i - 4];
123 #if __cplusplus <= 199711L
124 // expected-error@+4 {{expression is not an integral constant expression}}
125 #else
126 // expected-error@+2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}
127 #endif
128 #pragma omp for ordered(argv[1] = 2) // expected-error {{expected ')'}} expected-note {{to match this '('}}
129   for (int i = 4; i < 12; i++)
130     argv[0][i] = argv[0][i] - argv[0][i - 4];
131 // expected-error@+3 {{statement after '#pragma omp for' must be a for loop}}
132 // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}}
133 #pragma omp for ordered(ordered(tmain < int, char, -1, -2 > (argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}}
134   foo();
135 #pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}}
136   foo();                    // expected-error {{expected 2 for loops after '#pragma omp for'}}
137 #pragma omp for ordered(0)              // expected-error {{argument to 'ordered' clause must be a strictly positive integer value}}
138   for (int i = 4; i < 12; i++)
139     argv[0][i] = argv[0][i] - argv[0][i - 4];
140 #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}}
141   for (int i = 0; i < 10; i++)
142     for (int j = 0; j < 11; j++)
143       for (int k = 0; k < 12; k++)
144         foo();
145   // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 1, 0>' requested here}}
146   return tmain<int, char, 1, 0>(argc, argv);
147 }
148 
149