1 // RUN: %clang_cc1 -verify -fopenmp %s
2
foo()3 void foo() {
4 }
5
foobool(int argc)6 bool foobool(int argc) {
7 return argc;
8 }
9
10 struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
11 extern S1 a;
12 class S2 {
13 mutable int a;
14
15 public:
S2()16 S2() : a(0) {}
S2(S2 & s2)17 S2(S2 &s2) : a(s2.a) {}
18 const S2 &operator =(const S2&) const;
19 S2 &operator =(const S2&);
20 static float S2s; // expected-note {{static data member is predetermined as shared}}
21 static const float S2sc;
22 };
23 const float S2::S2sc = 0; // expected-note {{static data member is predetermined as shared}}
24 const S2 b;
25 const S2 ba[5];
26 class S3 {
27 int a;
28 S3 &operator=(const S3 &s3); // expected-note 2 {{implicitly declared private here}}
29
30 public:
S3()31 S3() : a(0) {}
S3(S3 & s3)32 S3(S3 &s3) : a(s3.a) {}
33 };
34 const S3 c; // expected-note {{global variable is predetermined as shared}}
35 const S3 ca[5]; // expected-note {{global variable is predetermined as shared}}
36 extern const int f; // expected-note {{global variable is predetermined as shared}}
37 class S4 {
38 int a;
39 S4(); // expected-note 3 {{implicitly declared private here}}
40 S4(const S4 &s4);
41
42 public:
S4(int v)43 S4(int v) : a(v) {}
44 };
45 class S5 {
46 int a;
S5()47 S5() : a(0) {} // expected-note {{implicitly declared private here}}
48
49 public:
S5(const S5 & s5)50 S5(const S5 &s5) : a(s5.a) {}
S5(int v)51 S5(int v) : a(v) {}
52 };
53 class S6 {
54 int a;
S6()55 S6() : a(0) {}
56
57 public:
S6(const S6 & s6)58 S6(const S6 &s6) : a(s6.a) {}
S6(int v)59 S6(int v) : a(v) {}
60 };
61
62 S3 h;
63 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
64
65 template <class I, class C>
foomain(int argc,char ** argv)66 int foomain(int argc, char **argv) {
67 I e(4);
68 I g(5);
69 int i;
70 int &j = i;
71 #pragma omp parallel
72 #pragma omp taskloop lastprivate // expected-error {{expected '(' after 'lastprivate'}}
73 for (int k = 0; k < argc; ++k)
74 ++k;
75 #pragma omp parallel
76 #pragma omp taskloop lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
77 for (int k = 0; k < argc; ++k)
78 ++k;
79 #pragma omp parallel
80 #pragma omp taskloop lastprivate() // expected-error {{expected expression}}
81 for (int k = 0; k < argc; ++k)
82 ++k;
83 #pragma omp parallel
84 #pragma omp taskloop lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
85 for (int k = 0; k < argc; ++k)
86 ++k;
87 #pragma omp parallel
88 #pragma omp taskloop lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
89 for (int k = 0; k < argc; ++k)
90 ++k;
91 #pragma omp parallel
92 #pragma omp taskloop lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
93 for (int k = 0; k < argc; ++k)
94 ++k;
95 #pragma omp parallel
96 #pragma omp taskloop lastprivate(argc)
97 for (int k = 0; k < argc; ++k)
98 ++k;
99 #pragma omp parallel
100 #pragma omp taskloop lastprivate(S1) // expected-error {{'S1' does not refer to a value}}
101 for (int k = 0; k < argc; ++k)
102 ++k;
103 #pragma omp parallel
104 #pragma omp taskloop lastprivate(a, b) // expected-error {{lastprivate variable with incomplete type 'S1'}}
105 for (int k = 0; k < argc; ++k)
106 ++k;
107 #pragma omp parallel
108 #pragma omp taskloop lastprivate(argv[1]) // expected-error {{expected variable name}}
109 for (int k = 0; k < argc; ++k)
110 ++k;
111 #pragma omp parallel
112 #pragma omp taskloop lastprivate(e, g) // expected-error 2 {{calling a private constructor of class 'S4'}}
113 for (int k = 0; k < argc; ++k)
114 ++k;
115 #pragma omp parallel
116 #pragma omp taskloop lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}
117 for (int k = 0; k < argc; ++k)
118 ++k;
119 #pragma omp parallel
120 {
121 int v = 0;
122 int i;
123 #pragma omp taskloop lastprivate(i)
124 for (int k = 0; k < argc; ++k) {
125 i = k;
126 v += i;
127 }
128 }
129 #pragma omp parallel shared(i)
130 #pragma omp parallel private(i)
131 #pragma omp taskloop lastprivate(j)
132 for (int k = 0; k < argc; ++k)
133 ++k;
134 #pragma omp parallel
135 #pragma omp taskloop lastprivate(i)
136 for (int k = 0; k < argc; ++k)
137 ++k;
138 return 0;
139 }
140
bar(S4 a[2])141 void bar(S4 a[2]) {
142 #pragma omp parallel
143 #pragma omp taskloop lastprivate(a)
144 for (int i = 0; i < 2; ++i)
145 foo();
146 }
147
148 namespace A {
149 double x;
150 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
151 }
152 namespace B {
153 using A::x;
154 }
155
main(int argc,char ** argv)156 int main(int argc, char **argv) {
157 const int d = 5; // expected-note {{constant variable is predetermined as shared}}
158 const int da[5] = {0}; // expected-note {{constant variable is predetermined as shared}}
159 S4 e(4);
160 S5 g(5);
161 S3 m;
162 S6 n(2);
163 int i;
164 int &j = i;
165 #pragma omp parallel
166 #pragma omp taskloop lastprivate // expected-error {{expected '(' after 'lastprivate'}}
167 for (i = 0; i < argc; ++i)
168 foo();
169 #pragma omp parallel
170 #pragma omp taskloop lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
171 for (i = 0; i < argc; ++i)
172 foo();
173 #pragma omp parallel
174 #pragma omp taskloop lastprivate() // expected-error {{expected expression}}
175 for (i = 0; i < argc; ++i)
176 foo();
177 #pragma omp parallel
178 #pragma omp taskloop lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
179 for (i = 0; i < argc; ++i)
180 foo();
181 #pragma omp parallel
182 #pragma omp taskloop lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
183 for (i = 0; i < argc; ++i)
184 foo();
185 #pragma omp parallel
186 #pragma omp taskloop lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
187 for (i = 0; i < argc; ++i)
188 foo();
189 #pragma omp parallel
190 #pragma omp taskloop lastprivate(argc)
191 for (i = 0; i < argc; ++i)
192 foo();
193 #pragma omp parallel
194 #pragma omp taskloop lastprivate(S1) // expected-error {{'S1' does not refer to a value}}
195 for (i = 0; i < argc; ++i)
196 foo();
197 #pragma omp parallel
198 #pragma omp taskloop lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be lastprivate}}
199 for (i = 0; i < argc; ++i)
200 foo();
201 #pragma omp parallel
202 #pragma omp taskloop lastprivate(argv[1]) // expected-error {{expected variable name}}
203 for (i = 0; i < argc; ++i)
204 foo();
205 #pragma omp parallel
206 #pragma omp taskloop lastprivate(2 * 2) // expected-error {{expected variable name}}
207 for (i = 0; i < argc; ++i)
208 foo();
209 #pragma omp parallel
210 #pragma omp taskloop lastprivate(ba)
211 for (i = 0; i < argc; ++i)
212 foo();
213 #pragma omp parallel
214 #pragma omp taskloop lastprivate(ca) // expected-error {{shared variable cannot be lastprivate}}
215 for (i = 0; i < argc; ++i)
216 foo();
217 #pragma omp parallel
218 #pragma omp taskloop lastprivate(da) // expected-error {{shared variable cannot be lastprivate}}
219 for (i = 0; i < argc; ++i)
220 foo();
221 int xa;
222 #pragma omp parallel
223 #pragma omp taskloop lastprivate(xa) // OK
224 for (i = 0; i < argc; ++i)
225 foo();
226 #pragma omp parallel
227 #pragma omp taskloop lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}}
228 for (i = 0; i < argc; ++i)
229 foo();
230 #pragma omp parallel
231 #pragma omp taskloop lastprivate(S2::S2sc) // expected-error {{shared variable cannot be lastprivate}}
232 for (i = 0; i < argc; ++i)
233 foo();
234 #pragma omp parallel
235 #pragma omp taskloop safelen(5) // expected-error {{unexpected OpenMP clause 'safelen' in directive '#pragma omp taskloop'}}
236 for (i = 0; i < argc; ++i)
237 foo();
238 #pragma omp parallel
239 #pragma omp taskloop lastprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
240 for (i = 0; i < argc; ++i)
241 foo();
242 #pragma omp parallel
243 #pragma omp taskloop lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}}
244 for (i = 0; i < argc; ++i)
245 foo();
246 #pragma omp parallel
247 #pragma omp taskloop lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}
248 for (i = 0; i < argc; ++i)
249 foo();
250 #pragma omp parallel
251 #pragma omp taskloop lastprivate(B::x) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}
252 for (i = 0; i < argc; ++i)
253 foo();
254 #pragma omp parallel
255 #pragma omp taskloop private(xa), lastprivate(xa) // expected-error {{private variable cannot be lastprivate}} expected-note {{defined as private}}
256 for (i = 0; i < argc; ++i)
257 foo();
258 #pragma omp parallel
259 #pragma omp taskloop lastprivate(i)
260 for (i = 0; i < argc; ++i)
261 foo();
262 #pragma omp parallel private(xa)
263 #pragma omp taskloop lastprivate(xa)
264 for (i = 0; i < argc; ++i)
265 foo();
266 #pragma omp parallel reduction(+ : xa)
267 #pragma omp taskloop lastprivate(xa)
268 for (i = 0; i < argc; ++i)
269 foo();
270 #pragma omp parallel
271 #pragma omp taskloop lastprivate(j)
272 for (i = 0; i < argc; ++i)
273 foo();
274 #pragma omp parallel
275 #pragma omp taskloop firstprivate(m) lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}}
276 for (i = 0; i < argc; ++i)
277 foo();
278 #pragma omp parallel
279 #pragma omp taskloop lastprivate(n) firstprivate(n) // OK
280 for (i = 0; i < argc; ++i)
281 foo();
282 static int si;
283 #pragma omp taskloop lastprivate(si) // OK
284 for (i = 0; i < argc; ++i)
285 si = i + 1;
286 return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}
287 }
288