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