xref: /llvm-project/clang/test/SemaOpenACC/loop-construct-private-clause.cpp (revision b0cfbfd74bfd9d077f7c1854a1b38dcbe9d402e4)
17dcff591Serichkeane // RUN: %clang_cc1 %s -fopenacc -verify
27dcff591Serichkeane 
37dcff591Serichkeane struct Incomplete;
47dcff591Serichkeane enum SomeE{};
57dcff591Serichkeane typedef struct IsComplete {
67dcff591Serichkeane   struct S { int A; } CompositeMember;
77dcff591Serichkeane   int ScalarMember;
87dcff591Serichkeane   float ArrayMember[5];
97dcff591Serichkeane   SomeE EnumMember;
107dcff591Serichkeane   char *PointerMember;
117dcff591Serichkeane } Complete;
127dcff591Serichkeane 
137dcff591Serichkeane int GlobalInt;
147dcff591Serichkeane float GlobalArray[5];
157dcff591Serichkeane char *GlobalPointer;
167dcff591Serichkeane Complete GlobalComposite;
177dcff591Serichkeane 
187dcff591Serichkeane void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete CompositeParam, int &IntParamRef) {
197dcff591Serichkeane   int LocalInt;
207dcff591Serichkeane   char *LocalPointer;
217dcff591Serichkeane   float LocalArray[5];
227dcff591Serichkeane   Complete LocalComposite;
237dcff591Serichkeane 
247dcff591Serichkeane   // Check Appertainment:
257dcff591Serichkeane 
267dcff591Serichkeane #pragma acc loop private(LocalInt)
27*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
287dcff591Serichkeane 
297dcff591Serichkeane   // Valid cases:
307dcff591Serichkeane #pragma acc loop private(LocalInt, LocalPointer, LocalArray)
31*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
327dcff591Serichkeane #pragma acc loop private(LocalArray)
33*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
347dcff591Serichkeane #pragma acc loop private(LocalArray[2])
35*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
367dcff591Serichkeane #pragma acc loop private(LocalComposite)
37*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
387dcff591Serichkeane #pragma acc loop private(LocalComposite.EnumMember)
39*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
407dcff591Serichkeane #pragma acc loop private(LocalComposite.ScalarMember)
41*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
427dcff591Serichkeane #pragma acc loop private(LocalComposite.ArrayMember)
43*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
447dcff591Serichkeane #pragma acc loop private(LocalComposite.ArrayMember[5])
45*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
467dcff591Serichkeane #pragma acc loop private(LocalComposite.PointerMember)
47*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
487dcff591Serichkeane #pragma acc loop private(GlobalInt, GlobalArray, GlobalPointer, GlobalComposite)
49*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
507dcff591Serichkeane #pragma acc loop private(GlobalArray[2], GlobalPointer[2], GlobalComposite.CompositeMember.A)
51*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
527dcff591Serichkeane #pragma acc loop private(LocalComposite, GlobalComposite)
53*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
547dcff591Serichkeane #pragma acc loop private(IntParam, PointerParam, ArrayParam, CompositeParam) private(IntParamRef)
55*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
567dcff591Serichkeane #pragma acc loop private(PointerParam[IntParam], ArrayParam[IntParam], CompositeParam.CompositeMember.A)
57*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
587dcff591Serichkeane 
597dcff591Serichkeane 
607dcff591Serichkeane   // Invalid cases, arbitrary expressions.
617dcff591Serichkeane   Incomplete *I;
627dcff591Serichkeane   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
637dcff591Serichkeane #pragma acc loop private(*I)
64*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
657dcff591Serichkeane   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
667dcff591Serichkeane #pragma acc loop private(GlobalInt + IntParam)
67*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
687dcff591Serichkeane   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
697dcff591Serichkeane #pragma acc loop private(+GlobalInt)
70*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
717dcff591Serichkeane }
727dcff591Serichkeane 
737dcff591Serichkeane template<typename T, unsigned I, typename V>
747dcff591Serichkeane void TemplUses(T t, T (&arrayT)[I], V TemplComp) {
757dcff591Serichkeane   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
767dcff591Serichkeane #pragma acc loop private(+t)
77*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
787dcff591Serichkeane 
797dcff591Serichkeane   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
807dcff591Serichkeane #pragma acc loop private(+I)
81*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
827dcff591Serichkeane 
837dcff591Serichkeane   // NTTP's are only valid if it is a reference to something.
847dcff591Serichkeane   // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
857dcff591Serichkeane   // expected-note@#TEMPL_USES_INST{{in instantiation of}}
867dcff591Serichkeane #pragma acc loop private(I)
87*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
887dcff591Serichkeane 
897dcff591Serichkeane   // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
907dcff591Serichkeane #pragma acc loop private(t, I)
91*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
927dcff591Serichkeane 
937dcff591Serichkeane #pragma acc loop private(arrayT)
94*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
957dcff591Serichkeane 
967dcff591Serichkeane #pragma acc loop private(TemplComp)
97*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
987dcff591Serichkeane 
997dcff591Serichkeane #pragma acc loop private(TemplComp.PointerMember[5])
100*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
1017dcff591Serichkeane 
1027dcff591Serichkeane #pragma acc loop private(TemplComp.PointerMember[5]) private(TemplComp)
103*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
1047dcff591Serichkeane 
1057dcff591Serichkeane  int *Pointer;
1067dcff591Serichkeane #pragma acc loop private(Pointer[:I])
107*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
1087dcff591Serichkeane #pragma acc loop private(Pointer[:t])
109*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
1107dcff591Serichkeane   // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
1117dcff591Serichkeane #pragma acc loop private(Pointer[1:])
112*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
1137dcff591Serichkeane }
1147dcff591Serichkeane 
1157dcff591Serichkeane template<unsigned I, auto &NTTP_REF>
1167dcff591Serichkeane void NTTP() {
1177dcff591Serichkeane   // NTTP's are only valid if it is a reference to something.
1187dcff591Serichkeane   // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
1197dcff591Serichkeane   // expected-note@#NTTP_INST{{in instantiation of}}
1207dcff591Serichkeane #pragma acc loop private(I)
121*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
1227dcff591Serichkeane 
1237dcff591Serichkeane #pragma acc loop private(NTTP_REF)
124*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
1257dcff591Serichkeane }
1267dcff591Serichkeane 
1277dcff591Serichkeane struct S {
1287dcff591Serichkeane   int ThisMember;
1297dcff591Serichkeane   int ThisMemberArray[5];
1307dcff591Serichkeane 
1317dcff591Serichkeane   void foo();
1327dcff591Serichkeane };
1337dcff591Serichkeane 
1347dcff591Serichkeane void S::foo() {
1357dcff591Serichkeane #pragma acc loop private(ThisMember, this->ThisMemberArray[1])
136*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
1377dcff591Serichkeane 
1387dcff591Serichkeane #pragma acc loop private(ThisMemberArray[1:2])
139*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
1407dcff591Serichkeane 
1417dcff591Serichkeane #pragma acc loop private(this)
142*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
1437dcff591Serichkeane 
1447dcff591Serichkeane #pragma acc loop private(ThisMember, this->ThisMember)
145*b0cfbfd7SErich Keane   for(int i = 0; i < 5; ++i);
1467dcff591Serichkeane }
1477dcff591Serichkeane 
1487dcff591Serichkeane void Inst() {
1497dcff591Serichkeane   static constexpr int NTTP_REFed = 1;
1507dcff591Serichkeane   int i;
1517dcff591Serichkeane   int Arr[5];
1527dcff591Serichkeane   Complete C;
1537dcff591Serichkeane   TemplUses(i, Arr, C); // #TEMPL_USES_INST
1547dcff591Serichkeane   NTTP<5, NTTP_REFed>(); // #NTTP_INST
1557dcff591Serichkeane }
156