
While investigating implementing 'var-list' generically for the variety of clauses that support this syntax (an extensive list!) I discovered that it includes 'compound types' and members of compound types, as well as array sections. This patch genericizes that function, and implements it in terms of an assignment expression, and enables a simplified version of OMP Array Sections for it. OpenACC only supports a startidx + length, so this patch implements that parsing. However, it is currently still being represented as an OpenMP Array Section, which is semantically very similar. It is my intent to come back and genericize the OMP Array Sections types (or create a similar expression node) in the future when dealing with Sema. At the moment, the only obvious problem with it is that the diagnostic for using it in the 'wrong' place says OpenMP instead of OpenACC, which I intend to fix when I deal with the AST node changes.
117 lines
4.1 KiB
C++
117 lines
4.1 KiB
C++
// RUN: %clang_cc1 %s -verify -fopenacc
|
|
|
|
namespace NS {
|
|
static char* NSArray;// expected-note{{declared here}}
|
|
static int NSInt;// expected-note 2{{declared here}}
|
|
}
|
|
char *getArrayPtr();
|
|
template<typename T, int I>
|
|
void func() {
|
|
char *ArrayPtr = getArrayPtr();
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(ArrayPtr[T::value + I:I + 5], T::array[(i + T::value, 5): 6])
|
|
}
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(NS::NSArray[NS::NSInt])
|
|
}
|
|
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(NS::NSArray[NS::NSInt : NS::NSInt])
|
|
}
|
|
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-error@+2{{use of undeclared identifier 'NSArray'; did you mean 'NS::NSArray'}}
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(NSArray[NS::NSInt : NS::NSInt])
|
|
}
|
|
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-error@+2{{use of undeclared identifier 'NSInt'; did you mean 'NS::NSInt'}}
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(NS::NSArray[NSInt : NS::NSInt])
|
|
}
|
|
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-error@+2{{use of undeclared identifier 'NSInt'; did you mean 'NS::NSInt'}}
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(NS::NSArray[NS::NSInt : NSInt])
|
|
}
|
|
}
|
|
|
|
struct S {
|
|
static constexpr int value = 5;
|
|
static constexpr char array[] ={1,2,3,4,5};
|
|
};
|
|
|
|
struct Members {
|
|
int value = 5;
|
|
char array[5] ={1,2,3,4,5};
|
|
};
|
|
struct HasMembersArray {
|
|
Members MemArr[4];
|
|
};
|
|
|
|
|
|
void use() {
|
|
|
|
Members s;
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(s.array[s.value])
|
|
}
|
|
HasMembersArray Arrs;
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(Arrs.MemArr[3].array[4])
|
|
}
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(Arrs.MemArr[3].array[1:4])
|
|
}
|
|
for (int i = 0; i < 10; ++i) {
|
|
// FIXME: Once we have a new array-section type to represent OpenACC as
|
|
// well, change this error message.
|
|
// expected-error@+2{{OpenMP array section is not allowed here}}
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(Arrs.MemArr[3:4].array[1:4])
|
|
}
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-error@+2{{OpenMP array section is not allowed here}}
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(Arrs.MemArr[3:4].array[4])
|
|
}
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-error@+3{{expected ']'}}
|
|
// expected-note@+2{{to match this '['}}
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(Arrs.MemArr[3:4:].array[4])
|
|
}
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-error@+2{{expected expression}}
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(Arrs.MemArr[:].array[4])
|
|
}
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-error@+2{{expected unqualified-id}}
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(Arrs.MemArr[::].array[4])
|
|
}
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-error@+4{{expected expression}}
|
|
// expected-error@+3{{expected ']'}}
|
|
// expected-note@+2{{to match this '['}}
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(Arrs.MemArr[: :].array[4])
|
|
}
|
|
for (int i = 0; i < 10; ++i) {
|
|
// expected-error@+2{{expected expression}}
|
|
// expected-warning@+1{{OpenACC directives not yet implemented, pragma ignored}}
|
|
#pragma acc cache(Arrs.MemArr[3:].array[4])
|
|
}
|
|
func<S, 5>();
|
|
}
|
|
|