| // RUN: %clang_cc1 %s -fopenacc -verify | |
| template<typename Int, typename NotInt, typename ConvertsToInt> | |
| void TemplUses(Int I, NotInt NI, ConvertsToInt CTI) { | |
| #pragma acc loop vector(I) | |
| for(int j = 0; j < 5; ++j); | |
| #pragma acc parallel | |
| #pragma acc loop vector(length: I) | |
| for(int j = 0; j < 5; ++j); | |
| #pragma acc kernels | |
| #pragma acc loop vector(CTI) | |
| for(int j = 0; j < 5; ++j); | |
| // expected-error@+2{{OpenACC clause 'vector' requires expression of integer type ('NoConvert' invalid)}} | |
| #pragma acc kernels | |
| #pragma acc loop vector(length: NI) | |
| for(int j = 0; j < 5; ++j); | |
| // expected-error@+2{{'length' argument on 'vector' clause is not permitted on a 'loop' construct associated with a 'serial' compute construct}} | |
| #pragma acc serial | |
| #pragma acc loop vector(length: I) | |
| for(int j = 0; j < 5; ++j); | |
| // expected-error@+3{{'length' argument to 'vector' clause not allowed on a 'loop' construct associated with a 'kernels' construct that has a 'vector_length' clause}} | |
| // expected-note@+1{{previous 'vector_length' clause is here}} | |
| #pragma acc kernels vector_length(I) | |
| #pragma acc loop vector(length: CTI) | |
| for(int j = 0; j < 5; ++j); | |
| #pragma acc loop vector | |
| for(int i = 0; i < 5; ++i) { | |
| for(int j = 0; j < 5; ++j); | |
| // expected-error@+2{{loop with a 'vector' clause may not exist in the region of a 'vector' clause}} | |
| // expected-note@-4{{previous 'vector' clause is here}} | |
| #pragma acc loop vector | |
| for(int j = 0; j < 5; ++j); | |
| for(int j = 0; j < 5; ++j); | |
| } | |
| #pragma acc loop vector | |
| for(int i = 0; i < 5; ++i) { | |
| for(int j = 0; j < 5; ++j); | |
| // expected-error@+4{{loop with a 'vector' clause may not exist in the region of a 'vector' clause}} | |
| // expected-error@+3{{loop with a 'worker' clause may not exist in the region of a 'vector' clause}} | |
| // expected-error@+2{{loop with a 'gang' clause may not exist in the region of a 'vector' clause}} | |
| // expected-note@-6 3{{previous 'vector' clause is here}} | |
| #pragma acc loop vector, worker, gang | |
| for(int j = 0; j < 5; ++j); | |
| for(int j = 0; j < 5; ++j); | |
| } | |
| #pragma acc loop vector | |
| for(int i = 0; i < 5; ++i) { | |
| #pragma acc serial | |
| #pragma acc loop vector | |
| for(int j = 0; j < 5; ++j); | |
| } | |
| } | |
| struct NoConvert{}; | |
| struct Converts{ | |
| operator int(); | |
| }; | |
| void uses() { | |
| TemplUses(5, NoConvert{}, Converts{}); // expected-note{{in instantiation of function template specialization}} | |
| unsigned i; | |
| NoConvert NI; | |
| Converts CTI; | |
| #pragma acc loop vector(i) | |
| for(int j = 0; j < 5; ++j); | |
| #pragma acc parallel | |
| #pragma acc loop vector(length: i) | |
| for(int j = 0; j < 5; ++j); | |
| #pragma acc kernels | |
| #pragma acc loop vector(CTI) | |
| for(int j = 0; j < 5; ++j); | |
| // expected-error@+2{{OpenACC clause 'vector' requires expression of integer type ('NoConvert' invalid)}} | |
| #pragma acc kernels | |
| #pragma acc loop vector(length: NI) | |
| for(int j = 0; j < 5; ++j); | |
| // expected-error@+2{{'length' argument on 'vector' clause is not permitted on a 'loop' construct associated with a 'serial' compute construct}} | |
| #pragma acc serial | |
| #pragma acc loop vector(length: i) | |
| for(int j = 0; j < 5; ++j); | |
| // expected-error@+3{{'length' argument to 'vector' clause not allowed on a 'loop' construct associated with a 'kernels' construct that has a 'vector_length' clause}} | |
| // expected-note@+1{{previous 'vector_length' clause is here}} | |
| #pragma acc kernels vector_length(i) | |
| #pragma acc loop vector(length: i) | |
| for(int j = 0; j < 5; ++j); | |
| #pragma acc loop vector | |
| for(int i = 0; i < 5; ++i) { | |
| for(int j = 0; j < 5; ++j); | |
| // expected-error@+2{{loop with a 'vector' clause may not exist in the region of a 'vector' clause}} | |
| // expected-note@-4{{previous 'vector' clause is here}} | |
| #pragma acc loop vector | |
| for(int j = 0; j < 5; ++j); | |
| for(int j = 0; j < 5; ++j); | |
| } | |
| #pragma acc loop vector | |
| for(int i = 0; i < 5; ++i) { | |
| #pragma acc serial | |
| #pragma acc loop vector | |
| for(int j = 0; j < 5; ++j); | |
| } | |
| #pragma acc loop vector | |
| for(int i = 0; i < 5; ++i) { | |
| for(int j = 0; j < 5; ++j); | |
| // expected-error@+4{{loop with a 'vector' clause may not exist in the region of a 'vector' clause}} | |
| // expected-error@+3{{loop with a 'worker' clause may not exist in the region of a 'vector' clause}} | |
| // expected-error@+2{{loop with a 'gang' clause may not exist in the region of a 'vector' clause}} | |
| // expected-note@-6 3{{previous 'vector' clause is here}} | |
| #pragma acc loop vector, worker, gang | |
| for(int j = 0; j < 5; ++j); | |
| for(int j = 0; j < 5; ++j); | |
| } | |
| #pragma acc loop vector | |
| for(int i = 0; i < 5; ++i) { | |
| #pragma acc serial | |
| #pragma acc loop vector, worker, gang | |
| for(int j = 0; j < 5; ++j); | |
| } | |
| } |