// RUN: %clang_cc1 %s -verify -fopenacc -fcxx-exceptions void ReturnTest() { #pragma acc parallel { (void)[]() { return; }; } #pragma acc parallel loop for (int i = 0; i < 5; ++i) { (void)[]() { return; }; } #pragma acc parallel { try {} catch(...){ return; // expected-error{{invalid return out of OpenACC Compute/Combined Construct}} } } #pragma acc parallel loop for (int i = 0; i < 5; ++i) { try {} catch(...){ return; // expected-error{{invalid return out of OpenACC Compute/Combined Construct}} } } } template void BreakContinue() { #pragma acc parallel for(int i =0; i < 5; ++i) { switch(i) { case 0: break; // leaves switch, not 'for'. default: i +=2; break; } if (i == 2) continue; break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} } #pragma acc parallel loop for(int i =0; i < 5; ++i) { switch(i) { case 0: break; // leaves switch, not 'for'. default: i +=2; break; } if (i == 2) continue; break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} } int j; switch(j) { case 0: #pragma acc parallel { break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} } case 1: #pragma acc parallel { } break; } switch(j) { case 0: #pragma acc parallel loop for (int i = 0; i < 5; ++i) { break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} } case 1: #pragma acc parallel loop for (int i = 0; i < 5; ++i) { } break; } #pragma acc parallel for(int i = 0; i < 5; ++i) { if (i > 1) break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} } #pragma acc parallel loop for(int i = 0; i < 5; ++i) { if (i > 1) break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} } #pragma acc parallel switch(j) { case 1: break; } #pragma acc parallel loop for (int i = 0; i < 5; ++i) switch(j) { case 1: break; } #pragma acc parallel { for(int i = 1; i < 100; i++) { if (i > 4) break; } } for (int i =0; i < 5; ++i) { #pragma acc parallel { continue; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} } } #pragma acc parallel for (int i =0; i < 5; ++i) { continue; } #pragma acc parallel loop for (int i =0; i < 5; ++i) { continue; } #pragma acc parallel for (int i =0; i < 5; ++i) { { continue; } } #pragma acc parallel loop for (int i =0; i < 5; ++i) { { continue; } } for (int i =0; i < 5; ++i) { #pragma acc parallel { break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} } } #pragma acc parallel while (j) { --j; if (j > 4) break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} } #pragma acc parallel do { --j; if (j > 4) break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} } while (j ); } template void DuffsDevice() { int j; switch (j) { #pragma acc parallel for(int i =0; i < 5; ++i) { case 0: // expected-error{{invalid branch into OpenACC Compute/Combined Construct}} {} } } switch (j) { #pragma acc parallel loop for(int i =0; i < 5; ++i) { case 0: // expected-error{{invalid branch into OpenACC Compute/Combined Construct}} {} } } switch (j) { #pragma acc parallel for(int i =0; i < 5; ++i) { default: // expected-error{{invalid branch into OpenACC Compute/Combined Construct}} {} } } switch (j) { #pragma acc parallel loop for(int i =0; i < 5; ++i) { default: // expected-error{{invalid branch into OpenACC Compute/Combined Construct}} {} } } switch (j) { #pragma acc parallel for(int i =0; i < 5; ++i) { case 'a' ... 'z': // expected-error{{invalid branch into OpenACC Compute/Combined Construct}} {} } } switch (j) { #pragma acc parallel loop for(int i =0; i < 5; ++i) { case 'a' ... 'z': // expected-error{{invalid branch into OpenACC Compute/Combined Construct}} {} } } } void Exceptions() { #pragma acc parallel for(int i = 0; i < 5; ++i) { throw 5; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } #pragma acc parallel loop for(int i = 0; i < 5; ++i) { throw 5; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } #pragma acc parallel for(int i = 0; i < 5; ++i) { throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } #pragma acc parallel loop for(int i = 0; i < 5; ++i) { throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } #pragma acc serial for(int i = 0; i < 5; ++i) { throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } #pragma acc serial loop for(int i = 0; i < 5; ++i) { throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } #pragma acc kernels for(int i = 0; i < 5; ++i) { throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } #pragma acc kernels loop for(int i = 0; i < 5; ++i) { throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } #pragma acc parallel for(int i = 0; i < 5; ++i) { try { throw 5; } catch(float f) { } } #pragma acc parallel loop for(int i = 0; i < 5; ++i) { try { throw 5; } catch(float f) { } } #pragma acc parallel for(int i = 0; i < 5; ++i) { try { throw 5; } catch(int f) { } } #pragma acc parallel loop for(int i = 0; i < 5; ++i) { try { throw 5; } catch(int f) { } } #pragma acc parallel for(int i = 0; i < 5; ++i) { try { throw 5; } catch(...) { } } #pragma acc parallel loop for(int i = 0; i < 5; ++i) { try { throw 5; } catch(...) { } } #pragma acc parallel for(int i = 0; i < 5; ++i) { try { throw; } catch(...) { } } #pragma acc parallel loop for(int i = 0; i < 5; ++i) { try { throw; } catch(...) { } } #pragma acc parallel for(int i = 0; i < 5; ++i) { try { throw; } catch(...) { throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } } #pragma acc parallel loop for(int i = 0; i < 5; ++i) { try { throw; } catch(...) { throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } } #pragma acc parallel for(int i = 0; i < 5; ++i) { try { throw; } catch(int f) { throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } } #pragma acc parallel loop for(int i = 0; i < 5; ++i) { try { throw; } catch(int f) { throw; // expected-error{{invalid throw out of OpenACC Compute/Combined Construct}} } } } void Instantiate() { BreakContinue(); DuffsDevice(); }