| // RUN: %clang_cc1 %s -verify -fopenacc |
| |
| 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; |
| } |
| |
| #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 serial |
| for(int i = 0; i < 5; ++i) { |
| if (i > 1) |
| break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} |
| } |
| |
| #pragma acc serial loop |
| for(int i = 0; i < 5; ++i) { |
| if (i > 1) |
| break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} |
| } |
| |
| #pragma acc kernels |
| for(int i = 0; i < 5; ++i) { |
| if (i > 1) |
| break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} |
| } |
| |
| #pragma acc kernels 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 |
| { |
| 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 ); |
| } |
| |
| void Return() { |
| #pragma acc parallel |
| { |
| return;// expected-error{{invalid return out of OpenACC Compute/Combined Construct}} |
| } |
| |
| #pragma acc parallel loop |
| for (unsigned i = 0; i < 5; ++i) { |
| return;// expected-error{{invalid return out of OpenACC Compute/Combined Construct}} |
| } |
| |
| #pragma acc serial |
| { |
| return;// expected-error{{invalid return out of OpenACC Compute/Combined Construct}} |
| } |
| |
| #pragma acc serial loop |
| for (unsigned i = 0; i < 5; ++i) { |
| return;// expected-error{{invalid return out of OpenACC Compute/Combined Construct}} |
| } |
| |
| #pragma acc kernels |
| { |
| return;// expected-error{{invalid return out of OpenACC Compute/Combined Construct}} |
| } |
| |
| #pragma acc kernels loop |
| for (unsigned i = 0; i < 5; ++i) { |
| return;// expected-error{{invalid return out of OpenACC Compute/Combined Construct}} |
| } |
| |
| #pragma acc parallel |
| { |
| { |
| return;// expected-error{{invalid return out of OpenACC Compute/Combined Construct}} |
| } |
| } |
| |
| #pragma acc parallel loop |
| for (unsigned i = 0; i < 5; ++i) { |
| { |
| return;// expected-error{{invalid return out of OpenACC Compute/Combined Construct}} |
| } |
| } |
| |
| #pragma acc parallel |
| { |
| for (int i = 0; i < 5; ++i) { |
| return;// expected-error{{invalid return out of OpenACC Compute/Combined Construct}} |
| } |
| } |
| |
| #pragma acc parallel loop |
| for (unsigned i = 0; i < 5; ++i) { |
| for (int i = 0; i < 5; ++i) { |
| return;// expected-error{{invalid return out of OpenACC Compute/Combined Construct}} |
| } |
| } |
| } |
| |
| void Goto() { |
| int j; |
| #pragma acc parallel // expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| while(j) { |
| if (j <3) |
| goto LABEL; // expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| LABEL: |
| {} |
| |
| goto LABEL_IN; // expected-error{{cannot jump from this goto statement to its label}} |
| #pragma acc parallel // expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| for(int i = 0; i < 5; ++i) { |
| LABEL_IN: |
| {} |
| } |
| |
| int i; |
| goto LABEL_IN2; // expected-error{{cannot jump from this goto statement to its label}} |
| #pragma acc parallel loop // expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| for(i = 0; i < 5; ++i) { |
| LABEL_IN2: |
| {} |
| } |
| |
| #pragma acc parallel |
| for(int i = 0; i < 5; ++i) { |
| LABEL_NOT_CALLED: |
| {} |
| } |
| |
| #pragma acc parallel loop |
| for(int i = 0; i < 5; ++i) { |
| LABEL_NOT_CALLED2: |
| {} |
| } |
| |
| #pragma acc parallel |
| { |
| goto ANOTHER_LOOP; // expected-error{{cannot jump from this goto statement to its label}} |
| |
| } |
| |
| #pragma acc parallel loop |
| for (unsigned i = 0; i < 5; ++i) { |
| goto ANOTHER_LOOP2; // expected-error{{cannot jump from this goto statement to its label}} |
| |
| } |
| |
| #pragma acc parallel// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| { |
| ANOTHER_LOOP: |
| {} |
| } |
| |
| #pragma acc parallel loop// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| ANOTHER_LOOP2: |
| {} |
| } |
| |
| #pragma acc parallel |
| { |
| while (j) { |
| --j; |
| if (j < 3) |
| goto LABEL2; |
| |
| if (j > 4) |
| break; |
| } |
| LABEL2: |
| {} |
| } |
| |
| #pragma acc parallel loop |
| for (unsigned i = 0; i < 5; ++i) { |
| while (j) { |
| --j; |
| if (j < 3) |
| goto LABEL2_2; |
| |
| if (j > 4) |
| break; |
| } |
| LABEL2_2: |
| {} |
| } |
| |
| |
| #pragma acc parallel |
| do { |
| if (j < 3) |
| goto LABEL3; |
| |
| if (j > 4) |
| break; // expected-error{{invalid branch out of OpenACC Compute/Combined Construct}} |
| |
| LABEL3: |
| {} |
| } while (j); |
| |
| |
| LABEL4: |
| {} |
| |
| #pragma acc parallel// expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| { |
| goto LABEL4;// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| #pragma acc parallel loop// expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| goto LABEL4;// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| |
| #pragma acc parallel// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| { |
| LABEL5: |
| {} |
| } |
| |
| #pragma acc parallel loop// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| LABEL5_2: |
| {} |
| } |
| |
| { |
| goto LABEL5;// expected-error{{cannot jump from this goto statement to its label}} |
| goto LABEL5_2;// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| #pragma acc parallel |
| { |
| LABEL6: |
| {} |
| goto LABEL6; |
| |
| } |
| |
| #pragma acc parallel loop |
| for (unsigned i = 0; i < 5; ++i) { |
| LABEL6_2: |
| {} |
| goto LABEL6_2; |
| |
| } |
| |
| #pragma acc parallel |
| goto LABEL7; // expected-error{{cannot jump from this goto statement to its label}} |
| #pragma acc parallel// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| { |
| LABEL7:{} |
| } |
| |
| #pragma acc parallel |
| LABEL8:{} |
| #pragma acc parallel// expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| { |
| goto LABEL8;// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| #pragma acc parallel// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| { |
| LABEL9:{} |
| } |
| |
| ({goto LABEL9;});// expected-error{{cannot jump from this goto statement to its label}} |
| |
| #pragma acc parallel loop// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| LABEL9_2:{} |
| } |
| |
| ({goto LABEL9_2;});// expected-error{{cannot jump from this goto statement to its label}} |
| |
| |
| #pragma acc parallel// expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| ({goto LABEL10;});// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| LABEL10:{} |
| |
| #pragma acc parallel loop// expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| ({goto LABEL10_2;});// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| LABEL10_2:{} |
| |
| ({goto LABEL11;});// expected-error{{cannot jump from this goto statement to its label}} |
| #pragma acc parallel// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| { |
| LABEL11:{} |
| } |
| |
| ({goto LABEL11_2;});// expected-error{{cannot jump from this goto statement to its label}} |
| #pragma acc parallel loop// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| LABEL11_2:{} |
| } |
| |
| LABEL12:{} |
| #pragma acc parallel// expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| { |
| ({goto LABEL12;});// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| LABEL12_2:{} |
| #pragma acc parallel loop// expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| ({goto LABEL12_2;});// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| #pragma acc parallel |
| { |
| ({goto LABEL13;}); |
| LABEL13:{} |
| } |
| |
| #pragma acc parallel loop |
| for (unsigned i = 0; i < 5; ++i) { |
| ({goto LABEL13_2;}); |
| LABEL13_2:{} |
| } |
| |
| #pragma acc parallel |
| { |
| LABEL14:{} |
| ({goto LABEL14;}); |
| } |
| |
| #pragma acc parallel loop |
| for (unsigned i = 0; i < 5; ++i) { |
| LABEL14_2:{} |
| ({goto LABEL14_2;}); |
| } |
| |
| |
| |
| ({goto LABEL15;});// expected-error{{cannot jump from this goto statement to its label}} |
| #pragma acc serial// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| { |
| LABEL15:{} |
| } |
| ({goto LABEL15_2;});// expected-error{{cannot jump from this goto statement to its label}} |
| #pragma acc serial loop// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| LABEL15_2:{} |
| } |
| |
| LABEL16:{} |
| #pragma acc serial// expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| { |
| ({goto LABEL16;});// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| LABEL16_2:{} |
| #pragma acc serial loop// expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| ({goto LABEL16_2;});// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| ({goto LABEL17;});// expected-error{{cannot jump from this goto statement to its label}} |
| #pragma acc kernels// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| { |
| LABEL17:{} |
| } |
| |
| ({goto LABEL17_2;});// expected-error{{cannot jump from this goto statement to its label}} |
| #pragma acc kernels loop// expected-note{{invalid branch into OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| LABEL17_2:{} |
| } |
| |
| LABEL18:{} |
| #pragma acc kernels// expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| { |
| ({goto LABEL18;});// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| |
| LABEL18_2:{} |
| #pragma acc kernels loop// expected-note{{invalid branch out of OpenACC Compute/Combined Construct}} |
| for (unsigned i = 0; i < 5; ++i) { |
| ({goto LABEL18_2;});// expected-error{{cannot jump from this goto statement to its label}} |
| } |
| } |
| |
| void IndirectGoto1() { |
| void* ptr; |
| #pragma acc parallel |
| { |
| LABEL1:{} |
| ptr = &&LABEL1; |
| goto *ptr; |
| |
| } |
| } |
| |
| void IndirectGoto1_Loop() { |
| void *ptr; |
| #pragma acc parallel loop |
| for (unsigned i = 0; i < 5; ++i) { |
| LABEL1:{} |
| ptr = &&LABEL1; |
| |
| goto *ptr; |
| |
| } |
| } |
| |
| void IndirectGoto2() { |
| void* ptr; |
| LABEL2:{} // #GOTOLBL2 |
| ptr = &&LABEL2; |
| #pragma acc parallel // #GOTOPAR2 |
| { |
| // expected-error@+3{{cannot jump from this indirect goto statement to one of its possible targets}} |
| // expected-note@#GOTOLBL2{{possible target of indirect goto statement}} |
| // expected-note@#GOTOPAR2{{invalid branch out of OpenACC Compute/Combined Construct}} |
| goto *ptr; |
| } |
| |
| #pragma acc parallel loop // #GOTOPAR_LOOP2 |
| for (unsigned i = 0; i < 5; ++i) { |
| // expected-error@+3{{cannot jump from this indirect goto statement to one of its possible targets}} |
| // expected-note@#GOTOLBL2{{possible target of indirect goto statement}} |
| // expected-note@#GOTOPAR_LOOP2{{invalid branch out of OpenACC Compute/Combined Construct}} |
| goto *ptr; |
| } |
| } |
| |
| void IndirectGoto3() { |
| void* ptr; |
| #pragma acc parallel // #GOTOPAR3 |
| { |
| LABEL3:{} // #GOTOLBL3 |
| ptr = &&LABEL3; |
| } |
| // expected-error@+3{{cannot jump from this indirect goto statement to one of its possible targets}} |
| // expected-note@#GOTOLBL3{{possible target of indirect goto statement}} |
| // expected-note@#GOTOPAR3{{invalid branch into OpenACC Compute/Combined Construct}} |
| goto *ptr; |
| } |
| |
| void IndirectGoto3_Loop() { |
| void* ptr; |
| #pragma acc parallel loop// #GOTOPAR_LOOP3 |
| for (unsigned i = 0; i < 5; ++i) { |
| LABEL3:{} // #GOTOLBL3_2 |
| ptr = &&LABEL3; |
| } |
| // expected-error@+3{{cannot jump from this indirect goto statement to one of its possible targets}} |
| // expected-note@#GOTOLBL3_2{{possible target of indirect goto statement}} |
| // expected-note@#GOTOPAR_LOOP3{{invalid branch into OpenACC Compute/Combined Construct}} |
| goto *ptr; |
| } |
| |
| void IndirectGoto4() { |
| void* ptr; |
| #pragma acc parallel // #GOTOPAR4 |
| { |
| LABEL4:{} |
| ptr = &&LABEL4; |
| // expected-error@+3{{cannot jump from this indirect goto statement to one of its possible targets}} |
| // expected-note@#GOTOLBL5{{possible target of indirect goto statement}} |
| // expected-note@#GOTOPAR4{{invalid branch out of OpenACC Compute/Combined Construct}} |
| goto *ptr; |
| } |
| LABEL5:// #GOTOLBL5 |
| |
| ptr=&&LABEL5; |
| } |
| |
| void IndirectGoto4_2() { |
| void* ptr; |
| #pragma acc parallel loop // #GOTOPAR_LOOP4 |
| for (unsigned i = 0; i < 5; ++i) { |
| LABEL4:{} |
| ptr = &&LABEL4; |
| // expected-error@+3{{cannot jump from this indirect goto statement to one of its possible targets}} |
| // expected-note@#GOTOLBL_LOOP5{{possible target of indirect goto statement}} |
| // expected-note@#GOTOPAR_LOOP4{{invalid branch out of OpenACC Compute/Combined Construct}} |
| goto *ptr; |
| } |
| LABEL5:// #GOTOLBL_LOOP5 |
| |
| ptr=&&LABEL5; |
| } |
| |
| 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 |
| for(int i =0; i < 5; ++i) { |
| default: // expected-error{{invalid branch into OpenACC Compute/Combined Construct}} |
| {} |
| } |
| } |
| |
| switch (j) { |
| #pragma acc kernels |
| 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 serial |
| for(int i =0; i < 5; ++i) { |
| case 'a' ... 'z': // expected-error{{invalid branch into OpenACC Compute/Combined Construct}} |
| {} |
| } |
| } |
| } |
| |
| void DuffsDeviceLoop() { |
| int j; |
| 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 loop |
| for(int i =0; i < 5; ++i) { |
| default: // expected-error{{invalid branch into OpenACC Compute/Combined Construct}} |
| {} |
| } |
| } |
| |
| switch (j) { |
| #pragma acc kernels loop |
| 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) { |
| case 'a' ... 'z': // expected-error{{invalid branch into OpenACC Compute/Combined Construct}} |
| {} |
| } |
| } |
| |
| switch (j) { |
| #pragma acc serial loop |
| for(int i =0; i < 5; ++i) { |
| case 'a' ... 'z': // expected-error{{invalid branch into OpenACC Compute/Combined Construct}} |
| {} |
| } |
| } |
| } |