brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.4 KiB · 0d7313c Raw
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