156 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -verify2 3struct Incomplete;4enum SomeE{};5typedef struct IsComplete {6 struct S { int A; } CompositeMember;7 int ScalarMember;8 float ArrayMember[5];9 SomeE EnumMember;10 char *PointerMember;11} Complete;12 13int GlobalInt;14float GlobalArray[5];15char *GlobalPointer;16Complete GlobalComposite;17 18void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete CompositeParam, int &IntParamRef) {19 int LocalInt;20 char *LocalPointer;21 float LocalArray[5];22 Complete LocalComposite;23 24 // Check Appertainment:25 26#pragma acc loop private(LocalInt)27 for(int i = 0; i < 5; ++i);28 29 // Valid cases:30#pragma acc loop private(LocalInt, LocalPointer, LocalArray)31 for(int i = 0; i < 5; ++i);32#pragma acc loop private(LocalArray)33 for(int i = 0; i < 5; ++i);34#pragma acc loop private(LocalArray[2])35 for(int i = 0; i < 5; ++i);36#pragma acc loop private(LocalComposite)37 for(int i = 0; i < 5; ++i);38#pragma acc loop private(LocalComposite.EnumMember)39 for(int i = 0; i < 5; ++i);40#pragma acc loop private(LocalComposite.ScalarMember)41 for(int i = 0; i < 5; ++i);42#pragma acc loop private(LocalComposite.ArrayMember)43 for(int i = 0; i < 5; ++i);44#pragma acc loop private(LocalComposite.ArrayMember[5])45 for(int i = 0; i < 5; ++i);46#pragma acc loop private(LocalComposite.PointerMember)47 for(int i = 0; i < 5; ++i);48#pragma acc loop private(GlobalInt, GlobalArray, GlobalPointer, GlobalComposite)49 for(int i = 0; i < 5; ++i);50#pragma acc loop private(GlobalArray[2], GlobalPointer[2], GlobalComposite.CompositeMember.A)51 for(int i = 0; i < 5; ++i);52#pragma acc loop private(LocalComposite, GlobalComposite)53 for(int i = 0; i < 5; ++i);54#pragma acc loop private(IntParam, PointerParam, ArrayParam, CompositeParam) private(IntParamRef)55 for(int i = 0; i < 5; ++i);56#pragma acc loop private(PointerParam[IntParam], ArrayParam[IntParam], CompositeParam.CompositeMember.A)57 for(int i = 0; i < 5; ++i);58 59 60 // Invalid cases, arbitrary expressions.61 Incomplete *I;62 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}63#pragma acc loop private(*I)64 for(int i = 0; i < 5; ++i);65 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}66#pragma acc loop private(GlobalInt + IntParam)67 for(int i = 0; i < 5; ++i);68 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}69#pragma acc loop private(+GlobalInt)70 for(int i = 0; i < 5; ++i);71}72 73template<typename T, unsigned I, typename V>74void TemplUses(T t, T (&arrayT)[I], V TemplComp) {75 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}76#pragma acc loop private(+t)77 for(int i = 0; i < 5; ++i);78 79 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}80#pragma acc loop private(+I)81 for(int i = 0; i < 5; ++i);82 83 // NTTP's are only valid if it is a reference to something.84 // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}85 // expected-note@#TEMPL_USES_INST{{in instantiation of}}86#pragma acc loop private(I)87 for(int i = 0; i < 5; ++i);88 89 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}90#pragma acc loop private(t, I)91 for(int i = 0; i < 5; ++i);92 93#pragma acc loop private(arrayT)94 for(int i = 0; i < 5; ++i);95 96#pragma acc loop private(TemplComp)97 for(int i = 0; i < 5; ++i);98 99#pragma acc loop private(TemplComp.PointerMember[5])100 for(int i = 0; i < 5; ++i);101 102#pragma acc loop private(TemplComp.PointerMember[5]) private(TemplComp)103 for(int i = 0; i < 5; ++i);104 105 int *Pointer;106#pragma acc loop private(Pointer[:I])107 for(int i = 0; i < 5; ++i);108#pragma acc loop private(Pointer[:t])109 for(int i = 0; i < 5; ++i);110 // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}111#pragma acc loop private(Pointer[1:])112 for(int i = 0; i < 5; ++i);113}114 115template<unsigned I, auto &NTTP_REF>116void NTTP() {117 // NTTP's are only valid if it is a reference to something.118 // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}119 // expected-note@#NTTP_INST{{in instantiation of}}120#pragma acc loop private(I)121 for(int i = 0; i < 5; ++i);122 123#pragma acc loop private(NTTP_REF)124 for(int i = 0; i < 5; ++i);125}126 127struct S {128 int ThisMember;129 int ThisMemberArray[5];130 131 void foo();132};133 134void S::foo() {135#pragma acc loop private(ThisMember, this->ThisMemberArray[1])136 for(int i = 0; i < 5; ++i);137 138#pragma acc loop private(ThisMemberArray[1:2])139 for(int i = 0; i < 5; ++i);140 141#pragma acc loop private(this)142 for(int i = 0; i < 5; ++i);143 144#pragma acc loop private(ThisMember, this->ThisMember)145 for(int i = 0; i < 5; ++i);146}147 148void Inst() {149 static constexpr int NTTP_REFed = 1;150 int i;151 int Arr[5];152 Complete C;153 TemplUses(i, Arr, C); // #TEMPL_USES_INST154 NTTP<5, NTTP_REFed>(); // #NTTP_INST155}156