
This implementation takes quite a bit from the OMP implementation of array sections, but only has to enforce the rules as applicable to OpenACC. Additionally, it does its best to create an AST node (with the assistance of RecoveryExprs) with as much checking done as soon as possible in the case of instantiations.
90 lines
2.6 KiB
C++
90 lines
2.6 KiB
C++
// RUN: %clang_cc1 %s -verify -fopenacc
|
|
|
|
void Func(int i, int j) {
|
|
int array[5];
|
|
#pragma acc parallel private(array[:])
|
|
while (true);
|
|
#pragma acc parallel private(array[i:])
|
|
while (true);
|
|
#pragma acc parallel private(array[:j])
|
|
while (true);
|
|
#pragma acc parallel private(array[i:j])
|
|
while (true);
|
|
#pragma acc parallel private(array[1:2])
|
|
while (true);
|
|
|
|
// expected-error@+1{{expected unqualified-id}}
|
|
#pragma acc parallel private(array[::])
|
|
while (true);
|
|
// expected-error@+2{{expected ']'}}
|
|
// expected-note@+1{{to match this '['}}
|
|
#pragma acc parallel private(array[1::])
|
|
while (true);
|
|
// expected-error@+2{{expected ']'}}
|
|
// expected-note@+1{{to match this '['}}
|
|
#pragma acc parallel private(array[:2:])
|
|
while (true);
|
|
// expected-error@+3{{expected unqualified-id}}
|
|
// expected-error@+2{{expected ']'}}
|
|
// expected-note@+1{{to match this '['}}
|
|
#pragma acc parallel private(array[::3])
|
|
while (true);
|
|
// expected-error@+2{{expected ']'}}
|
|
// expected-note@+1{{to match this '['}}
|
|
#pragma acc parallel private(array[1:2:3])
|
|
while (true);
|
|
}
|
|
|
|
template<typename T, unsigned I, auto &IPtr>// #IPTR
|
|
void TemplFunc() {
|
|
T array[I];
|
|
T array2[2*I];
|
|
T t; // #tDecl
|
|
#pragma acc parallel private(array[:])
|
|
while (true);
|
|
#pragma acc parallel private(array[t:])
|
|
while (true);
|
|
#pragma acc parallel private(array[I-1:])
|
|
while (true);
|
|
#pragma acc parallel private(array[IPtr:])
|
|
while (true);
|
|
#pragma acc parallel private(array[:t])
|
|
while (true);
|
|
#pragma acc parallel private(array[:I])
|
|
while (true);
|
|
#pragma acc parallel private(array[:IPtr])
|
|
while (true);
|
|
#pragma acc parallel private(array[t:t])
|
|
while (true);
|
|
#pragma acc parallel private(array2[I:I])
|
|
while (true);
|
|
#pragma acc parallel private(array[IPtr:IPtr])
|
|
while (true);
|
|
|
|
// expected-error@+1{{expected unqualified-id}}
|
|
#pragma acc parallel private(array[::])
|
|
while (true);
|
|
// expected-error@+3{{'t' is not a class, namespace, or enumeration}}
|
|
// expected-note@#tDecl{{'t' declared here}}
|
|
// expected-error@+1{{expected unqualified-id}}
|
|
#pragma acc parallel private(array[t::])
|
|
while (true);
|
|
// expected-error@+2{{expected ']'}}
|
|
// expected-note@+1{{to match this '['}}
|
|
#pragma acc parallel private(array[:I:])
|
|
while (true);
|
|
// expected-error@+2{{no member named 'IPtr' in the global namespace}}
|
|
// expected-note@#IPTR{{'IPtr' declared here}}
|
|
#pragma acc parallel private(array[::IPtr])
|
|
while (true);
|
|
// expected-error@+2{{expected ']'}}
|
|
// expected-note@+1{{to match this '['}}
|
|
#pragma acc parallel private(array[IPtr:I:t])
|
|
while (true);
|
|
}
|
|
|
|
void use() {
|
|
static constexpr int SomeI = 1;
|
|
TemplFunc<int, 5, SomeI>();
|
|
}
|