brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · 88f0a68 Raw
175 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 parallel private(LocalInt)27  while(true);28#pragma acc serial private(LocalInt)29  while(true);30  // expected-error@+1{{OpenACC 'private' clause is not valid on 'kernels' directive}}31#pragma acc kernels private(LocalInt)32  while(true);33 34  // Valid cases:35#pragma acc parallel private(LocalInt, LocalPointer, LocalArray)36  while(true);37#pragma acc parallel private(LocalArray)38  while(true);39#pragma acc parallel private(LocalArray[2])40  while(true);41#pragma acc parallel private(LocalComposite)42  while(true);43#pragma acc parallel private(LocalComposite.EnumMember)44  while(true);45#pragma acc parallel private(LocalComposite.ScalarMember)46  while(true);47#pragma acc parallel private(LocalComposite.ArrayMember)48  while(true);49#pragma acc parallel private(LocalComposite.ArrayMember[5])50  while(true);51#pragma acc parallel private(LocalComposite.PointerMember)52  while(true);53#pragma acc parallel private(GlobalInt, GlobalArray, GlobalPointer, GlobalComposite)54  while(true);55#pragma acc parallel private(GlobalArray[2], GlobalPointer[2], GlobalComposite.CompositeMember.A)56  while(true);57#pragma acc parallel private(LocalComposite, GlobalComposite)58  while(true);59#pragma acc parallel private(IntParam, PointerParam, ArrayParam, CompositeParam) private(IntParamRef)60  while(true);61#pragma acc parallel private(PointerParam[IntParam], ArrayParam[IntParam], CompositeParam.CompositeMember.A)62  while(true);63 64 65  // Invalid cases, arbitrary expressions.66  Incomplete *I;67  // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}68#pragma acc parallel private(*I)69  while(true);70  // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}71#pragma acc parallel private(GlobalInt + IntParam)72  while(true);73  // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}74#pragma acc parallel private(+GlobalInt)75  while(true);76}77 78template<typename T, unsigned I, typename V>79void TemplUses(T t, T (&arrayT)[I], V TemplComp) {80  // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}81#pragma acc parallel private(+t)82  while(true);83 84  // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}85#pragma acc parallel private(+I)86  while(true);87 88  // NTTP's are only valid if it is a reference to something.89  // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}90  // expected-note@#TEMPL_USES_INST{{in instantiation of}}91#pragma acc parallel private(I)92  while(true);93 94  // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}95#pragma acc parallel private(t, I)96  while(true);97 98#pragma acc parallel private(arrayT)99  while(true);100 101#pragma acc parallel private(TemplComp)102  while(true);103 104#pragma acc parallel private(TemplComp.PointerMember[5])105  while(true);106 107#pragma acc parallel private(TemplComp.PointerMember[5]) private(TemplComp)108  while(true);109 110 int *Pointer;111#pragma acc parallel private(Pointer[:I])112  while(true);113#pragma acc parallel private(Pointer[:t])114  while(true);115  // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}116#pragma acc parallel private(Pointer[1:])117  while(true);118}119 120template<unsigned I, auto &NTTP_REF>121void NTTP() {122  // NTTP's are only valid if it is a reference to something.123  // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}124  // expected-note@#NTTP_INST{{in instantiation of}}125#pragma acc parallel private(I)126  while(true);127 128#pragma acc parallel private(NTTP_REF)129  while(true);130}131 132struct S {133  int ThisMember;134  int ThisMemberArray[5];135 136  void foo();137};138 139void S::foo() {140#pragma acc parallel private(ThisMember, this->ThisMemberArray[1])141  while(true);142 143#pragma acc parallel private(ThisMemberArray[1:2])144  while(true);145 146#pragma acc parallel private(this)147  while(true);148 149#pragma acc parallel private(ThisMember, this->ThisMember)150  while(true);151}152 153void Inst() {154  static constexpr int NTTP_REFed = 1;155  int i;156  int Arr[5];157  Complete C;158  TemplUses(i, Arr, C); // #TEMPL_USES_INST159  NTTP<5, NTTP_REFed>(); // #NTTP_INST160}161 162template<typename T>163void ThisCrashed(unsigned A, unsigned B) {164  T ***ThreePtr;165  // expected-error@+1 2{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}166#pragma acc parallel private(ThreePtr[A:B][B][B])167  ;168}169 170void inst_crash() {171  // expected-note@+1{{in instantiation}}172  ThisCrashed<int>(1, 2);173}174 175