| // RUN: %clang_cc1 %s -fopenacc -verify |
| |
| struct CompositeOfScalars { |
| int I; |
| float F; |
| short J; |
| char C; |
| double D; |
| _Complex float CF; |
| _Complex double CD; |
| }; |
| |
| struct CompositeHasComposite { |
| int I; |
| float F; |
| short J; |
| char C; |
| double D; |
| _Complex float CF; |
| _Complex double CD; |
| struct CompositeOfScalars COS; // #COS_FIELD |
| }; |
| |
| // All of the type checking is done for compute and loop constructs, so only check the basics + the parts that are combined specific. |
| void uses(unsigned Parm) { |
| struct CompositeOfScalars CoS; |
| struct CompositeHasComposite ChC; |
| int I; |
| float F; |
| int Array[5]; |
| |
| // legal on all 3 kinds of combined constructs |
| #pragma acc parallel loop reduction(+:Parm) |
| for(int i = 0; i < 5; ++i); |
| |
| #pragma acc serial loop reduction(&: CoS, I, F) |
| for(int i = 0; i < 5; ++i); |
| |
| #pragma acc kernels loop reduction(min: CoS, Array[I], Array[0:I]) |
| for(int i = 0; i < 5; ++i); |
| |
| // expected-error@+2{{OpenACC 'reduction' composite variable must not have non-scalar field}} |
| // expected-note@#COS_FIELD{{invalid field is here}} |
| #pragma acc parallel loop reduction(&: ChC) |
| for(int i = 0; i < 5; ++i); |
| |
| #pragma acc kernels loop reduction(+:Parm) num_gangs(I) |
| for(int i = 0; i < 5; ++i); |
| // expected-error@+2{{OpenACC 'num_gangs' clause with more than 1 argument may not appear on a 'parallel loop' construct with a 'reduction' clause}} |
| // expected-note@+1{{previous 'reduction' clause is here}} |
| #pragma acc parallel loop reduction(+:Parm) num_gangs(I, I) |
| for(int i = 0; i < 5; ++i); |
| |
| #pragma acc kernels loop num_gangs(I) reduction(+:Parm) |
| for(int i = 0; i < 5; ++i); |
| // expected-error@+2{{OpenACC 'reduction' clause may not appear on a 'parallel loop' construct with a 'num_gangs' clause with more than 1 argument}} |
| // expected-note@+1{{previous 'num_gangs' clause is here}} |
| #pragma acc parallel loop num_gangs(I, I) reduction(+:Parm) |
| for(int i = 0; i < 5; ++i); |
| |
| // Reduction cannot appear on a loop with a 'gang' of dim>1. |
| #pragma acc parallel loop gang(dim:1) reduction(+:Parm) |
| for(int i = 0; i < 5; ++i); |
| // expected-error@+2{{OpenACC 'reduction' clause cannot appear on the same 'parallel loop' construct as a 'gang' clause with a 'dim' value greater than 1}} |
| // expected-note@+1{{previous 'gang' clause is here}} |
| #pragma acc parallel loop gang(dim:2) reduction(+:Parm) |
| for(int i = 0; i < 5; ++i); |
| #pragma acc parallel loop reduction(+:Parm) gang(dim:1) |
| for(int i = 0; i < 5; ++i); |
| // expected-error@+2{{OpenACC 'gang' clause with a 'dim' value greater than 1 cannot appear on the same 'parallel loop' construct as a 'reduction' clause}} |
| // expected-note@+1{{previous 'reduction' clause is here}} |
| #pragma acc parallel loop reduction(+:Parm) gang(dim:2) |
| for(int i = 0; i < 5; ++i); |
| |
| // Reduction cannot appear on a loop with a gang and a num_gangs with >1 |
| // explicit argument. |
| #pragma acc kernels loop num_gangs(I) reduction(+:Parm) gang |
| for(int i = 0; i < 5; ++i); |
| #pragma acc kernels loop num_gangs(I) gang reduction(+:Parm) |
| for(int i = 0; i < 5; ++i); |
| #pragma acc kernels loop reduction(+:Parm) num_gangs(I) gang |
| for(int i = 0; i < 5; ++i); |
| #pragma acc kernels loop reduction(+:Parm) gang num_gangs(I) |
| for(int i = 0; i < 5; ++i); |
| #pragma acc kernels loop gang num_gangs(I) reduction(+:Parm) |
| for(int i = 0; i < 5; ++i); |
| #pragma acc kernels loop gang reduction(+:Parm) num_gangs(I) |
| for(int i = 0; i < 5; ++i); |
| |
| // expected-error@+2{{OpenACC 'reduction' clause may not appear on a 'parallel loop' construct with a 'num_gangs' clause with more than 1 argument}} |
| // expected-note@+1{{previous 'num_gangs' clause is here}} |
| #pragma acc parallel loop num_gangs(I, I) reduction(+:Parm) gang |
| for(int i = 0; i < 5; ++i); |
| // expected-error@+3{{OpenACC 'reduction' clause cannot appear on the same 'parallel loop' construct as a 'gang' clause and a 'num_gangs' clause with more than one argument}} |
| // expected-note@+2{{previous 'num_gangs' clause is here}} |
| // expected-note@+1{{previous 'gang' clause is here}} |
| #pragma acc parallel loop num_gangs(I, I) gang reduction(+:Parm) |
| for(int i = 0; i < 5; ++i); |
| // expected-error@+2{{OpenACC 'num_gangs' clause with more than 1 argument may not appear on a 'parallel loop' construct with a 'reduction' clause}} |
| // expected-note@+1{{previous 'reduction' clause is here}} |
| #pragma acc parallel loop reduction(+:Parm) num_gangs(I, I) gang |
| for(int i = 0; i < 5; ++i); |
| // expected-error@+3{{OpenACC 'reduction' clause cannot appear on the same 'parallel loop' construct as a 'gang' clause and a 'num_gangs' clause with more than one argument}} |
| // expected-note@+2{{previous 'reduction' clause is here}} |
| // expected-note@+1{{previous 'gang' clause is here}} |
| #pragma acc parallel loop reduction(+:Parm) gang num_gangs(I, I) |
| for(int i = 0; i < 5; ++i); |
| // expected-error@+3{{OpenACC 'reduction' clause cannot appear on the same 'parallel loop' construct as a 'gang' clause and a 'num_gangs' clause with more than one argument}} |
| // expected-note@+2{{previous 'gang' clause is here}} |
| // expected-note@+1{{previous 'num_gangs' clause is here}} |
| #pragma acc parallel loop gang num_gangs(I, I) reduction(+:Parm) |
| for(int i = 0; i < 5; ++i); |
| // expected-error@+3{{OpenACC 'reduction' clause cannot appear on the same 'parallel loop' construct as a 'gang' clause and a 'num_gangs' clause with more than one argument}} |
| // expected-note@+2{{previous 'reduction' clause is here}} |
| // expected-note@+1{{previous 'gang' clause is here}} |
| #pragma acc parallel loop gang reduction(+:Parm) num_gangs(I, I) |
| for(int i = 0; i < 5; ++i); |
| |
| #pragma acc parallel loop num_gangs(I) reduction(+:Parm) gang |
| for(int i = 0; i < 5; ++i); |
| #pragma acc parallel loop num_gangs(I) gang reduction(+:Parm) |
| for(int i = 0; i < 5; ++i); |
| #pragma acc parallel loop reduction(+:Parm) num_gangs(I) gang |
| for(int i = 0; i < 5; ++i); |
| #pragma acc parallel loop reduction(+:Parm) gang num_gangs(I) |
| for(int i = 0; i < 5; ++i); |
| #pragma acc parallel loop gang num_gangs(I) reduction(+:Parm) |
| for(int i = 0; i < 5; ++i); |
| #pragma acc parallel loop gang reduction(+:Parm) num_gangs(I) |
| for(int i = 0; i < 5; ++i); |
| |
| #pragma acc parallel loop reduction(+:I) |
| for(int i = 0; i < 5; ++i) { |
| // expected-error@+2{{OpenACC 'reduction' variable must have the same operator in all nested constructs (& vs +)}} |
| // expected-note@-3{{previous 'reduction' clause is here}} |
| #pragma acc loop reduction(&:I) |
| for(int i = 0; i < 5; ++i); |
| } |
| #pragma acc parallel loop reduction(+:I) |
| for(int i = 0; i < 5; ++i) { |
| // expected-error@+2{{OpenACC 'reduction' variable must have the same operator in all nested constructs (& vs +)}} |
| // expected-note@-3{{previous 'reduction' clause is here}} |
| #pragma acc parallel reduction(&:I) |
| for(int i = 0; i < 5; ++i); |
| } |
| |
| #pragma acc parallel loop reduction(+:I) |
| for(int i = 0; i < 5; ++i) { |
| // expected-error@+2{{OpenACC 'reduction' variable must have the same operator in all nested constructs (& vs +)}} |
| // expected-note@-3{{previous 'reduction' clause is here}} |
| #pragma acc parallel loop reduction(&:I) |
| for(int i = 0; i < 5; ++i); |
| } |
| #pragma acc loop reduction(+:I) |
| for(int i = 0; i < 5; ++i) { |
| // expected-error@+2{{OpenACC 'reduction' variable must have the same operator in all nested constructs (& vs +)}} |
| // expected-note@-3{{previous 'reduction' clause is here}} |
| #pragma acc parallel loop reduction(&:I) |
| for(int i = 0; i < 5; ++i); |
| } |
| |
| #pragma acc parallel reduction(+:I) |
| for(int i = 0; i < 5; ++i) { |
| // expected-error@+2{{OpenACC 'reduction' variable must have the same operator in all nested constructs (& vs +)}} |
| // expected-note@-3{{previous 'reduction' clause is here}} |
| #pragma acc parallel loop reduction(&:I) |
| for(int i = 0; i < 5; ++i); |
| } |
| } |