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