370 lines · cpp
1// RUN: %clang_cc1 %s -verify -fopenacc -fcxx-exceptions2 3 4void ReturnTest() {5#pragma acc parallel6 {7 (void)[]() { return; };8 }9 10#pragma acc parallel loop11 for (int i = 0; i < 5; ++i) {12 (void)[]() { return; };13 }14 15 16#pragma acc parallel17 {18 try {}19 catch(...){20 return; // expected-error{{invalid return out of OpenACC Compute/Combined Construct}}21 }22 }23#pragma acc parallel loop24 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 32template<typename T>33void BreakContinue() {34#pragma acc parallel35 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 loop49 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 parallel67 {68 break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}69 }70 case 1:71#pragma acc parallel72 {73 }74 break;75 }76 switch(j) {77 case 0:78#pragma acc parallel loop79 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 loop84 for (int i = 0; i < 5; ++i) {85 }86 break;87 }88 89#pragma acc parallel90 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 loop96 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 parallel102 switch(j) {103 case 1:104 break;105 }106 107#pragma acc parallel loop108 for (int i = 0; i < 5; ++i)109 switch(j) {110 case 1:111 break;112 }113 114#pragma acc parallel115 {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 parallel124 {125 continue; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}126 }127 }128 129#pragma acc parallel130 for (int i =0; i < 5; ++i) {131 continue;132 }133 134#pragma acc parallel loop135 for (int i =0; i < 5; ++i) {136 continue;137 }138 139#pragma acc parallel140 for (int i =0; i < 5; ++i) {141 {142 continue;143 }144 }145 146#pragma acc parallel loop147 for (int i =0; i < 5; ++i) {148 {149 continue;150 }151 }152 153 for (int i =0; i < 5; ++i) {154#pragma acc parallel155 {156 break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}157 }158 }159 160#pragma acc parallel161 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 parallel168 do {169 --j;170 if (j > 4)171 break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}}172 } while (j );173}174 175template<typename T>176void DuffsDevice() {177 int j;178 switch (j) {179#pragma acc parallel180 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 loop188 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 parallel196 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 loop204 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 parallel212 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 loop220 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 227void Exceptions() {228#pragma acc parallel229 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 loop234 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 parallel239 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 loop244 for(int i = 0; i < 5; ++i) {245 throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}246 }247 248#pragma acc serial249 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 loop254 for(int i = 0; i < 5; ++i) {255 throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}256 }257 258#pragma acc kernels259 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 loop264 for(int i = 0; i < 5; ++i) {265 throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}}266 }267 268#pragma acc parallel269 for(int i = 0; i < 5; ++i) {270 try {271 throw 5;272 } catch(float f) {273 }274 }275 276#pragma acc parallel loop277 for(int i = 0; i < 5; ++i) {278 try {279 throw 5;280 } catch(float f) {281 }282 }283 284#pragma acc parallel285 for(int i = 0; i < 5; ++i) {286 try {287 throw 5;288 } catch(int f) {289 }290 }291 292#pragma acc parallel loop293 for(int i = 0; i < 5; ++i) {294 try {295 throw 5;296 } catch(int f) {297 }298 }299 300#pragma acc parallel301 for(int i = 0; i < 5; ++i) {302 try {303 throw 5;304 } catch(...) {305 }306 }307 308#pragma acc parallel loop309 for(int i = 0; i < 5; ++i) {310 try {311 throw 5;312 } catch(...) {313 }314 }315 316#pragma acc parallel317 for(int i = 0; i < 5; ++i) {318 try {319 throw;320 } catch(...) {321 }322 }323 324#pragma acc parallel loop325 for(int i = 0; i < 5; ++i) {326 try {327 throw;328 } catch(...) {329 }330 }331 332#pragma acc parallel333 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 loop341 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 parallel349 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 loop357 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 366void Instantiate() {367 BreakContinue<int>();368 DuffsDevice<int>();369}370