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