| // 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<typename T> |
| 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<typename T> |
| 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<int>(); |
| DuffsDevice<int>(); |
| } |