1 // RUN: %clang_cc1 %s -fopenacc -verify 2 3 struct Incomplete; 4 enum SomeE{}; 5 typedef struct IsComplete { 6 struct S { int A; } CompositeMember; 7 int ScalarMember; 8 float ArrayMember[5]; 9 SomeE EnumMember; 10 char *PointerMember; 11 } Complete; 12 13 int GlobalInt; 14 float GlobalArray[5]; 15 char *GlobalPointer; 16 Complete GlobalComposite; 17 18 void 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 73 template<typename T, unsigned I, typename V> 74 void 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 115 template<unsigned I, auto &NTTP_REF> 116 void 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 127 struct S { 128 int ThisMember; 129 int ThisMemberArray[5]; 130 131 void foo(); 132 }; 133 134 void 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 148 void 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_INST 154 NTTP<5, NTTP_REFed>(); // #NTTP_INST 155 } 156