xref: /llvm-project/clang/test/SemaOpenACC/no-branch-in-out.cpp (revision 39351f8e46e3e42b945ed686537f182b4c313289)
1 // RUN: %clang_cc1 %s -verify -fopenacc -fcxx-exceptions
2 
3 
4 void ReturnTest() {
5 #pragma acc parallel
6   {
7     (void)[]() { return; };
8   }
9 
10 #pragma acc parallel loop
11   for (int i = 0; i < 5; ++i) {
12     (void)[]() { return; };
13   }
14 
15 
16 #pragma acc parallel
17   {
18     try {}
19     catch(...){
20       return; // expected-error{{invalid return out of OpenACC Compute/Combined Construct}}
21     }
22   }
23 #pragma acc parallel loop
24   for (int i = 0; i < 5; ++i) {
25     try {}
26     catch(...){
27       return; // expected-error{{invalid return out of OpenACC Compute/Combined Construct}}
28     }
29   }
30 }
31 
32 template<typename T>
33 void BreakContinue() {
34 #pragma acc parallel
35   for(int i =0; i < 5; ++i) {
36     switch(i) {
37       case 0:
38       break; // leaves switch, not 'for'.
39       default:
40       i +=2;
41       break;
42     }
43     if (i == 2)
44       continue;
45 
46     break;  // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}
47   }
48 #pragma acc parallel loop
49   for(int i =0; i < 5; ++i) {
50     switch(i) {
51       case 0:
52       break; // leaves switch, not 'for'.
53       default:
54       i +=2;
55       break;
56     }
57     if (i == 2)
58       continue;
59 
60     break;  // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}
61   }
62 
63   int j;
64   switch(j) {
65     case 0:
66 #pragma acc parallel
67     {
68       break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}
69     }
70     case 1:
71 #pragma acc parallel
72     {
73     }
74     break;
75   }
76   switch(j) {
77     case 0:
78 #pragma acc parallel loop
79     for (int i = 0; i < 5; ++i) {
80       break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}
81     }
82     case 1:
83 #pragma acc parallel loop
84     for (int i = 0; i < 5; ++i) {
85     }
86     break;
87   }
88 
89 #pragma acc parallel
90   for(int i = 0; i < 5; ++i) {
91     if (i > 1)
92       break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}
93   }
94 
95 #pragma acc parallel loop
96   for(int i = 0; i < 5; ++i) {
97     if (i > 1)
98       break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}
99   }
100 
101 #pragma acc parallel
102   switch(j) {
103     case 1:
104       break;
105   }
106 
107 #pragma acc parallel loop
108   for (int i = 0; i < 5; ++i)
109     switch(j) {
110       case 1:
111         break;
112     }
113 
114 #pragma acc parallel
115   {
116     for(int i = 1; i < 100; i++) {
117       if (i > 4)
118         break;
119     }
120   }
121 
122   for (int i =0; i < 5; ++i) {
123 #pragma acc parallel
124     {
125       continue; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}
126     }
127   }
128 
129 #pragma acc parallel
130   for (int i =0; i < 5; ++i) {
131     continue;
132   }
133 
134 #pragma acc parallel loop
135   for (int i =0; i < 5; ++i) {
136     continue;
137   }
138 
139 #pragma acc parallel
140   for (int i =0; i < 5; ++i) {
141     {
142       continue;
143     }
144   }
145 
146 #pragma acc parallel loop
147   for (int i =0; i < 5; ++i) {
148     {
149       continue;
150     }
151   }
152 
153   for (int i =0; i < 5; ++i) {
154 #pragma acc parallel
155     {
156       break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}
157     }
158   }
159 
160 #pragma acc parallel
161   while (j) {
162     --j;
163     if (j > 4)
164       break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}
165   }
166 
167 #pragma acc parallel
168   do {
169     --j;
170     if (j > 4)
171       break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}
172   } while (j );
173 }
174 
175 template<typename T>
176 void DuffsDevice() {
177   int j;
178   switch (j) {
179 #pragma acc parallel
180   for(int i =0; i < 5; ++i) {
181     case 0: // expected-error{{invalid branch into OpenACC Compute/Combined Construct}}
182       {}
183   }
184   }
185 
186   switch (j) {
187 #pragma acc parallel loop
188   for(int i =0; i < 5; ++i) {
189     case 0: // expected-error{{invalid branch into OpenACC Compute/Combined Construct}}
190       {}
191   }
192   }
193 
194   switch (j) {
195 #pragma acc parallel
196   for(int i =0; i < 5; ++i) {
197     default: // expected-error{{invalid branch into OpenACC Compute/Combined Construct}}
198       {}
199   }
200   }
201 
202   switch (j) {
203 #pragma acc parallel loop
204   for(int i =0; i < 5; ++i) {
205     default: // expected-error{{invalid branch into OpenACC Compute/Combined Construct}}
206       {}
207   }
208   }
209 
210   switch (j) {
211 #pragma acc parallel
212   for(int i =0; i < 5; ++i) {
213     case 'a' ... 'z': // expected-error{{invalid branch into OpenACC Compute/Combined Construct}}
214       {}
215   }
216   }
217 
218   switch (j) {
219 #pragma acc parallel loop
220   for(int i =0; i < 5; ++i) {
221     case 'a' ... 'z': // expected-error{{invalid branch into OpenACC Compute/Combined Construct}}
222       {}
223   }
224   }
225 }
226 
227 void Exceptions() {
228 #pragma acc parallel
229   for(int i = 0; i < 5; ++i) {
230     throw 5; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
231   }
232 
233 #pragma acc parallel loop
234   for(int i = 0; i < 5; ++i) {
235     throw 5; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
236   }
237 
238 #pragma acc parallel
239   for(int i = 0; i < 5; ++i) {
240     throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
241   }
242 
243 #pragma acc parallel loop
244   for(int i = 0; i < 5; ++i) {
245     throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
246   }
247 
248 #pragma acc serial
249   for(int i = 0; i < 5; ++i) {
250     throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
251   }
252 
253 #pragma acc serial loop
254   for(int i = 0; i < 5; ++i) {
255     throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
256   }
257 
258 #pragma acc kernels
259   for(int i = 0; i < 5; ++i) {
260     throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
261   }
262 
263 #pragma acc kernels loop
264   for(int i = 0; i < 5; ++i) {
265     throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
266   }
267 
268 #pragma acc parallel
269   for(int i = 0; i < 5; ++i) {
270     try {
271     throw 5;
272     } catch(float f) {
273     }
274   }
275 
276 #pragma acc parallel loop
277   for(int i = 0; i < 5; ++i) {
278     try {
279     throw 5;
280     } catch(float f) {
281     }
282   }
283 
284 #pragma acc parallel
285   for(int i = 0; i < 5; ++i) {
286     try {
287     throw 5;
288     } catch(int f) {
289     }
290   }
291 
292 #pragma acc parallel loop
293   for(int i = 0; i < 5; ++i) {
294     try {
295     throw 5;
296     } catch(int f) {
297     }
298   }
299 
300 #pragma acc parallel
301   for(int i = 0; i < 5; ++i) {
302     try {
303     throw 5;
304     } catch(...) {
305     }
306   }
307 
308 #pragma acc parallel loop
309   for(int i = 0; i < 5; ++i) {
310     try {
311     throw 5;
312     } catch(...) {
313     }
314   }
315 
316 #pragma acc parallel
317   for(int i = 0; i < 5; ++i) {
318     try {
319     throw;
320     } catch(...) {
321     }
322   }
323 
324 #pragma acc parallel loop
325   for(int i = 0; i < 5; ++i) {
326     try {
327     throw;
328     } catch(...) {
329     }
330   }
331 
332 #pragma acc parallel
333   for(int i = 0; i < 5; ++i) {
334     try {
335     throw;
336     } catch(...) {
337       throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
338     }
339   }
340 #pragma acc parallel loop
341   for(int i = 0; i < 5; ++i) {
342     try {
343     throw;
344     } catch(...) {
345       throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
346     }
347   }
348 #pragma acc parallel
349   for(int i = 0; i < 5; ++i) {
350     try {
351     throw;
352     } catch(int f) {
353       throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
354     }
355   }
356 #pragma acc parallel loop
357   for(int i = 0; i < 5; ++i) {
358     try {
359     throw;
360     } catch(int f) {
361       throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}
362     }
363   }
364 }
365 
366 void Instantiate() {
367   BreakContinue<int>();
368   DuffsDevice<int>();
369 }
370