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