1// RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s
2
3void foo();
4
5// expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel sections'}}
6#pragma omp parallel sections
7
8// expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel sections'}}
9#pragma omp parallel sections foo
10
11void test_no_clause() {
12  int i;
13#pragma omp parallel sections
14  {
15    foo();
16  }
17
18// expected-error@+2 {{the statement for '#pragma omp parallel sections' must be a compound statement}}
19#pragma omp parallel sections
20  ++i;
21
22#pragma omp parallel sections
23  {
24    foo();
25    foo(); // expected-error {{statement in 'omp parallel sections' directive must be enclosed into a section region}}
26  }
27
28}
29
30void test_branch_protected_scope() {
31  int i = 0;
32L1:
33  ++i;
34
35  int x[24];
36
37#pragma omp parallel 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// expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}}
72#pragma omp parallel sections foo bar
73  {
74    foo();
75// expected-error@+1 {{unexpected OpenMP clause 'nowait' in directive '#pragma omp section'}}
76#pragma omp section nowait
77    ;
78  }
79}
80
81void test_non_identifiers() {
82  int i, x;
83
84// expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}}
85#pragma omp parallel sections;
86  {
87    foo();
88  }
89// expected-error@+2 {{unexpected OpenMP clause 'linear' in directive '#pragma omp parallel sections'}}
90// expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}}
91#pragma omp parallel sections linear(x);
92  {
93    foo();
94  }
95
96// expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}}
97#pragma omp parallel sections private(x);
98  {
99    foo();
100  }
101
102// expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}}
103#pragma omp parallel sections, private(x);
104  {
105    foo();
106  }
107}
108
109void test_private() {
110  int i;
111// expected-error@+2 {{expected expression}}
112// expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
113#pragma omp parallel sections private(
114  {
115    foo();
116  }
117// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
118// expected-error@+1 2 {{expected expression}}
119#pragma omp parallel sections private(,
120  {
121    foo();
122  }
123// expected-error@+1 2 {{expected expression}}
124#pragma omp parallel sections private(, )
125  {
126    foo();
127  }
128// expected-error@+1 {{expected expression}}
129#pragma omp parallel sections private()
130  {
131    foo();
132  }
133// expected-error@+1 {{expected expression}}
134#pragma omp parallel sections private(int)
135  {
136    foo();
137  }
138// expected-error@+1 {{expected variable name}}
139#pragma omp parallel sections private(0)
140  {
141    foo();
142  }
143
144  int x, y, z;
145#pragma omp parallel sections private(x)
146  {
147    foo();
148  }
149#pragma omp parallel sections private(x, y)
150  {
151    foo();
152  }
153#pragma omp parallel sections private(x, y, z)
154  {
155    foo();
156  }
157}
158
159void test_lastprivate() {
160  int i;
161// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
162// expected-error@+1 {{expected expression}}
163#pragma omp parallel sections lastprivate(
164  {
165    foo();
166  }
167
168// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
169// expected-error@+1 2 {{expected expression}}
170#pragma omp parallel sections lastprivate(,
171  {
172    foo();
173  }
174// expected-error@+1 2 {{expected expression}}
175#pragma omp parallel sections lastprivate(, )
176  {
177    foo();
178  }
179// expected-error@+1 {{expected expression}}
180#pragma omp parallel sections lastprivate()
181  {
182    foo();
183  }
184// expected-error@+1 {{expected expression}}
185#pragma omp parallel sections lastprivate(int)
186  {
187    foo();
188  }
189// expected-error@+1 {{expected variable name}}
190#pragma omp parallel sections lastprivate(0)
191  {
192    foo();
193  }
194
195  int x, y, z;
196#pragma omp parallel sections lastprivate(x)
197  {
198    foo();
199  }
200#pragma omp parallel sections lastprivate(x, y)
201  {
202    foo();
203  }
204#pragma omp parallel sections lastprivate(x, y, z)
205  {
206    foo();
207  }
208}
209
210void test_firstprivate() {
211  int i;
212// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
213// expected-error@+1 {{expected expression}}
214#pragma omp parallel sections firstprivate(
215  {
216    foo();
217  }
218
219// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
220// expected-error@+1 2 {{expected expression}}
221#pragma omp parallel sections firstprivate(,
222  {
223    foo();
224  }
225// expected-error@+1 2 {{expected expression}}
226#pragma omp parallel sections firstprivate(, )
227  {
228    foo();
229  }
230// expected-error@+1 {{expected expression}}
231#pragma omp parallel sections firstprivate()
232  {
233    foo();
234  }
235// expected-error@+1 {{expected expression}}
236#pragma omp parallel sections firstprivate(int)
237  {
238    foo();
239  }
240// expected-error@+1 {{expected variable name}}
241#pragma omp parallel sections firstprivate(0)
242  {
243    foo();
244  }
245
246  int x, y, z;
247#pragma omp parallel sections lastprivate(x) firstprivate(x)
248  {
249    foo();
250  }
251#pragma omp parallel sections lastprivate(x, y) firstprivate(x, y)
252  {
253    foo();
254  }
255#pragma omp parallel sections lastprivate(x, y, z) firstprivate(x, y, z)
256  {
257    foo();
258  }
259}
260
261