blob: 34f1201e7ddabf237e17a60d839f68cea4a69673 [file] [log] [blame]
Alexey Bataev1c1d9d92020-04-22 08:14:39 -04001// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -ferror-limit 150 -o - %s -Wuninitialized
2// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -std=c++98 -ferror-limit 150 -o - %s -Wuninitialized
3// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -std=c++11 -ferror-limit 150 -o - %s -Wuninitialized
Saiyedul Islamff260ad2020-08-27 19:35:36 +00004// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -ferror-limit 150 -o - %s -Wuninitialized
5// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -std=c++98 -ferror-limit 150 -o - %s -Wuninitialized
6// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -std=c++11 -ferror-limit 150 -o - %s -Wuninitialized
Alexey Bataevf29276ed2014-06-18 04:14:57 +00007
Alexey Bataev1c1d9d92020-04-22 08:14:39 -04008// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -ferror-limit 150 -o - %s -Wuninitialized
9// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -std=c++98 -ferror-limit 150 -o - %s -Wuninitialized
10// RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -std=c++11 -ferror-limit 150 -o - %s -Wuninitialized
Saiyedul Islamff260ad2020-08-27 19:35:36 +000011// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -ferror-limit 150 -o - %s -Wuninitialized
12// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -std=c++98 -ferror-limit 150 -o - %s -Wuninitialized
13// RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -std=c++11 -ferror-limit 150 -o - %s -Wuninitialized
Alexey Bataeva8a9153a2017-12-29 18:07:07 +000014
Alexey Bataeve04483e2019-03-27 14:14:31 +000015extern int omp_default_mem_alloc;
Alexey Bataev8a8c6982019-07-26 14:50:05 +000016void xxx(int argc) {
17 int fp; // expected-note {{initialize the variable 'fp' to silence this warning}}
18#pragma omp parallel
19#pragma omp for reduction(+:fp) // expected-warning {{variable 'fp' is uninitialized when used here}}
20 for (int i = 0; i < 10; ++i)
21 ;
22}
23
Alexey Bataevf29276ed2014-06-18 04:14:57 +000024void foo() {
25}
26
27bool foobool(int argc) {
28 return argc;
29}
30
David Sheinkman92589992016-10-04 14:41:36 +000031void foobar(int &ref) {
32#pragma omp parallel
33#pragma omp for reduction(+:ref)
34 for (int i = 0; i < 10; ++i)
35 foo();
36}
37
Alexey Bataevf29276ed2014-06-18 04:14:57 +000038struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
39extern S1 a;
40class S2 {
41 mutable int a;
Alexey Bataeva839ddd2016-03-17 10:19:46 +000042 S2 &operator+(const S2 &arg) { return (*this); } // expected-note 3 {{implicitly declared private here}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +000043
44public:
45 S2() : a(0) {}
46 S2(S2 &s2) : a(s2.a) {}
Alexey Bataev7ff55242014-06-19 09:13:45 +000047 static float S2s; // expected-note 2 {{static data member is predetermined as shared}}
Alexey Bataev4d4624c2017-07-20 16:47:47 +000048 static const float S2sc; // expected-note 2 {{'S2sc' declared here}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +000049};
Alexey Bataev4d4624c2017-07-20 16:47:47 +000050const float S2::S2sc = 0;
Alexey Bataeva839ddd2016-03-17 10:19:46 +000051S2 b; // expected-note 3 {{'b' defined here}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +000052const S2 ba[5]; // expected-note 2 {{'ba' defined here}}
53class S3 {
54 int a;
55
56public:
57 S3() : a(0) {}
58 S3(const S3 &s3) : a(s3.a) {}
Alexey Bataev794ba0d2015-04-10 10:43:45 +000059 S3 operator+(const S3 &arg1) { return arg1; }
Alexey Bataevf29276ed2014-06-18 04:14:57 +000060};
Alexey Bataev794ba0d2015-04-10 10:43:45 +000061int operator+(const S3 &arg1, const S3 &arg2) { return 5; }
Alexey Bataeva839ddd2016-03-17 10:19:46 +000062S3 c; // expected-note 3 {{'c' defined here}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +000063const S3 ca[5]; // expected-note 2 {{'ca' defined here}}
64extern const int f; // expected-note 4 {{'f' declared here}}
Alexey Bataev794ba0d2015-04-10 10:43:45 +000065class S4 {
Alexey Bataevf29276ed2014-06-18 04:14:57 +000066 int a;
Alexey Bataev794ba0d2015-04-10 10:43:45 +000067 S4(); // expected-note {{implicitly declared private here}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +000068 S4(const S4 &s4);
Alexey Bataev794ba0d2015-04-10 10:43:45 +000069 S4 &operator+(const S4 &arg) { return (*this); }
Alexey Bataevf29276ed2014-06-18 04:14:57 +000070
71public:
72 S4(int v) : a(v) {}
73};
74S4 &operator&=(S4 &arg1, S4 &arg2) { return arg1; }
75class S5 {
76 int a;
Alexey Bataev794ba0d2015-04-10 10:43:45 +000077 S5() : a(0) {} // expected-note {{implicitly declared private here}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +000078 S5(const S5 &s5) : a(s5.a) {}
Alexey Bataev794ba0d2015-04-10 10:43:45 +000079 S5 &operator+(const S5 &arg);
Alexey Bataevf29276ed2014-06-18 04:14:57 +000080
81public:
82 S5(int v) : a(v) {}
83};
Alexey Bataeva839ddd2016-03-17 10:19:46 +000084class S6 { // expected-note 3 {{candidate function (the implicit copy assignment operator) not viable: no known conversion from 'int' to 'const S6' for 1st argument}}
Charles Lie7cbb3e2015-11-17 20:25:05 +000085#if __cplusplus >= 201103L // C++11 or later
Alexey Bataeva839ddd2016-03-17 10:19:46 +000086// expected-note@-2 3 {{candidate function (the implicit move assignment operator) not viable: no known conversion from 'int' to 'S6' for 1st argument}}
Charles Lie7cbb3e2015-11-17 20:25:05 +000087#endif
Alexey Bataevf29276ed2014-06-18 04:14:57 +000088 int a;
89
90public:
91 S6() : a(6) {}
92 operator int() { return 6; }
Alexey Bataev794ba0d2015-04-10 10:43:45 +000093} o;
Alexey Bataevf29276ed2014-06-18 04:14:57 +000094
95S3 h, k;
96#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
97
Alexey Bataevf24e7b12015-10-08 09:10:53 +000098char *get();
99
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000100template <class T> // expected-note {{declared here}}
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000101T tmain(T argc) {
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000102 const T d = T(); // expected-note 4 {{'d' defined here}}
103 const T da[5] = {T()}; // expected-note 2 {{'da' defined here}}
104 T qa[5] = {T()};
Alexey Bataeva9148882019-07-08 15:45:24 +0000105 T i, z;
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000106 T &j = i; // expected-note 4 {{'j' defined here}}
107 S3 &p = k; // expected-note 2 {{'p' defined here}}
108 const T &r = da[(int)i]; // expected-note 2 {{'r' defined here}}
109 T &q = qa[(int)i]; // expected-note 2 {{'q' defined here}}
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000110 T fl;
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000111#pragma omp parallel
112#pragma omp for reduction // expected-error {{expected '(' after 'reduction'}}
113 for (int i = 0; i < 10; ++i)
114 foo();
115#pragma omp parallel
116#pragma omp for reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp for' are ignored}}
117 for (int i = 0; i < 10; ++i)
118 foo();
119#pragma omp parallel
120#pragma omp for reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}}
121 for (int i = 0; i < 10; ++i)
122 foo();
123#pragma omp parallel
124#pragma omp for reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
125 for (int i = 0; i < 10; ++i)
126 foo();
127#pragma omp parallel
128#pragma omp for reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
129 for (int i = 0; i < 10; ++i)
130 foo();
131#pragma omp parallel
132#pragma omp for reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}}
133 for (int i = 0; i < 10; ++i)
134 foo();
135#pragma omp parallel
136#pragma omp for reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
137 for (int i = 0; i < 10; ++i)
138 foo();
139#pragma omp parallel
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000140#pragma omp for reduction(& : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000141 for (int i = 0; i < 10; ++i)
142 foo();
143#pragma omp parallel
Alexey Bataevc5970622016-04-01 08:43:42 +0000144#pragma omp for reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000145 for (int i = 0; i < 10; ++i)
146 foo();
147#pragma omp parallel
148#pragma omp for reduction(|| : argc ? i : argc) // expected-error 2 {{expected variable name}}
149 for (int i = 0; i < 10; ++i)
150 foo();
151#pragma omp parallel
Alexey Bataeva839ddd2016-03-17 10:19:46 +0000152#pragma omp for reduction(foo : argc) // expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'float'}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'int'}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000153 for (int i = 0; i < 10; ++i)
154 foo();
155#pragma omp parallel
156#pragma omp for reduction(&& : argc)
157 for (int i = 0; i < 10; ++i)
158 foo();
159#pragma omp parallel
160#pragma omp for reduction(^ : T) // expected-error {{'T' does not refer to a value}}
161 for (int i = 0; i < 10; ++i)
162 foo();
163#pragma omp parallel
Alexey Bataeva9148882019-07-08 15:45:24 +0000164#pragma omp for reduction(+ : z, a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 3 {{const-qualified variable cannot be reduction}} expected-error 2 {{'operator+' is a private member of 'S2'}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000165 for (int i = 0; i < 10; ++i)
166 foo();
167#pragma omp parallel
Alexey Bataeva9148882019-07-08 15:45:24 +0000168#pragma omp for reduction(min : z, a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 4 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 3 {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000169 for (int i = 0; i < 10; ++i)
170 foo();
171#pragma omp parallel
Alexey Bataeva1764212015-09-30 09:22:36 +0000172#pragma omp for reduction(max : qa[1])
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000173 for (int i = 0; i < 10; ++i)
174 foo();
175#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000176#pragma omp for reduction(+ : ba) // expected-error {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000177 for (int i = 0; i < 10; ++i)
178 foo();
179#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000180#pragma omp for reduction(* : ca) // expected-error {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000181 for (int i = 0; i < 10; ++i)
182 foo();
183#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000184#pragma omp for reduction(- : da) // expected-error {{const-qualified variable cannot be reduction}} expected-error {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000185 for (int i = 0; i < 10; ++i)
186 foo();
187#pragma omp parallel
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000188#pragma omp for reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000189 for (int i = 0; i < 10; ++i)
190 foo();
191#pragma omp parallel
192#pragma omp for reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}}
193 for (int i = 0; i < 10; ++i)
194 foo();
195#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000196#pragma omp for reduction(&& : S2::S2sc) // expected-error {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000197 for (int i = 0; i < 10; ++i)
198 foo();
199#pragma omp parallel
200#pragma omp for reduction(+ : h, k) // expected-error {{threadprivate or thread local variable cannot be reduction}}
201 for (int i = 0; i < 10; ++i)
202 foo();
203#pragma omp parallel
Alexey Bataeva839ddd2016-03-17 10:19:46 +0000204#pragma omp for reduction(+ : o) // expected-error 2 {{no viable overloaded '='}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000205 for (int i = 0; i < 10; ++i)
206 foo();
207#pragma omp parallel
208#pragma omp for private(i), reduction(+ : j), reduction(+ : q) // expected-error 4 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
209 for (int i = 0; i < 10; ++i)
210 foo();
211#pragma omp parallel private(k)
212#pragma omp for reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
213 for (int i = 0; i < 10; ++i)
214 foo();
215#pragma omp parallel
Alexey Bataeva839ddd2016-03-17 10:19:46 +0000216#pragma omp for reduction(+ : p), reduction(+ : p) // expected-error 2 {{variable can appear only once in OpenMP 'reduction' clause}} expected-note 2 {{previously referenced here}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000217 for (int i = 0; i < 10; ++i)
218 foo();
219#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000220#pragma omp for reduction(+ : r) // expected-error 2 {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000221 for (int i = 0; i < 10; ++i)
222 foo();
223#pragma omp parallel shared(i)
224#pragma omp parallel reduction(min : i)
225#pragma omp for reduction(max : j) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
226 for (int i = 0; i < 10; ++i)
227 foo();
228#pragma omp parallel private(fl) // expected-note 2 {{defined as private}}
229#pragma omp for reduction(+ : fl) // expected-error 2 {{reduction variable must be shared}}
230 for (int i = 0; i < 10; ++i)
231 foo();
Alexey Bataevbc529672018-09-28 19:33:14 +0000232#pragma omp parallel private(qa)
233#pragma omp for reduction(+ : qa[1], get()[0]) // expected-error {{expected variable name as a base of the array subscript}}
Alexey Bataevf24e7b12015-10-08 09:10:53 +0000234 for (int i = 0; i < 10; ++i)
235 foo();
236#pragma omp parallel shared(qa)
Alexey Bataevbc529672018-09-28 19:33:14 +0000237#pragma omp for reduction(+ : qa[1], qa[0])
Alexey Bataevf24e7b12015-10-08 09:10:53 +0000238 for (int i = 0; i < 10; ++i)
239 foo();
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000240#pragma omp parallel reduction(* : fl) // expected-note 2 {{defined as reduction}}
241#pragma omp for reduction(+ : fl) // expected-error 2 {{reduction variable must be shared}}
242 for (int i = 0; i < 10; ++i)
243 foo();
244
245 return T();
246}
247
Alexey Bataev6ddfe1a2015-04-16 13:49:42 +0000248namespace A {
249double x;
250#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
251}
252namespace B {
253using A::x;
254}
255
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000256int main(int argc, char **argv) {
257 const int d = 5; // expected-note 2 {{'d' defined here}}
258 const int da[5] = {0}; // expected-note {{'da' defined here}}
259 int qa[5] = {0};
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000260 S4 e(4);
261 S5 g(5);
Alexey Bataeva9148882019-07-08 15:45:24 +0000262 int i, z;
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000263 int &j = i; // expected-note 2 {{'j' defined here}}
264 S3 &p = k; // expected-note 2 {{'p' defined here}}
265 const int &r = da[i]; // expected-note {{'r' defined here}}
266 int &q = qa[i]; // expected-note {{'q' defined here}}
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000267 float fl;
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000268#pragma omp parallel
269#pragma omp for reduction // expected-error {{expected '(' after 'reduction'}}
270 for (int i = 0; i < 10; ++i)
271 foo();
272#pragma omp parallel
273#pragma omp for reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp for' are ignored}}
274 for (int i = 0; i < 10; ++i)
275 foo();
276#pragma omp parallel
277#pragma omp for reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}}
278 for (int i = 0; i < 10; ++i)
279 foo();
280#pragma omp parallel
281#pragma omp for reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
282 for (int i = 0; i < 10; ++i)
283 foo();
284#pragma omp parallel
285#pragma omp for reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
286 for (int i = 0; i < 10; ++i)
287 foo();
288#pragma omp parallel
289#pragma omp for reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}}
290 for (int i = 0; i < 10; ++i)
291 foo();
292#pragma omp parallel
293#pragma omp for reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
294 for (int i = 0; i < 10; ++i)
295 foo();
296#pragma omp parallel
297#pragma omp for reduction(foo : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max'}}
298 for (int i = 0; i < 10; ++i)
299 foo();
300#pragma omp parallel
Alexey Bataevc5970622016-04-01 08:43:42 +0000301#pragma omp for reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000302 for (int i = 0; i < 10; ++i)
303 foo();
304#pragma omp parallel
305#pragma omp for reduction(|| : argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
306 for (int i = 0; i < 10; ++i)
307 foo();
308#pragma omp parallel
309#pragma omp for reduction(~ : argc) // expected-error {{expected unqualified-id}}
310 for (int i = 0; i < 10; ++i)
311 foo();
312#pragma omp parallel
Alexey Bataeve04483e2019-03-27 14:14:31 +0000313#pragma omp for reduction(&& : argc) allocate , allocate(, allocate(omp_default , allocate(omp_default_mem_alloc, allocate(omp_default_mem_alloc:, allocate(omp_default_mem_alloc: argc, allocate(omp_default_mem_alloc: argv), allocate(argv) // expected-error {{expected '(' after 'allocate'}} expected-error 2 {{expected expression}} expected-error 2 {{expected ')'}} expected-error {{use of undeclared identifier 'omp_default'}} expected-note 2 {{to match this '('}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000314 for (int i = 0; i < 10; ++i)
315 foo();
316#pragma omp parallel
317#pragma omp for reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
318 for (int i = 0; i < 10; ++i)
319 foo();
320#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000321#pragma omp for reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000322 for (int i = 0; i < 10; ++i)
323 foo();
324#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000325#pragma omp for reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000326 for (int i = 0; i < 10; ++i)
327 foo();
328#pragma omp parallel
Alexey Bataeva9148882019-07-08 15:45:24 +0000329#pragma omp for reduction(max : argv[1], z)
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000330 for (int i = 0; i < 10; ++i)
331 foo();
332#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000333#pragma omp for reduction(+ : ba) // expected-error {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000334 for (int i = 0; i < 10; ++i)
335 foo();
336#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000337#pragma omp for reduction(* : ca) // expected-error {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000338 for (int i = 0; i < 10; ++i)
339 foo();
340#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000341#pragma omp for reduction(- : da) // expected-error {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000342 for (int i = 0; i < 10; ++i)
343 foo();
344#pragma omp parallel
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000345#pragma omp for reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000346 for (int i = 0; i < 10; ++i)
347 foo();
348#pragma omp parallel
349#pragma omp for reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}}
350 for (int i = 0; i < 10; ++i)
351 foo();
352#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000353#pragma omp for reduction(&& : S2::S2sc) // expected-error {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000354 for (int i = 0; i < 10; ++i)
355 foo();
356#pragma omp parallel
Mike Ricef90abac2021-03-19 17:39:04 -0700357#pragma omp for reduction(& : e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} expected-error {{invalid operands to binary expression ('S5' and 'S5')}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000358 for (int i = 0; i < 10; ++i)
359 foo();
360#pragma omp parallel
361#pragma omp for reduction(+ : h, k) // expected-error {{threadprivate or thread local variable cannot be reduction}}
362 for (int i = 0; i < 10; ++i)
363 foo();
364#pragma omp parallel
Alexey Bataev6ddfe1a2015-04-16 13:49:42 +0000365#pragma omp for reduction(+ : B::x, k) // expected-error {{threadprivate or thread local variable cannot be reduction}}
366 for (int i = 0; i < 10; ++i)
367 foo();
368#pragma omp parallel
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000369#pragma omp for reduction(+ : o) // expected-error {{no viable overloaded '='}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000370 for (int i = 0; i < 10; ++i)
371 foo();
372#pragma omp parallel
373#pragma omp for private(i), reduction(+ : j), reduction(+ : q) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
374 for (int i = 0; i < 10; ++i)
375 foo();
376#pragma omp parallel private(k)
377#pragma omp for reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
378 for (int i = 0; i < 10; ++i)
379 foo();
380#pragma omp parallel
381#pragma omp for reduction(+ : p), reduction(+ : p) // expected-error {{variable can appear only once in OpenMP 'reduction' clause}} expected-note {{previously referenced here}}
382 for (int i = 0; i < 10; ++i)
383 foo();
384#pragma omp parallel
Joel E. Dennyd2649292019-01-04 22:11:56 +0000385#pragma omp for reduction(+ : r) // expected-error {{const-qualified variable cannot be reduction}}
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000386 for (int i = 0; i < 10; ++i)
387 foo();
388#pragma omp parallel shared(i)
389#pragma omp parallel reduction(min : i)
390#pragma omp for reduction(max : j) // expected-error {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
391 for (int i = 0; i < 10; ++i)
392 foo();
393#pragma omp parallel private(fl) // expected-note {{defined as private}}
394#pragma omp for reduction(+ : fl) // expected-error {{reduction variable must be shared}}
395 for (int i = 0; i < 10; ++i)
396 foo();
Alexey Bataevbc529672018-09-28 19:33:14 +0000397#pragma omp parallel private(argv)
398#pragma omp for reduction(+ : argv[1], get()[0]) // expected-error {{expected variable name as a base of the array subscript}} expected-error {{invalid operands to binary expression ('char *' and 'char *')}}
Alexey Bataevf24e7b12015-10-08 09:10:53 +0000399 for (int i = 0; i < 10; ++i)
400 foo();
401#pragma omp parallel shared(qa)
Alexey Bataevbc529672018-09-28 19:33:14 +0000402#pragma omp for reduction(+ : qa[1], qa[0])
Alexey Bataevf24e7b12015-10-08 09:10:53 +0000403 for (int i = 0; i < 10; ++i)
404 foo();
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000405#pragma omp parallel reduction(* : fl) // expected-note {{defined as reduction}}
406#pragma omp for reduction(+ : fl) // expected-error {{reduction variable must be shared}}
407 for (int i = 0; i < 10; ++i)
408 foo();
Kelvin Li4eea8c62015-09-15 18:56:58 +0000409 static int m=0;
410#pragma omp for reduction(+:m)
411 for (int i = 0; i < 10; ++i)
412 m++;
Alexey Bataev1c1d9d92020-04-22 08:14:39 -0400413#pragma omp for reduction(task, +:m) // omp45-error 2 {{expected expression}} omp45-warning {{missing ':' after reduction identifier - ignoring}}
414 for (int i = 0; i < 10; ++i)
415 m++;
Alexey Bataevf29276ed2014-06-18 04:14:57 +0000416
417 return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<float>' requested here}}
418}