Files
clang-p2996/clang/test/SemaOpenACC/combined-construct-vector-clause.cpp
erichkeane 009b5e8e59 [OpenACC] 'vector' clause implementation for combined constructs
Similar to 'worker', the 'vector' clause has some rules that needed to
be applied on its argument legality that for combined constructs need to
look at the current construct, not the 'effective' parent construct.
Additionally, it has some interaction with `vector_length` that needed
to be encoded as well.  This patch implements it.
2024-12-06 09:06:57 -08:00

172 lines
5.4 KiB
C++

// RUN: %clang_cc1 %s -fopenacc -verify
template<typename T, unsigned I>
void TemplUses(T t) {
#pragma acc parallel loop vector
for(int j = 0; j < 5; ++j);
#pragma acc parallel loop vector(I)
for(int j = 0; j < 5; ++j);
#pragma acc parallel loop vector(length:I)
for(int j = 0; j < 5; ++j);
#pragma acc serial loop vector
for(int j = 0; j < 5; ++j);
// expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}
#pragma acc serial loop vector(I)
for(int j = 0; j < 5; ++j);
// expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}
#pragma acc serial loop vector(length:I)
for(int j = 0; j < 5; ++j);
#pragma acc kernels loop vector
for(int j = 0; j < 5; ++j);
#pragma acc kernels loop vector(I)
for(int j = 0; j < 5; ++j);
#pragma acc kernels loop vector(length:I)
for(int j = 0; j < 5; ++j);
#pragma acc kernels loop vector vector_length(t)
for(int j = 0; j < 5; ++j);
#pragma acc kernels loop vector_length(t) vector
for(int j = 0; j < 5; ++j);
// expected-error@+2{{'vector_length' clause not allowed on a 'kernels loop' construct that has a 'vector' clause with an argument}}
// expected-note@+1{{previous clause is here}}
#pragma acc kernels loop vector(I) vector_length(t)
for(int j = 0; j < 5; ++j);
// expected-error@+2{{'length' argument to 'vector' clause not allowed on a 'kernels loop' construct that has a 'vector_length' clause}}
// expected-note@+1{{previous clause is here}}
#pragma acc kernels loop vector_length(t) vector(I)
for(int j = 0; j < 5; ++j);
#pragma acc parallel loop vector
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@-5 3{{previous clause is here}}
#pragma acc loop vector worker, gang
for(int j = 0; j < 5; ++j);
}
#pragma acc parallel loop vector
for(int j = 0; j < 5; ++j) {
#pragma acc serial loop vector worker, gang
for(int j = 0; j < 5; ++j);
}
#pragma acc loop vector
for(int j = 0; j < 5; ++j) {
#pragma acc serial loop vector worker, gang
for(int j = 0; j < 5; ++j);
}
#pragma acc kernels vector_length(t)
for(int j = 0; j < 5; ++j) {
// expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}
#pragma acc serial loop vector(I)
for(int j = 0; j < 5; ++j);
}
#pragma acc kernels vector_length(t)
for(int j = 0; j < 5; ++j) {
#pragma acc parallel loop vector(I)
for(int j = 0; j < 5; ++j);
}
}
void uses() {
TemplUses<int, 5>(5);
unsigned I;
int t;
#pragma acc parallel loop vector
for(int j = 0; j < 5; ++j);
#pragma acc parallel loop vector(I)
for(int j = 0; j < 5; ++j);
#pragma acc parallel loop vector(length:I)
for(int j = 0; j < 5; ++j);
#pragma acc serial loop vector
for(int j = 0; j < 5; ++j);
// expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}
#pragma acc serial loop vector(I)
for(int j = 0; j < 5; ++j);
// expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}
#pragma acc serial loop vector(length:I)
for(int j = 0; j < 5; ++j);
#pragma acc kernels loop vector
for(int j = 0; j < 5; ++j);
#pragma acc kernels loop vector(I)
for(int j = 0; j < 5; ++j);
#pragma acc kernels loop vector(length:I)
for(int j = 0; j < 5; ++j);
#pragma acc kernels loop vector vector_length(t)
for(int j = 0; j < 5; ++j);
#pragma acc kernels loop vector_length(t) vector
for(int j = 0; j < 5; ++j);
// expected-error@+2{{'vector_length' clause not allowed on a 'kernels loop' construct that has a 'vector' clause with an argument}}
// expected-note@+1{{previous clause is here}}
#pragma acc kernels loop vector(I) vector_length(t)
for(int j = 0; j < 5; ++j);
// expected-error@+2{{'length' argument to 'vector' clause not allowed on a 'kernels loop' construct that has a 'vector_length' clause}}
// expected-note@+1{{previous clause is here}}
#pragma acc kernels loop vector_length(t) vector(I)
for(int j = 0; j < 5; ++j);
#pragma acc parallel loop vector
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@-5 3{{previous clause is here}}
#pragma acc loop vector worker, gang
for(int j = 0; j < 5; ++j);
}
#pragma acc parallel loop vector
for(int j = 0; j < 5; ++j) {
#pragma acc serial loop vector worker, gang
for(int j = 0; j < 5; ++j);
}
#pragma acc loop vector
for(int j = 0; j < 5; ++j) {
#pragma acc serial loop vector worker, gang
for(int j = 0; j < 5; ++j);
}
#pragma acc kernels vector_length(t)
for(int j = 0; j < 5; ++j) {
#pragma acc parallel loop vector(I)
for(int j = 0; j < 5; ++j);
}
#pragma acc kernels vector_length(t)
for(int j = 0; j < 5; ++j) {
// expected-error@+1{{'length' argument on 'vector' clause is not permitted on a 'serial loop' construct}}
#pragma acc serial loop vector(I)
for(int j = 0; j < 5; ++j);
}
}