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