1 // RUN: %clang_cc1 %s -fopenacc -verify 2 3 enum SomeE{}; 4 typedef struct IsComplete { 5 struct S { int A; } CompositeMember; 6 int ScalarMember; 7 float ArrayMember[5]; 8 SomeE EnumMember; 9 char *PointerMember; 10 } Complete; 11 12 void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete CompositeParam, int &IntParamRef) { 13 int LocalInt; 14 char *LocalPointer; 15 float LocalArray[5]; 16 // Check Appertainment: 17 #pragma acc parallel create(LocalInt) 18 while(1); 19 #pragma acc serial create(LocalInt) 20 while(1); 21 #pragma acc kernels create(LocalInt) 22 while(1); 23 24 // Valid cases: 25 #pragma acc parallel create(LocalInt, LocalPointer, LocalArray) 26 while(1); 27 #pragma acc parallel create(LocalArray[2:1]) 28 while(1); 29 30 Complete LocalComposite2; 31 #pragma acc parallel create(LocalComposite2.ScalarMember, LocalComposite2.ScalarMember) 32 while(1); 33 34 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}} 35 #pragma acc parallel create(1 + IntParam) 36 while(1); 37 38 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}} 39 #pragma acc parallel create(+IntParam) 40 while(1); 41 42 // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}} 43 #pragma acc parallel create(PointerParam[2:]) 44 while(1); 45 46 // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} 47 #pragma acc parallel create(ArrayParam[2:5]) 48 while(1); 49 50 // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}} 51 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}} 52 #pragma acc parallel create((float*)ArrayParam[2:5]) 53 while(1); 54 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}} 55 #pragma acc parallel create((float)ArrayParam[2]) 56 while(1); 57 } 58 59 template<typename T, unsigned I, typename V> 60 void TemplUses(T t, T (&arrayT)[I], V TemplComp) { 61 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}} 62 #pragma acc parallel create(+t) 63 while(true); 64 65 // NTTP's are only valid if it is a reference to something. 66 // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}} 67 // expected-note@#TEMPL_USES_INST{{in instantiation of}} 68 #pragma acc parallel create(I) 69 while(true); 70 71 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}} 72 #pragma acc parallel create(t, I) 73 while(true); 74 75 #pragma acc parallel create(arrayT) 76 while(true); 77 78 #pragma acc parallel create(TemplComp) 79 while(true); 80 81 #pragma acc parallel create(TemplComp.PointerMember[5]) 82 while(true); 83 int *Pointer; 84 #pragma acc parallel create(Pointer[:I]) 85 while(true); 86 #pragma acc parallel create(Pointer[:t]) 87 while(true); 88 // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}} 89 #pragma acc parallel create(Pointer[1:]) 90 while(true); 91 } 92 93 template<unsigned I, auto &NTTP_REF> 94 void NTTP() { 95 // NTTP's are only valid if it is a reference to something. 96 // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, or composite variable member}} 97 // expected-note@#NTTP_INST{{in instantiation of}} 98 #pragma acc parallel create(I) 99 while(true); 100 101 #pragma acc parallel create(NTTP_REF) 102 while(true); 103 } 104 105 void Inst() { 106 static constexpr int NTTP_REFed = 1; 107 int i; 108 int Arr[5]; 109 Complete C; 110 TemplUses(i, Arr, C); // #TEMPL_USES_INST 111 NTTP<5, NTTP_REFed>(); // #NTTP_INST 112 } 113