1 | // RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s |
2 | |
3 | // RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -verify %s |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |