// RUN: %clang_cc1 %s -fopenacc -verify template 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); } }