| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,124 @@ | ||
| // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s | ||
|
|
||
| // Test this with PCH. | ||
| // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s | ||
| // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s | ||
| #ifndef PCH_HELPER | ||
| #define PCH_HELPER | ||
|
|
||
| void NormalUses() { | ||
| // CHECK: FunctionDecl{{.*}}NormalUses | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| #pragma acc loop auto | ||
| for(;;){} | ||
| // CHECK-NEXT: OpenACCLoopConstruct{{.*}} | ||
| // CHECK-NEXT: auto clause | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| #pragma acc loop seq | ||
| for(;;){} | ||
| // CHECK-NEXT: OpenACCLoopConstruct{{.*}} | ||
| // CHECK-NEXT: seq clause | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| #pragma acc loop independent | ||
| for(;;){} | ||
| // CHECK-NEXT: OpenACCLoopConstruct{{.*}} | ||
| // CHECK-NEXT: independent clause | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: CompoundStmt | ||
| } | ||
|
|
||
| template<typename T> | ||
| void TemplUses() { | ||
| // CHECK: FunctionTemplateDecl{{.*}}TemplUses | ||
| // CHECK-NEXT: TemplateTypeParmDecl | ||
| // CHECK-NEXT: FunctionDecl{{.*}} TemplUses | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| #pragma acc loop auto | ||
| for(;;){} | ||
| // CHECK-NEXT: OpenACCLoopConstruct{{.*}} | ||
| // CHECK-NEXT: auto clause | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| #pragma acc loop seq | ||
| for(;;){} | ||
| // CHECK-NEXT: OpenACCLoopConstruct{{.*}} | ||
| // CHECK-NEXT: seq clause | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| #pragma acc loop independent | ||
| for(;;){} | ||
| // CHECK-NEXT: OpenACCLoopConstruct{{.*}} | ||
| // CHECK-NEXT: independent clause | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| // Instantiations. | ||
| // CHECK-NEXT: FunctionDecl{{.*}}TemplUses 'void ()' implicit_instantiation | ||
| // CHECK-NEXT: TemplateArgument | ||
| // CHECK-NEXT: BuiltinType | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| // CHECK-NEXT: OpenACCLoopConstruct{{.*}} | ||
| // CHECK-NEXT: auto clause | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| // CHECK-NEXT: OpenACCLoopConstruct{{.*}} | ||
| // CHECK-NEXT: seq clause | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: CompoundStmt | ||
|
|
||
| // CHECK-NEXT: OpenACCLoopConstruct{{.*}} | ||
| // CHECK-NEXT: independent clause | ||
| // CHECK-NEXT: ForStmt | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: <<<NULL>>> | ||
| // CHECK-NEXT: CompoundStmt | ||
| } | ||
|
|
||
| void Inst() { | ||
| TemplUses<int>(); | ||
| } | ||
| #endif // PCH_HELPER |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,132 @@ | ||
| // RUN: %clang_cc1 %s -fopenacc -verify | ||
|
|
||
| struct Incomplete; | ||
| enum SomeE{ A }; | ||
| typedef struct IsComplete { | ||
| struct S { int A; } CompositeMember; | ||
| int ScalarMember; | ||
| float ArrayMember[5]; | ||
| enum SomeE EnumMember; | ||
| void *PointerMember; | ||
| } Complete; | ||
|
|
||
| int GlobalInt; | ||
| float GlobalArray[5]; | ||
| short *GlobalPointer; | ||
| Complete GlobalComposite; | ||
|
|
||
| void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete CompositeParam) { | ||
| int LocalInt; | ||
| short *LocalPointer; | ||
| float LocalArray[5]; | ||
| Complete LocalComposite; | ||
|
|
||
| // Check Appertainment: | ||
| #pragma acc loop private(LocalInt) | ||
| for(;;); | ||
|
|
||
| // Valid cases: | ||
| #pragma acc loop private(LocalInt, LocalPointer, LocalArray) | ||
| for(;;); | ||
| #pragma acc loop private(LocalArray) | ||
| for(;;); | ||
| #pragma acc loop private(LocalArray[:]) | ||
| for(;;); | ||
| #pragma acc loop private(LocalArray[:5]) | ||
| for(;;); | ||
| #pragma acc loop private(LocalArray[2:]) | ||
| for(;;); | ||
| #pragma acc loop private(LocalArray[2:1]) | ||
| for(;;); | ||
| #pragma acc loop private(LocalArray[2]) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite.EnumMember) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite.ScalarMember) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite.ArrayMember) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite.ArrayMember[5]) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite.PointerMember) | ||
| for(;;); | ||
| #pragma acc loop private(GlobalInt, GlobalArray, GlobalPointer, GlobalComposite) | ||
| for(;;); | ||
| #pragma acc loop private(GlobalArray[2], GlobalPointer[2], GlobalComposite.CompositeMember.A) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite, GlobalComposite) | ||
| for(;;); | ||
| #pragma acc loop private(IntParam, PointerParam, ArrayParam, CompositeParam) | ||
| for(;;); | ||
| #pragma acc loop private(PointerParam[IntParam], ArrayParam[IntParam], CompositeParam.CompositeMember.A) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(LocalArray) private(LocalArray[2]) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(LocalArray, LocalArray[2]) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(LocalComposite, LocalComposite.ScalarMember) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(LocalComposite.CompositeMember.A, LocalComposite.ScalarMember) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(LocalComposite.CompositeMember.A) private(LocalComposite.ScalarMember) | ||
| for(;;); | ||
|
|
||
| Complete LocalComposite2; | ||
| #pragma acc loop private(LocalComposite2.ScalarMember, LocalComposite2.ScalarMember) | ||
| for(;;); | ||
|
|
||
| // Invalid cases, arbitrary expressions. | ||
| struct Incomplete *I; | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc loop private(*I) | ||
| for(;;); | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc loop private(GlobalInt + IntParam) | ||
| for(;;); | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc loop private(+GlobalInt) | ||
| for(;;); | ||
|
|
||
| // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}} | ||
| #pragma acc loop private(PointerParam[:]) | ||
| for(;;); | ||
| #pragma acc loop private(PointerParam[:5]) | ||
| for(;;); | ||
| #pragma acc loop private(PointerParam[:IntParam]) | ||
| for(;;); | ||
| // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}} | ||
| #pragma acc loop private(PointerParam[2:]) | ||
| for(;;); | ||
| #pragma acc loop private(PointerParam[2:5]) | ||
| for(;;); | ||
| #pragma acc loop private(PointerParam[2]) | ||
| for(;;); | ||
| #pragma acc loop private(ArrayParam[:]) | ||
| for(;;); | ||
| #pragma acc loop private(ArrayParam[:5]) | ||
| for(;;); | ||
| #pragma acc loop private(ArrayParam[:IntParam]) | ||
| for(;;); | ||
| #pragma acc loop private(ArrayParam[2:]) | ||
| for(;;); | ||
| // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} | ||
| #pragma acc loop private(ArrayParam[2:5]) | ||
| for(;;); | ||
| #pragma acc loop private(ArrayParam[2]) | ||
| for(;;); | ||
|
|
||
| // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc loop private((float*)ArrayParam[2:5]) | ||
| for(;;); | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc loop private((float)ArrayParam[2]) | ||
| for(;;); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,155 @@ | ||
| // RUN: %clang_cc1 %s -fopenacc -verify | ||
|
|
||
| struct Incomplete; | ||
| enum SomeE{}; | ||
| typedef struct IsComplete { | ||
| struct S { int A; } CompositeMember; | ||
| int ScalarMember; | ||
| float ArrayMember[5]; | ||
| SomeE EnumMember; | ||
| char *PointerMember; | ||
| } Complete; | ||
|
|
||
| int GlobalInt; | ||
| float GlobalArray[5]; | ||
| char *GlobalPointer; | ||
| Complete GlobalComposite; | ||
|
|
||
| void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete CompositeParam, int &IntParamRef) { | ||
| int LocalInt; | ||
| char *LocalPointer; | ||
| float LocalArray[5]; | ||
| Complete LocalComposite; | ||
|
|
||
| // Check Appertainment: | ||
|
|
||
| #pragma acc loop private(LocalInt) | ||
| for(;;); | ||
|
|
||
| // Valid cases: | ||
| #pragma acc loop private(LocalInt, LocalPointer, LocalArray) | ||
| for(;;); | ||
| #pragma acc loop private(LocalArray) | ||
| for(;;); | ||
| #pragma acc loop private(LocalArray[2]) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite.EnumMember) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite.ScalarMember) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite.ArrayMember) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite.ArrayMember[5]) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite.PointerMember) | ||
| for(;;); | ||
| #pragma acc loop private(GlobalInt, GlobalArray, GlobalPointer, GlobalComposite) | ||
| for(;;); | ||
| #pragma acc loop private(GlobalArray[2], GlobalPointer[2], GlobalComposite.CompositeMember.A) | ||
| for(;;); | ||
| #pragma acc loop private(LocalComposite, GlobalComposite) | ||
| for(;;); | ||
| #pragma acc loop private(IntParam, PointerParam, ArrayParam, CompositeParam) private(IntParamRef) | ||
| for(;;); | ||
| #pragma acc loop private(PointerParam[IntParam], ArrayParam[IntParam], CompositeParam.CompositeMember.A) | ||
| for(;;); | ||
|
|
||
|
|
||
| // Invalid cases, arbitrary expressions. | ||
| Incomplete *I; | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc loop private(*I) | ||
| for(;;); | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc loop private(GlobalInt + IntParam) | ||
| for(;;); | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc loop private(+GlobalInt) | ||
| for(;;); | ||
| } | ||
|
|
||
| template<typename T, unsigned I, typename V> | ||
| void TemplUses(T t, T (&arrayT)[I], V TemplComp) { | ||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc loop private(+t) | ||
| for(;;); | ||
|
|
||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc loop private(+I) | ||
| for(;;); | ||
|
|
||
| // NTTP's are only valid if it is a reference to something. | ||
| // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| // expected-note@#TEMPL_USES_INST{{in instantiation of}} | ||
| #pragma acc loop private(I) | ||
| for(;;); | ||
|
|
||
| // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| #pragma acc loop private(t, I) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(arrayT) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(TemplComp) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(TemplComp.PointerMember[5]) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(TemplComp.PointerMember[5]) private(TemplComp) | ||
| for(;;); | ||
|
|
||
| int *Pointer; | ||
| #pragma acc loop private(Pointer[:I]) | ||
| for(;;); | ||
| #pragma acc loop private(Pointer[:t]) | ||
| for(;;); | ||
| // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}} | ||
| #pragma acc loop private(Pointer[1:]) | ||
| for(;;); | ||
| } | ||
|
|
||
| template<unsigned I, auto &NTTP_REF> | ||
| void NTTP() { | ||
| // NTTP's are only valid if it is a reference to something. | ||
| // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}} | ||
| // expected-note@#NTTP_INST{{in instantiation of}} | ||
| #pragma acc loop private(I) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(NTTP_REF) | ||
| for(;;); | ||
| } | ||
|
|
||
| struct S { | ||
| int ThisMember; | ||
| int ThisMemberArray[5]; | ||
|
|
||
| void foo(); | ||
| }; | ||
|
|
||
| void S::foo() { | ||
| #pragma acc loop private(ThisMember, this->ThisMemberArray[1]) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(ThisMemberArray[1:2]) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(this) | ||
| for(;;); | ||
|
|
||
| #pragma acc loop private(ThisMember, this->ThisMember) | ||
| for(;;); | ||
| } | ||
|
|
||
| void Inst() { | ||
| static constexpr int NTTP_REFed = 1; | ||
| int i; | ||
| int Arr[5]; | ||
| Complete C; | ||
| TemplUses(i, Arr, C); // #TEMPL_USES_INST | ||
| NTTP<5, NTTP_REFed>(); // #NTTP_INST | ||
| } |