xref: /llvm-project/clang/test/OpenMP/ordered_messages.cpp (revision bd1961d2bff69a1d0f3a20fbce4950ff24d6528a)
1 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s
2 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++98 -o - %s
3 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s
4 
5 int foo();
6 
7 template <class T>
8 T foo() {
9  T k;
10   #pragma omp for ordered
11   for (int i = 0; i < 10; ++i) {
12     L1:
13       foo();
14     #pragma omp ordered
15     {
16       foo();
17       goto L1; // expected-error {{use of undeclared label 'L1'}}
18     }
19   }
20   #pragma omp for ordered
21   for (int i = 0; i < 10; ++i) {
22     foo();
23     goto L2; // expected-error {{use of undeclared label 'L2'}}
24     #pragma omp ordered
25     {
26       L2:
27       foo();
28     }
29   }
30   #pragma omp for ordered
31   for (int i = 0; i < 10; ++i) {
32     #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}}
33     {
34       foo();
35     }
36   }
37   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
38   for (int i = 0; i < 10; ++i) {
39     #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
40     {
41       foo();
42     }
43   }
44   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
45   for (int i = 0; i < 10; ++i) {
46     #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}}
47     {
48       foo();
49     }
50   }
51   #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}}
52   {
53     foo();
54   }
55   #pragma omp simd
56   for (int i = 0; i < 10; ++i) {
57     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
58     {
59       foo();
60     }
61   }
62   #pragma omp simd
63   for (int i = 0; i < 10; ++i) {
64     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
65     {
66       foo();
67     }
68   }
69   #pragma omp for simd
70   for (int i = 0; i < 10; ++i) {
71     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
72     {
73       foo();
74     }
75   }
76   #pragma omp for simd
77   for (int i = 0; i < 10; ++i) {
78     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
79     {
80       foo();
81     }
82   }
83   #pragma omp parallel for simd
84   for (int i = 0; i < 10; ++i) {
85     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
86     {
87       foo();
88     }
89   }
90   #pragma omp parallel for simd
91   for (int i = 0; i < 10; ++i) {
92     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
93     {
94       foo();
95     }
96     #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}}
97   }
98 #pragma omp parallel for ordered
99   for (int i = 0; i < 10; ++i) {
100     #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
101     #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
102   }
103 #pragma omp parallel for ordered(2) // expected-note 5 {{'ordered' clause with specified parameter}}
104   for (int i = 0; i < 10; ++i) {
105     for (int j = 0; j < 10; ++j) {
106 #pragma omp ordered depend // expected-error {{expected '(' after 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
107 #pragma omp ordered depend( // expected-error {{expected ')'}} expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-note {{to match this '('}}
108 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}}
109 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-note {{to match this '('}}
110 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
111 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}}
112 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}}
113 #pragma omp ordered depend(source)
114                            if (i == j)
115 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
116                              ;
117                            if (i == j)
118 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
119                              ;
120 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}}
121 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}}
122 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}}
123 #pragma omp ordered depend(in : i) // expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
124 #pragma omp ordered depend(sink : i, j)
125 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}}
126 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}}
127 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{expression is not an integral constant expression}} expected-error {{expected '+' or '-' operation}}
128 #if __cplusplus >= 201103L
129 // expected-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}}
130 #endif
131 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}}
132 #pragma omp ordered depend(sink : i-0, j+sizeof(T)) depend(sink : i-0, j+sizeof(T))
133 #pragma omp ordered depend(sink : i-0, j+sizeof(T)) depend(source) // expected-error {{'depend(source)' clause cannot be mixed with 'depend(sink:vec)' clauses}}
134 #pragma omp ordered depend(source) depend(sink : i-0, j+sizeof(T)) // expected-error {{'depend(sink:vec)' clauses cannot be mixed with 'depend(source)' clause}}
135     }
136   }
137   return T();
138 }
139 
140 int foo() {
141 #if __cplusplus >= 201103L
142 // expected-note@-2 2 {{declared here}}
143 #endif
144 int k;
145   #pragma omp for ordered
146   for (int i = 0; i < 10; ++i) {
147     L1:
148       foo();
149     #pragma omp ordered
150     {
151       foo();
152       goto L1; // expected-error {{use of undeclared label 'L1'}}
153     }
154   }
155   #pragma omp for ordered
156   for (int i = 0; i < 10; ++i) {
157     foo();
158     goto L2; // expected-error {{use of undeclared label 'L2'}}
159     #pragma omp ordered
160     {
161       L2:
162       foo();
163     }
164   }
165   #pragma omp for ordered
166   for (int i = 0; i < 10; ++i) {
167     #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}}
168     {
169       foo();
170     }
171   }
172   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
173   for (int i = 0; i < 10; ++i) {
174     #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
175     {
176       foo();
177     }
178   }
179   #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}}
180   for (int i = 0; i < 10; ++i) {
181     #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}}
182     {
183       foo();
184     }
185   }
186   #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}}
187   {
188     foo();
189   }
190   #pragma omp simd
191   for (int i = 0; i < 10; ++i) {
192     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
193     {
194       foo();
195     }
196   }
197   #pragma omp simd
198   for (int i = 0; i < 10; ++i) {
199     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
200     {
201       foo();
202     }
203   }
204   #pragma omp for simd
205   for (int i = 0; i < 10; ++i) {
206     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
207     {
208       foo();
209     }
210   }
211   #pragma omp for simd
212   for (int i = 0; i < 10; ++i) {
213     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
214     {
215       foo();
216     }
217   }
218   #pragma omp parallel for simd
219   for (int i = 0; i < 10; ++i) {
220     #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}}
221     {
222       foo();
223     }
224   }
225   #pragma omp parallel for simd
226   for (int i = 0; i < 10; ++i) {
227     #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}}
228     {
229       foo();
230     }
231     #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}}
232   }
233 #pragma omp parallel for ordered
234   for (int i = 0; i < 10; ++i) {
235     #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
236     #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}}
237   }
238 #pragma omp parallel for ordered(2) // expected-note 5 {{'ordered' clause with specified parameter}}
239   for (int i = 0; i < 10; ++i) {
240     for (int j = 0; j < 10; ++j) {
241 #pragma omp ordered depend // expected-error {{expected '(' after 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
242 #pragma omp ordered depend( // expected-error {{expected ')'}} expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-note {{to match this '('}}
243 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}}
244 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-note {{to match this '('}}
245 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
246 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}}
247 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}}
248 #pragma omp ordered depend(source)
249                            if (i == j)
250 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
251                              ;
252                            if (i == j)
253 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}}
254                              ;
255 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}}
256 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}}
257 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}}
258 #pragma omp ordered depend(in : i) // expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}}
259 #pragma omp ordered depend(sink : i, j)
260 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}}
261 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}}
262 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{expression is not an integral constant expression}} expected-error {{expected '+' or '-' operation}}
263 #if __cplusplus >= 201103L
264 // expected-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}}
265 #endif
266 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}}
267 #pragma omp ordered depend(sink : i-0, j+sizeof(int)) depend(sink : i-0, j+sizeof(int))
268 #pragma omp ordered depend(sink : i-0, j+sizeof(int)) depend(source) // expected-error {{'depend(source)' clause cannot be mixed with 'depend(sink:vec)' clauses}}
269 #pragma omp ordered depend(source) depend(sink : i-0, j+sizeof(int)) // expected-error {{'depend(sink:vec)' clauses cannot be mixed with 'depend(source)' clause}}
270     }
271   }
272 
273   return foo<int>(); // expected-note {{in instantiation of function template specialization 'foo<int>' requested here}}
274 }
275