1// RUN: %clang_cc1 -fsyntax-only -fopenmp=libiomp5 -verify %s
2
3void foo();
4
5// expected-error@+1 {{unexpected OpenMP directive '#pragma omp sections'}}
6#pragma omp sections
7
8// expected-error@+1 {{unexpected OpenMP directive '#pragma omp sections'}}
9#pragma omp sections foo
10
11void test_no_clause() {
12  int i;
13#pragma omp sections
14  {
15    foo();
16  }
17
18// expected-error@+2 {{the statement for '#pragma omp sections' must be a compound statement}}
19#pragma omp sections
20  ++i;
21
22#pragma omp sections
23  {
24    foo();
25    foo(); // expected-error {{statement in 'omp sections' directive must be enclosed into a section region}}
26  }
27}
28
29void test_branch_protected_scope() {
30  int i = 0;
31L1:
32  ++i;
33
34  int x[24];
35
36#pragma omp parallel
37#pragma omp sections
38  {
39    if (i == 5)
40      goto L1; // expected-error {{use of undeclared label 'L1'}}
41    else if (i == 6)
42      return; // expected-error {{cannot return from OpenMP region}}
43    else if (i == 7)
44      goto L2;
45    else if (i == 8) {
46    L2:
47      x[i]++;
48    }
49#pragma omp section
50    if (i == 5)
51      goto L1; // expected-error {{use of undeclared label 'L1'}}
52    else if (i == 6)
53      return; // expected-error {{cannot return from OpenMP region}}
54    else if (i == 7)
55      goto L3;
56    else if (i == 8) {
57    L3:
58      x[i]++;
59    }
60  }
61
62  if (x[0] == 0)
63    goto L2; // expected-error {{use of undeclared label 'L2'}}
64  else if (x[1] == 1)
65    goto L1;
66  goto L3; // expected-error {{use of undeclared label 'L3'}}
67}
68
69void test_invalid_clause() {
70  int i;
71#pragma omp parallel
72// expected-warning@+1 {{extra tokens at the end of '#pragma omp sections' are ignored}}
73#pragma omp sections foo bar
74  {
75    foo();
76// expected-error@+1 {{unexpected OpenMP clause 'nowait' in directive '#pragma omp section'}}
77#pragma omp section nowait
78    ;
79  }
80}
81
82void test_non_identifiers() {
83  int i, x;
84
85#pragma omp parallel
86// expected-warning@+1 {{extra tokens at the end of '#pragma omp sections' are ignored}}
87#pragma omp sections;
88  {
89    foo();
90  }
91#pragma omp parallel
92// expected-error@+2 {{unexpected OpenMP clause 'linear' in directive '#pragma omp sections'}}
93// expected-warning@+1 {{extra tokens at the end of '#pragma omp sections' are ignored}}
94#pragma omp sections linear(x);
95  {
96    foo();
97  }
98
99#pragma omp parallel
100// expected-warning@+1 {{extra tokens at the end of '#pragma omp sections' are ignored}}
101#pragma omp sections private(x);
102  {
103    foo();
104  }
105
106#pragma omp parallel
107// expected-warning@+1 {{extra tokens at the end of '#pragma omp sections' are ignored}}
108#pragma omp sections, private(x);
109  {
110    foo();
111  }
112}
113
114void test_private() {
115  int i;
116#pragma omp parallel
117// expected-error@+2 {{expected expression}}
118// expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
119#pragma omp sections private(
120  {
121    foo();
122  }
123#pragma omp parallel
124// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
125// expected-error@+1 2 {{expected expression}}
126#pragma omp sections private(,
127  {
128    foo();
129  }
130#pragma omp parallel
131// expected-error@+1 2 {{expected expression}}
132#pragma omp sections private(, )
133  {
134    foo();
135  }
136#pragma omp parallel
137// expected-error@+1 {{expected expression}}
138#pragma omp sections private()
139  {
140    foo();
141  }
142#pragma omp parallel
143// expected-error@+1 {{expected expression}}
144#pragma omp sections private(int)
145  {
146    foo();
147  }
148#pragma omp parallel
149// expected-error@+1 {{expected variable name}}
150#pragma omp sections private(0)
151  {
152    foo();
153  }
154
155  int x, y, z;
156#pragma omp parallel
157#pragma omp sections private(x)
158  {
159    foo();
160  }
161#pragma omp parallel
162#pragma omp sections private(x, y)
163  {
164    foo();
165  }
166#pragma omp parallel
167#pragma omp sections private(x, y, z)
168  {
169    foo();
170  }
171}
172
173void test_lastprivate() {
174  int i;
175#pragma omp parallel
176// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
177// expected-error@+1 {{expected expression}}
178#pragma omp sections lastprivate(
179  {
180    foo();
181  }
182
183#pragma omp parallel
184// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
185// expected-error@+1 2 {{expected expression}}
186#pragma omp sections lastprivate(,
187  {
188    foo();
189  }
190#pragma omp parallel
191// expected-error@+1 2 {{expected expression}}
192#pragma omp sections lastprivate(, )
193  {
194    foo();
195  }
196#pragma omp parallel
197// expected-error@+1 {{expected expression}}
198#pragma omp sections lastprivate()
199  {
200    foo();
201  }
202#pragma omp parallel
203// expected-error@+1 {{expected expression}}
204#pragma omp sections lastprivate(int)
205  {
206    foo();
207  }
208#pragma omp parallel
209// expected-error@+1 {{expected variable name}}
210#pragma omp sections lastprivate(0)
211  {
212    foo();
213  }
214
215  int x, y, z;
216#pragma omp parallel
217#pragma omp sections lastprivate(x)
218  {
219    foo();
220  }
221#pragma omp parallel
222#pragma omp sections lastprivate(x, y)
223  {
224    foo();
225  }
226#pragma omp parallel
227#pragma omp sections lastprivate(x, y, z)
228  {
229    foo();
230  }
231}
232
233void test_firstprivate() {
234  int i;
235#pragma omp parallel
236// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
237// expected-error@+1 {{expected expression}}
238#pragma omp sections firstprivate(
239  {
240    foo();
241  }
242
243#pragma omp parallel
244// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
245// expected-error@+1 2 {{expected expression}}
246#pragma omp sections firstprivate(,
247  {
248    foo();
249  }
250#pragma omp parallel
251// expected-error@+1 2 {{expected expression}}
252#pragma omp sections firstprivate(, )
253  {
254    foo();
255  }
256#pragma omp parallel
257// expected-error@+1 {{expected expression}}
258#pragma omp sections firstprivate()
259  {
260    foo();
261  }
262#pragma omp parallel
263// expected-error@+1 {{expected expression}}
264#pragma omp sections firstprivate(int)
265  {
266    foo();
267  }
268#pragma omp parallel
269// expected-error@+1 {{expected variable name}}
270#pragma omp sections firstprivate(0)
271  {
272    foo();
273  }
274
275  int x, y, z;
276#pragma omp parallel
277#pragma omp sections lastprivate(x) firstprivate(x)
278  {
279    foo();
280  }
281#pragma omp parallel
282#pragma omp sections lastprivate(x, y) firstprivate(x, y)
283  {
284    foo();
285  }
286#pragma omp parallel
287#pragma omp sections lastprivate(x, y, z) firstprivate(x, y, z)
288  {
289    foo();
290  }
291}
292
293void test_nowait() {
294#pragma omp parallel
295#pragma omp sections nowait nowait // expected-error {{directive '#pragma omp sections' cannot contain more than one 'nowait' clause}}
296  {
297    ;
298  }
299}
300