• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s
2 
3 void 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 
test_no_clause()11 void 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 
test_branch_protected_scope()29 void test_branch_protected_scope() {
30   int i = 0;
31 L1:
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 
test_invalid_clause()69 void 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 
test_non_identifiers()82 void 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 
test_private()114 void 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 
test_lastprivate()173 void 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 
test_firstprivate()233 void 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 
test_nowait()293 void 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