1*de59f564SAaron Ballman // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -fsyntax-only %s -Wuninitialized
2*de59f564SAaron Ballman // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=51 -std=c++11 -fsyntax-only %s -Wuninitialized
3*de59f564SAaron Ballman // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=51 -fsyntax-only %s -Wuninitialized
4*de59f564SAaron Ballman // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=51 -std=c++11 -fsyntax-only %s -Wuninitialized
5*de59f564SAaron Ballman 
6*de59f564SAaron Ballman typedef void **omp_allocator_handle_t;
7*de59f564SAaron Ballman extern const omp_allocator_handle_t omp_null_allocator;
8*de59f564SAaron Ballman extern const omp_allocator_handle_t omp_default_mem_alloc;
9*de59f564SAaron Ballman extern const omp_allocator_handle_t omp_large_cap_mem_alloc;
10*de59f564SAaron Ballman extern const omp_allocator_handle_t omp_const_mem_alloc;
11*de59f564SAaron Ballman extern const omp_allocator_handle_t omp_high_bw_mem_alloc;
12*de59f564SAaron Ballman extern const omp_allocator_handle_t omp_low_lat_mem_alloc;
13*de59f564SAaron Ballman extern const omp_allocator_handle_t omp_cgroup_mem_alloc;
14*de59f564SAaron Ballman extern const omp_allocator_handle_t omp_pteam_mem_alloc;
15*de59f564SAaron Ballman extern const omp_allocator_handle_t omp_thread_mem_alloc;
16*de59f564SAaron Ballman 
xxx(int argc)17*de59f564SAaron Ballman void xxx(int argc) {
18*de59f564SAaron Ballman   int fp; // expected-note {{initialize the variable 'fp' to silence this warning}}
19*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+:fp))]] // expected-warning {{variable 'fp' is uninitialized when used here}}
20*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
21*de59f564SAaron Ballman     ;
22*de59f564SAaron Ballman }
23*de59f564SAaron Ballman 
foo()24*de59f564SAaron Ballman void foo() {
25*de59f564SAaron Ballman }
26*de59f564SAaron Ballman 
foobool(int argc)27*de59f564SAaron Ballman bool foobool(int argc) {
28*de59f564SAaron Ballman   return argc;
29*de59f564SAaron Ballman }
30*de59f564SAaron Ballman 
foobar(int & ref)31*de59f564SAaron Ballman void foobar(int &ref) {
32*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+:ref))]]
33*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
34*de59f564SAaron Ballman     foo();
35*de59f564SAaron Ballman }
36*de59f564SAaron Ballman 
37*de59f564SAaron Ballman struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
38*de59f564SAaron Ballman extern S1 a;
39*de59f564SAaron Ballman class S2 {
40*de59f564SAaron Ballman   mutable int a;
operator +(const S2 & arg)41*de59f564SAaron Ballman   S2 &operator+(const S2 &arg) { return (*this); } // expected-note 3 {{implicitly declared private here}}
42*de59f564SAaron Ballman 
43*de59f564SAaron Ballman public:
S2()44*de59f564SAaron Ballman   S2() : a(0) {}
S2(S2 & s2)45*de59f564SAaron Ballman   S2(S2 &s2) : a(s2.a) {}
46*de59f564SAaron Ballman   static float S2s; // expected-note 2 {{static data member is predetermined as shared}}
47*de59f564SAaron Ballman   static const float S2sc; // expected-note 2 {{'S2sc' declared here}}
48*de59f564SAaron Ballman };
49*de59f564SAaron Ballman const float S2::S2sc = 0;
50*de59f564SAaron Ballman S2 b;                     // expected-note 3 {{'b' defined here}}
51*de59f564SAaron Ballman const S2 ba[5];           // expected-note 2 {{'ba' defined here}}
52*de59f564SAaron Ballman class S3 {
53*de59f564SAaron Ballman   int a;
54*de59f564SAaron Ballman 
55*de59f564SAaron Ballman public:
56*de59f564SAaron Ballman   int b;
S3()57*de59f564SAaron Ballman   S3() : a(0) {}
S3(const S3 & s3)58*de59f564SAaron Ballman   S3(const S3 &s3) : a(s3.a) {}
operator +(const S3 & arg1)59*de59f564SAaron Ballman   S3 operator+(const S3 &arg1) { return arg1; }
60*de59f564SAaron Ballman };
operator +(const S3 & arg1,const S3 & arg2)61*de59f564SAaron Ballman int operator+(const S3 &arg1, const S3 &arg2) { return 5; }
62*de59f564SAaron Ballman S3 c;               // expected-note 3 {{'c' defined here}}
63*de59f564SAaron Ballman const S3 ca[5];     // expected-note 2 {{'ca' defined here}}
64*de59f564SAaron Ballman extern const int f; // expected-note 4 {{'f' declared here}}
65*de59f564SAaron Ballman class S4 {
66*de59f564SAaron Ballman   int a;
67*de59f564SAaron Ballman   S4(); // expected-note {{implicitly declared private here}}
68*de59f564SAaron Ballman   S4(const S4 &s4);
operator +(const S4 & arg)69*de59f564SAaron Ballman   S4 &operator+(const S4 &arg) { return (*this); }
70*de59f564SAaron Ballman 
71*de59f564SAaron Ballman public:
S4(int v)72*de59f564SAaron Ballman   S4(int v) : a(v) {}
73*de59f564SAaron Ballman };
operator &=(S4 & arg1,S4 & arg2)74*de59f564SAaron Ballman S4 &operator&=(S4 &arg1, S4 &arg2) { return arg1; }
75*de59f564SAaron Ballman class S5 {
76*de59f564SAaron Ballman   int a:32;
S5()77*de59f564SAaron Ballman   S5() : a(0) {} // expected-note {{implicitly declared private here}}
S5(const S5 & s5)78*de59f564SAaron Ballman   S5(const S5 &s5) : a(s5.a) {}
79*de59f564SAaron Ballman   S5 &operator+(const S5 &arg);
80*de59f564SAaron Ballman 
81*de59f564SAaron Ballman public:
S5(int v)82*de59f564SAaron Ballman   S5(int v) : a(v) {}
83*de59f564SAaron Ballman };
84*de59f564SAaron Ballman class S6 { // expected-note 3 {{candidate function (the implicit copy assignment operator) not viable: no known conversion from 'int' to 'const S6' for 1st argument}}
85*de59f564SAaron Ballman #if __cplusplus >= 201103L // C++11 or later
86*de59f564SAaron Ballman // expected-note@-2 3 {{candidate function (the implicit move assignment operator) not viable}}
87*de59f564SAaron Ballman #endif
88*de59f564SAaron Ballman   int a;
89*de59f564SAaron Ballman 
90*de59f564SAaron Ballman public:
S6()91*de59f564SAaron Ballman   S6() : a(6) {}
operator int()92*de59f564SAaron Ballman   operator int() { return 6; }
93*de59f564SAaron Ballman } o;
94*de59f564SAaron Ballman 
95*de59f564SAaron Ballman struct S7 {
96*de59f564SAaron Ballman   int a: 32;
S7S797*de59f564SAaron Ballman   S7() {
98*de59f564SAaron Ballman     [[omp::directive(taskloop reduction(+:a))]] // expected-error {{expected addressable reduction item for the task-based directives}}
99*de59f564SAaron Ballman     for (int i = 0; i < 10; ++i)
100*de59f564SAaron Ballman       ++a;
101*de59f564SAaron Ballman   }
102*de59f564SAaron Ballman };
103*de59f564SAaron Ballman 
104*de59f564SAaron Ballman S3 h, k;
105*de59f564SAaron Ballman [[omp::directive(threadprivate(h))]]; // expected-note 2 {{defined as threadprivate or thread local}}
106*de59f564SAaron Ballman 
107*de59f564SAaron Ballman template <class T>       // expected-note {{declared here}}
tmain(T argc)108*de59f564SAaron Ballman T tmain(T argc) {
109*de59f564SAaron Ballman   const T d = T();       // expected-note 4 {{'d' defined here}}
110*de59f564SAaron Ballman   const T da[5] = {T()}; // expected-note 2 {{'da' defined here}}
111*de59f564SAaron Ballman   T qa[5] = {T()};
112*de59f564SAaron Ballman   T i, z;
113*de59f564SAaron Ballman   T &j = i;                        // expected-note 4 {{'j' defined here}}
114*de59f564SAaron Ballman   S3 &p = k;                       // expected-note 2 {{'p' defined here}}
115*de59f564SAaron Ballman   const T &r = da[(int)i];         // expected-note 2 {{'r' defined here}}
116*de59f564SAaron Ballman   T &q = qa[(int)i];               // expected-note 2 {{'q' defined here}}
117*de59f564SAaron Ballman   T fl;
118*de59f564SAaron Ballman   [[omp::directive(taskloop reduction)]] // expected-error {{expected '(' after 'reduction'}}
119*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
120*de59f564SAaron Ballman     foo();
121*de59f564SAaron Ballman   [[omp::directive(taskloop reduction +)]] // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp taskloop' are ignored}}
122*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
123*de59f564SAaron Ballman     foo();
124*de59f564SAaron Ballman   [[omp::directive(taskloop reduction())]] // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
125*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
126*de59f564SAaron Ballman     foo();
127*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(*))]] // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}}
128*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
129*de59f564SAaron Ballman     foo();
130*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(\))]] // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
131*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
132*de59f564SAaron Ballman     foo();
133*de59f564SAaron Ballman   [[omp::directive(taskloop 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'}}
134*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
135*de59f564SAaron Ballman     foo();
136*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(^ : T))]] // expected-error {{'T' does not refer to a value}}
137*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
138*de59f564SAaron Ballman     foo();
139*de59f564SAaron Ballman   [[omp::directive(taskloop 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'}}
140*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
141*de59f564SAaron Ballman     foo();
142*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(min : 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}}
143*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
144*de59f564SAaron Ballman     foo();
145*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(max : h.b))]] // expected-error {{expected variable name, array element or array section}}
146*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
147*de59f564SAaron Ballman     foo();
148*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+ : ba))]] // expected-error {{const-qualified variable cannot be reduction}}
149*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
150*de59f564SAaron Ballman     foo();
151*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(* : ca))]] // expected-error {{const-qualified variable cannot be reduction}}
152*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
153*de59f564SAaron Ballman     foo();
154*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(- : da))]] // expected-error {{const-qualified variable cannot be reduction}} expected-error {{const-qualified variable cannot be reduction}}
155*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
156*de59f564SAaron Ballman     foo();
157*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(^ : fl))]] // expected-error {{invalid operands to binary expression ('float' and 'float')}}
158*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
159*de59f564SAaron Ballman     foo();
160*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(&& : S2::S2s))]] // expected-error {{shared variable cannot be reduction}}
161*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
162*de59f564SAaron Ballman     foo();
163*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(&& : S2::S2sc))]] // expected-error {{const-qualified variable cannot be reduction}}
164*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
165*de59f564SAaron Ballman     foo();
166*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+ : h, k))]] // expected-error {{threadprivate or thread local variable cannot be reduction}}
167*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
168*de59f564SAaron Ballman     foo();
169*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+ : o))]] // expected-error 2 {{no viable overloaded '='}}
170*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
171*de59f564SAaron Ballman     foo();
172*de59f564SAaron Ballman   [[omp::directive(taskloop private(i), reduction(+ : j), reduction(+ : q))]] // expected-error 4 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
173*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
174*de59f564SAaron Ballman     foo();
175*de59f564SAaron Ballman   [[omp::sequence(directive(parallel private(k)), directive(taskloop reduction(+ : p), reduction(+ : p)))]] // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
176*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
177*de59f564SAaron Ballman     foo();
178*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+ : p), reduction(+ : p))]] // expected-error 2 {{variable can appear only once in OpenMP 'reduction' clause}} expected-note 2 {{previously referenced here}}
179*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
180*de59f564SAaron Ballman     foo();
181*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+ : r))]] // expected-error 2 {{const-qualified variable cannot be reduction}}
182*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
183*de59f564SAaron Ballman     foo();
184*de59f564SAaron Ballman   [[omp::sequence(directive(parallel shared(i)), directive(parallel reduction(min : i)), directive(taskloop reduction(max : j)))]] // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
185*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
186*de59f564SAaron Ballman     foo();
187*de59f564SAaron Ballman   [[omp::sequence(directive(parallel private(fl)), directive(taskloop reduction(+ : fl) allocate(omp_thread_mem_alloc: fl)))]] // expected-warning 2 {{allocator with the 'thread' trait access has unspecified behavior on 'taskloop' directive}}
188*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
189*de59f564SAaron Ballman     foo();
190*de59f564SAaron Ballman   [[omp::sequence(directive(parallel reduction(* : fl)), directive(taskloop reduction(+ : fl)))]]
191*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
192*de59f564SAaron Ballman     foo();
193*de59f564SAaron Ballman 
194*de59f564SAaron Ballman   return T();
195*de59f564SAaron Ballman }
196*de59f564SAaron Ballman 
197*de59f564SAaron Ballman namespace A {
198*de59f564SAaron Ballman double x;
199*de59f564SAaron Ballman [[omp::directive(threadprivate(x))]]; // expected-note {{defined as threadprivate or thread local}}
200*de59f564SAaron Ballman }
201*de59f564SAaron Ballman namespace B {
202*de59f564SAaron Ballman using A::x;
203*de59f564SAaron Ballman }
204*de59f564SAaron Ballman 
main(int argc,char ** argv)205*de59f564SAaron Ballman int main(int argc, char **argv) {
206*de59f564SAaron Ballman   const int d = 5;       // expected-note 2 {{'d' defined here}}
207*de59f564SAaron Ballman   const int da[5] = {0}; // expected-note {{'da' defined here}}
208*de59f564SAaron Ballman   int qa[5] = {0};
209*de59f564SAaron Ballman   S4 e(4);
210*de59f564SAaron Ballman   S5 g(5);
211*de59f564SAaron Ballman   int i, z;
212*de59f564SAaron Ballman   int &j = i;                      // expected-note 2 {{'j' defined here}}
213*de59f564SAaron Ballman   S3 &p = k;                       // expected-note 2 {{'p' defined here}}
214*de59f564SAaron Ballman   const int &r = da[i];            // expected-note {{'r' defined here}}
215*de59f564SAaron Ballman   int &q = qa[i];                  // expected-note {{'q' defined here}}
216*de59f564SAaron Ballman   float fl;
217*de59f564SAaron Ballman   [[omp::directive(taskloop reduction)]] // expected-error {{expected '(' after 'reduction'}}
218*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
219*de59f564SAaron Ballman     foo();
220*de59f564SAaron Ballman   [[omp::directive(taskloop reduction +)]] // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp taskloop' are ignored}}
221*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
222*de59f564SAaron Ballman     foo();
223*de59f564SAaron Ballman   [[omp::directive(taskloop reduction())]] // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
224*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
225*de59f564SAaron Ballman     foo();
226*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(*))]] // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}}
227*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
228*de59f564SAaron Ballman     foo();
229*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(\))]] // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
230*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
231*de59f564SAaron Ballman     foo();
232*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(~ : argc))]] // expected-error {{expected unqualified-id}}
233*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
234*de59f564SAaron Ballman     foo();
235*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(&& : argc, z))]]
236*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
237*de59f564SAaron Ballman     foo();
238*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(^ : S1))]] // expected-error {{'S1' does not refer to a value}}
239*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
240*de59f564SAaron Ballman     foo();
241*de59f564SAaron Ballman   [[omp::directive(taskloop 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'}}
242*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
243*de59f564SAaron Ballman     foo();
244*de59f564SAaron Ballman   [[omp::directive(taskloop 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}}
245*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
246*de59f564SAaron Ballman     foo();
247*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(max : h.b))]] // expected-error {{expected variable name, array element or array section}}
248*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
249*de59f564SAaron Ballman     foo();
250*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+ : ba))]] // expected-error {{const-qualified variable cannot be reduction}}
251*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
252*de59f564SAaron Ballman     foo();
253*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(* : ca))]] // expected-error {{const-qualified variable cannot be reduction}}
254*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
255*de59f564SAaron Ballman     foo();
256*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(- : da))]] // expected-error {{const-qualified variable cannot be reduction}}
257*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
258*de59f564SAaron Ballman     foo();
259*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(^ : fl))]] // expected-error {{invalid operands to binary expression ('float' and 'float')}}
260*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
261*de59f564SAaron Ballman     foo();
262*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(&& : S2::S2s))]] // expected-error {{shared variable cannot be reduction}}
263*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
264*de59f564SAaron Ballman     foo();
265*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(&& : S2::S2sc))]] // expected-error {{const-qualified variable cannot be reduction}}
266*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
267*de59f564SAaron Ballman     foo();
268*de59f564SAaron Ballman   [[omp::directive(taskloop 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')}}
269*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
270*de59f564SAaron Ballman     foo();
271*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+ : h, k, B::x))]] // expected-error 2 {{threadprivate or thread local variable cannot be reduction}}
272*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
273*de59f564SAaron Ballman     foo();
274*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+ : o))]] // expected-error {{no viable overloaded '='}}
275*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
276*de59f564SAaron Ballman     foo();
277*de59f564SAaron Ballman   [[omp::directive(taskloop private(i), reduction(+ : j), reduction(+ : q))]] // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
278*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
279*de59f564SAaron Ballman     foo();
280*de59f564SAaron Ballman   [[omp::sequence(directive(parallel private(k)), directive(taskloop reduction(+ : p), reduction(+ : p)))]] // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
281*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
282*de59f564SAaron Ballman     foo();
283*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+ : p), reduction(+ : p))]] // expected-error {{variable can appear only once in OpenMP 'reduction' clause}} expected-note {{previously referenced here}}
284*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
285*de59f564SAaron Ballman     foo();
286*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+ : r))]] // expected-error {{const-qualified variable cannot be reduction}}
287*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
288*de59f564SAaron Ballman     foo();
289*de59f564SAaron Ballman   [[omp::sequence(directive(parallel shared(i)), directive(parallel reduction(min : i)), directive(taskloop reduction(max : j)))]] // expected-error {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
290*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
291*de59f564SAaron Ballman     foo();
292*de59f564SAaron Ballman   [[omp::sequence(directive(parallel private(fl)), directive(taskloop reduction(+ : fl)))]]
293*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
294*de59f564SAaron Ballman     foo();
295*de59f564SAaron Ballman   [[omp::sequence(directive(parallel reduction(* : fl)), directive(taskloop reduction(+ : fl)))]]
296*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
297*de59f564SAaron Ballman     foo();
298*de59f564SAaron Ballman   static int m;
299*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(+ : m))]] // OK
300*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
301*de59f564SAaron Ballman     m++;
302*de59f564SAaron Ballman   [[omp::directive(taskloop reduction(task, + : m))]] // expected-error {{'reduction' clause with 'task' modifier allowed only on non-simd parallel or worksharing constructs}}
303*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
304*de59f564SAaron Ballman     m++;
305*de59f564SAaron Ballman   [[omp::directive(taskloop nogroup reduction(+ : m))]] // expected-error {{'reduction' clause cannot be used with 'nogroup' clause}}
306*de59f564SAaron Ballman   for (int i = 0; i < 10; ++i)
307*de59f564SAaron Ballman     m++;
308*de59f564SAaron Ballman 
309*de59f564SAaron Ballman   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}}
310*de59f564SAaron Ballman }
311*de59f564SAaron Ballman 
312