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