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