xref: /llvm-project/clang/test/OpenMP/master_taskloop_simd_private_messages.cpp (revision 8026394d3cc77db6f8172eeaa83b9747979c8642)
1b8552abfSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized
2b8552abfSAlexey Bataev 
3b8552abfSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
4b8552abfSAlexey Bataev 
5b8552abfSAlexey Bataev typedef void **omp_allocator_handle_t;
6*8026394dSAlexey Bataev extern const omp_allocator_handle_t omp_null_allocator;
7b8552abfSAlexey Bataev extern const omp_allocator_handle_t omp_default_mem_alloc;
8b8552abfSAlexey Bataev extern const omp_allocator_handle_t omp_large_cap_mem_alloc;
9b8552abfSAlexey Bataev extern const omp_allocator_handle_t omp_const_mem_alloc;
10b8552abfSAlexey Bataev extern const omp_allocator_handle_t omp_high_bw_mem_alloc;
11b8552abfSAlexey Bataev extern const omp_allocator_handle_t omp_low_lat_mem_alloc;
12b8552abfSAlexey Bataev extern const omp_allocator_handle_t omp_cgroup_mem_alloc;
13b8552abfSAlexey Bataev extern const omp_allocator_handle_t omp_pteam_mem_alloc;
14b8552abfSAlexey Bataev extern const omp_allocator_handle_t omp_thread_mem_alloc;
15b8552abfSAlexey Bataev 
foo()16b8552abfSAlexey Bataev void foo() {
17b8552abfSAlexey Bataev }
18b8552abfSAlexey Bataev 
foobool(int argc)19b8552abfSAlexey Bataev bool foobool(int argc) {
20b8552abfSAlexey Bataev   return argc;
21b8552abfSAlexey Bataev }
22b8552abfSAlexey Bataev 
23b8552abfSAlexey Bataev struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
24b8552abfSAlexey Bataev extern S1 a;
25b8552abfSAlexey Bataev class S2 {
26b8552abfSAlexey Bataev   mutable int a;
27b8552abfSAlexey Bataev 
28b8552abfSAlexey Bataev public:
S2()29b8552abfSAlexey Bataev   S2() : a(0) {}
30b8552abfSAlexey Bataev };
31b8552abfSAlexey Bataev const S2 b;
32b8552abfSAlexey Bataev const S2 ba[5];
33b8552abfSAlexey Bataev class S3 {
34b8552abfSAlexey Bataev   int a;
35b8552abfSAlexey Bataev 
36b8552abfSAlexey Bataev public:
S3()37b8552abfSAlexey Bataev   S3() : a(0) {}
38b8552abfSAlexey Bataev };
39b8552abfSAlexey Bataev const S3 ca[5];
40b8552abfSAlexey Bataev class S4 {
41b8552abfSAlexey Bataev   int a;
42b8552abfSAlexey Bataev   S4(); // expected-note {{implicitly declared private here}}
43b8552abfSAlexey Bataev 
44b8552abfSAlexey Bataev public:
S4(int v)45b8552abfSAlexey Bataev   S4(int v) : a(v) {
46b8552abfSAlexey Bataev #pragma omp master taskloop simd private(a) private(this->a)
47b8552abfSAlexey Bataev     for (int k = 0; k < v; ++k)
48b8552abfSAlexey Bataev       ++this->a;
49b8552abfSAlexey Bataev   }
50b8552abfSAlexey Bataev };
51b8552abfSAlexey Bataev class S5 {
52b8552abfSAlexey Bataev   int a;
S5()53b8552abfSAlexey Bataev   S5() : a(0) {} // expected-note {{implicitly declared private here}}
54b8552abfSAlexey Bataev 
55b8552abfSAlexey Bataev public:
S5(int v)56b8552abfSAlexey Bataev   S5(int v) : a(v) {}
operator =(S5 & s)57b8552abfSAlexey Bataev   S5 &operator=(S5 &s) {
58b8552abfSAlexey Bataev #pragma omp master taskloop simd private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}
59b8552abfSAlexey Bataev     for (int k = 0; k < s.a; ++k)
60b8552abfSAlexey Bataev       ++s.a;
61b8552abfSAlexey Bataev     return *this;
62b8552abfSAlexey Bataev   }
63b8552abfSAlexey Bataev };
64b8552abfSAlexey Bataev 
65b8552abfSAlexey Bataev template <typename T>
66b8552abfSAlexey Bataev class S6 {
67b8552abfSAlexey Bataev public:
68b8552abfSAlexey Bataev   T a;
69b8552abfSAlexey Bataev 
S6()70b8552abfSAlexey Bataev   S6() : a(0) {}
S6(T v)71b8552abfSAlexey Bataev   S6(T v) : a(v) {
72b8552abfSAlexey Bataev #pragma omp master taskloop simd allocate(omp_thread_mem_alloc: a) private(a) private(this->a) // expected-warning {{allocator with the 'thread' trait access has unspecified behavior on 'master taskloop simd' directive}}
73b8552abfSAlexey Bataev     for (int k = 0; k < v; ++k)
74b8552abfSAlexey Bataev       ++this->a;
75b8552abfSAlexey Bataev   }
operator =(S6 & s)76b8552abfSAlexey Bataev   S6 &operator=(S6 &s) {
77b8552abfSAlexey Bataev #pragma omp master taskloop simd private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}
78b8552abfSAlexey Bataev     for (int k = 0; k < s.a; ++k)
79b8552abfSAlexey Bataev       ++s.a;
80b8552abfSAlexey Bataev     return *this;
81b8552abfSAlexey Bataev   }
82b8552abfSAlexey Bataev };
83b8552abfSAlexey Bataev 
84b8552abfSAlexey Bataev template <typename T>
85b8552abfSAlexey Bataev class S7 : public T {
86b8552abfSAlexey Bataev   T a;
S7()87b8552abfSAlexey Bataev   S7() : a(0) {}
88b8552abfSAlexey Bataev 
89b8552abfSAlexey Bataev public:
S7(T v)90b8552abfSAlexey Bataev   S7(T v) : a(v) {
91b8552abfSAlexey Bataev #pragma omp master taskloop simd private(a) private(this->a) private(T::a)
92b8552abfSAlexey Bataev     for (int k = 0; k < a.a; ++k)
93b8552abfSAlexey Bataev       ++this->a.a;
94b8552abfSAlexey Bataev   }
operator =(S7 & s)95b8552abfSAlexey Bataev   S7 &operator=(S7 &s) {
96b8552abfSAlexey Bataev #pragma omp master taskloop simd private(a) private(this->a) private(s.a) private(s.T::a) // expected-error 2 {{expected variable name or data member of current class}}
97b8552abfSAlexey Bataev     for (int k = 0; k < s.a.a; ++k)
98b8552abfSAlexey Bataev       ++s.a.a;
99b8552abfSAlexey Bataev     return *this;
100b8552abfSAlexey Bataev   }
101b8552abfSAlexey Bataev };
102b8552abfSAlexey Bataev 
103b8552abfSAlexey Bataev S3 h;
104b8552abfSAlexey Bataev #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
105b8552abfSAlexey Bataev 
106b8552abfSAlexey Bataev template <class I, class C>
foomain(I argc,C ** argv)107b8552abfSAlexey Bataev int foomain(I argc, C **argv) {
108b8552abfSAlexey Bataev   I e(4);
109b8552abfSAlexey Bataev   I g(5);
110b8552abfSAlexey Bataev   int i, z;
111b8552abfSAlexey Bataev   int &j = i;
112b8552abfSAlexey Bataev #pragma omp master taskloop simd private // expected-error {{expected '(' after 'private'}}
113b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
114b8552abfSAlexey Bataev     ++k;
115b8552abfSAlexey Bataev #pragma omp master taskloop simd private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
116b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
117b8552abfSAlexey Bataev     ++k;
118b8552abfSAlexey Bataev #pragma omp master taskloop simd private() // expected-error {{expected expression}}
119b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
120b8552abfSAlexey Bataev     ++k;
121b8552abfSAlexey Bataev #pragma omp master taskloop simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
122b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
123b8552abfSAlexey Bataev     ++k;
124b8552abfSAlexey Bataev #pragma omp master taskloop simd private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
125b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
126b8552abfSAlexey Bataev     ++k;
127b8552abfSAlexey Bataev #pragma omp master taskloop simd private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
128b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
129b8552abfSAlexey Bataev     ++k;
130b8552abfSAlexey Bataev #pragma omp master taskloop simd private(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 '('}}
131b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
132b8552abfSAlexey Bataev     ++k;
133b8552abfSAlexey Bataev #pragma omp master taskloop simd private(S1) // expected-error {{'S1' does not refer to a value}}
134b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
135b8552abfSAlexey Bataev     ++k;
136b8552abfSAlexey Bataev #pragma omp master taskloop simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
137b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
138b8552abfSAlexey Bataev     ++k;
139b8552abfSAlexey Bataev #pragma omp master taskloop simd private(argv[1]) // expected-error {{expected variable name}}
140b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
141b8552abfSAlexey Bataev     ++k;
142b8552abfSAlexey Bataev #pragma omp master taskloop simd private(e, g, z)
143b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
144b8552abfSAlexey Bataev     ++k;
145b8552abfSAlexey Bataev #pragma omp master taskloop simd private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
146b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
147b8552abfSAlexey Bataev     ++k;
148b8552abfSAlexey Bataev #pragma omp master taskloop simd shared(i)
149b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
150b8552abfSAlexey Bataev     ++k;
151b8552abfSAlexey Bataev #pragma omp parallel
152b8552abfSAlexey Bataev   {
153b8552abfSAlexey Bataev     int v = 0;
154b8552abfSAlexey Bataev     int i;
155b8552abfSAlexey Bataev #pragma omp master taskloop simd private(i)
156b8552abfSAlexey Bataev     for (int k = 0; k < argc; ++k) {
157b8552abfSAlexey Bataev       i = k;
158b8552abfSAlexey Bataev       v += i;
159b8552abfSAlexey Bataev     }
160b8552abfSAlexey Bataev   }
161b8552abfSAlexey Bataev #pragma omp parallel shared(i)
162b8552abfSAlexey Bataev #pragma omp parallel private(i)
163b8552abfSAlexey Bataev #pragma omp master taskloop simd private(j)
164b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
165b8552abfSAlexey Bataev     ++k;
166b8552abfSAlexey Bataev #pragma omp master taskloop simd private(i)
167b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
168b8552abfSAlexey Bataev     ++k;
169b8552abfSAlexey Bataev   return 0;
170b8552abfSAlexey Bataev }
171b8552abfSAlexey Bataev 
bar(S4 a[2])172b8552abfSAlexey Bataev void bar(S4 a[2]) {
173b8552abfSAlexey Bataev #pragma omp parallel
174b8552abfSAlexey Bataev #pragma omp master taskloop simd private(a)
175b8552abfSAlexey Bataev   for (int i = 0; i < 2; ++i)
176b8552abfSAlexey Bataev     foo();
177b8552abfSAlexey Bataev }
178b8552abfSAlexey Bataev 
179b8552abfSAlexey Bataev namespace A {
180b8552abfSAlexey Bataev double x;
181b8552abfSAlexey Bataev #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
182b8552abfSAlexey Bataev }
183b8552abfSAlexey Bataev namespace B {
184b8552abfSAlexey Bataev using A::x;
185b8552abfSAlexey Bataev }
186b8552abfSAlexey Bataev 
main(int argc,char ** argv)187b8552abfSAlexey Bataev int main(int argc, char **argv) {
188b8552abfSAlexey Bataev   S4 e(4);
189b8552abfSAlexey Bataev   S5 g(5);
190b8552abfSAlexey Bataev   S6<float> s6(0.0) , s6_0(1.0); // expected-note {{in instantiation of member function 'S6<float>::S6' requested here}}
191b8552abfSAlexey Bataev   S7<S6<float> > s7(0.0) , s7_0(1.0);
192b8552abfSAlexey Bataev   int i, z;
193b8552abfSAlexey Bataev   int &j = i;
194b8552abfSAlexey Bataev #pragma omp master taskloop simd private // expected-error {{expected '(' after 'private'}}
195b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
196b8552abfSAlexey Bataev     ++k;
197b8552abfSAlexey Bataev #pragma omp master taskloop simd private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
198b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
199b8552abfSAlexey Bataev     ++k;
200b8552abfSAlexey Bataev #pragma omp master taskloop simd private() // expected-error {{expected expression}}
201b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
202b8552abfSAlexey Bataev     ++k;
203b8552abfSAlexey Bataev #pragma omp master taskloop simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
204b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
205b8552abfSAlexey Bataev     ++k;
206b8552abfSAlexey Bataev #pragma omp master taskloop simd private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
207b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
208b8552abfSAlexey Bataev     ++k;
209b8552abfSAlexey Bataev #pragma omp master taskloop simd private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
210b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
211b8552abfSAlexey Bataev     ++k;
212b8552abfSAlexey Bataev #pragma omp master taskloop simd private(argc, z)
213b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
214b8552abfSAlexey Bataev     ++k;
215b8552abfSAlexey Bataev #pragma omp master taskloop simd private(S1) // expected-error {{'S1' does not refer to a value}}
216b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
217b8552abfSAlexey Bataev     ++k;
218b8552abfSAlexey Bataev #pragma omp master taskloop simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
219b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
220b8552abfSAlexey Bataev     ++k;
221b8552abfSAlexey Bataev #pragma omp master taskloop simd private(argv[1]) // expected-error {{expected variable name}}
222b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
223b8552abfSAlexey Bataev     ++k;
224b8552abfSAlexey Bataev #pragma omp master taskloop simd private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
225b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
226b8552abfSAlexey Bataev     ++k;
227b8552abfSAlexey Bataev #pragma omp master taskloop simd private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
228b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
229b8552abfSAlexey Bataev     ++k;
230b8552abfSAlexey Bataev #pragma omp master taskloop simd private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}
231b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
232b8552abfSAlexey Bataev     ++k;
233b8552abfSAlexey Bataev #pragma omp master taskloop simd shared(i)
234b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
235b8552abfSAlexey Bataev     ++k;
236b8552abfSAlexey Bataev #pragma omp parallel
237b8552abfSAlexey Bataev   {
238b8552abfSAlexey Bataev     int i;
239b8552abfSAlexey Bataev #pragma omp master taskloop simd private(i)
240b8552abfSAlexey Bataev     for (int k = 0; k < argc; ++k)
241b8552abfSAlexey Bataev       ++k;
242b8552abfSAlexey Bataev   }
243b8552abfSAlexey Bataev #pragma omp parallel shared(i)
244b8552abfSAlexey Bataev #pragma omp parallel private(i)
245b8552abfSAlexey Bataev #pragma omp master taskloop simd private(j)
246b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
247b8552abfSAlexey Bataev     ++k;
248b8552abfSAlexey Bataev #pragma omp master taskloop simd private(i)
249b8552abfSAlexey Bataev   for (int k = 0; k < argc; ++k)
250b8552abfSAlexey Bataev     ++k;
251b8552abfSAlexey Bataev   static int si;
252b8552abfSAlexey Bataev #pragma omp master taskloop simd private(si) // OK
253b8552abfSAlexey Bataev   for(int k = 0; k < argc; ++k)
254b8552abfSAlexey Bataev     si = k + 1;
255b8552abfSAlexey Bataev 
256b8552abfSAlexey Bataev   s6 = s6_0; // expected-note {{in instantiation of member function 'S6<float>::operator=' requested here}}
257b8552abfSAlexey Bataev   s7 = s7_0; // expected-note {{in instantiation of member function 'S7<S6<float>>::operator=' requested here}}
258b8552abfSAlexey Bataev   return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}
259b8552abfSAlexey Bataev }
260b8552abfSAlexey Bataev 
261