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