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