This statement level construct takes no clauses and has no associated statement, and simply labels a number of array elements as valid for caching. The implementation here is pretty simple, but it is a touch of a special case for parsing, so the parsing code reflects that.
52 lines
1.3 KiB
C++
52 lines
1.3 KiB
C++
// RUN: %clang_cc1 %s -fopenacc -verify
|
|
|
|
|
|
void use() {
|
|
int Array[5];
|
|
int NotArray;
|
|
|
|
#pragma acc cache(Array[1])
|
|
#pragma acc cache(Array[1:2])
|
|
|
|
// expected-error@+1{{OpenACC variable in cache directive is not a valid sub-array or array element}}
|
|
#pragma acc cache(Array)
|
|
// expected-error@+1{{OpenACC variable in cache directive is not a valid sub-array or array element}}
|
|
#pragma acc cache(NotArray)
|
|
}
|
|
|
|
struct S {
|
|
int Array[5];
|
|
int NotArray;
|
|
int Array2D[5][5];
|
|
|
|
void use() {
|
|
#pragma acc cache(Array[1])
|
|
#pragma acc cache(Array[1:2])
|
|
#pragma acc cache(Array2D[1][1])
|
|
#pragma acc cache(Array2D[1][1:2])
|
|
|
|
// expected-error@+1{{OpenACC variable in cache directive is not a valid sub-array or array element}}
|
|
#pragma acc cache(Array)
|
|
// expected-error@+1{{OpenACC variable in cache directive is not a valid sub-array or array element}}
|
|
#pragma acc cache(NotArray)
|
|
}
|
|
};
|
|
|
|
template<typename T>
|
|
void templ_use() {
|
|
T Array[5];
|
|
T NotArray;
|
|
|
|
#pragma acc cache(Array[1])
|
|
#pragma acc cache(Array[1:2])
|
|
|
|
// expected-error@+1{{OpenACC variable in cache directive is not a valid sub-array or array element}}
|
|
#pragma acc cache(Array)
|
|
// expected-error@+1{{OpenACC variable in cache directive is not a valid sub-array or array element}}
|
|
#pragma acc cache(NotArray)
|
|
}
|
|
|
|
void foo() {
|
|
templ_use<int>();
|
|
}
|