142 lines · c
1// RUN: %clang_cc1 %s -fopenacc -verify2 3struct Incomplete;4enum SomeE{ A };5typedef struct IsComplete {6 struct S { int A; } CompositeMember;7 int ScalarMember;8 float ArrayMember[5];9 enum SomeE EnumMember;10 void *PointerMember;11} Complete;12 13int GlobalInt;14float GlobalArray[5];15short *GlobalPointer;16Complete GlobalComposite;17 18void uses(int IntParam, short *PointerParam, float ArrayParam[5], Complete CompositeParam) {19 int LocalInt;20 short *LocalPointer;21 float LocalArray[5];22 Complete LocalComposite;23 24 // Check Appertainment:25#pragma acc parallel private(LocalInt)26 while(1);27#pragma acc serial private(LocalInt)28 while(1);29 // expected-error@+1{{OpenACC 'private' clause is not valid on 'kernels' directive}}30#pragma acc kernels private(LocalInt)31 while(1);32 33 // Valid cases:34#pragma acc parallel private(LocalInt, LocalPointer, LocalArray)35 while(1);36#pragma acc parallel private(LocalArray)37 while(1);38#pragma acc parallel private(LocalArray[:])39 while(1);40#pragma acc parallel private(LocalArray[:5])41 while(1);42#pragma acc parallel private(LocalArray[2:])43 while(1);44#pragma acc parallel private(LocalArray[2:1])45 while(1);46#pragma acc parallel private(LocalArray[2])47 while(1);48#pragma acc parallel private(LocalComposite)49 while(1);50#pragma acc parallel private(LocalComposite.EnumMember)51 while(1);52#pragma acc parallel private(LocalComposite.ScalarMember)53 while(1);54#pragma acc parallel private(LocalComposite.ArrayMember)55 while(1);56#pragma acc parallel private(LocalComposite.ArrayMember[5])57 while(1);58#pragma acc parallel private(LocalComposite.PointerMember)59 while(1);60#pragma acc parallel private(GlobalInt, GlobalArray, GlobalPointer, GlobalComposite)61 while(1);62#pragma acc parallel private(GlobalArray[2], GlobalPointer[2], GlobalComposite.CompositeMember.A)63 while(1);64#pragma acc parallel private(LocalComposite, GlobalComposite)65 while(1);66#pragma acc parallel private(IntParam, PointerParam, ArrayParam, CompositeParam)67 while(1);68#pragma acc parallel private(PointerParam[IntParam], ArrayParam[IntParam], CompositeParam.CompositeMember.A)69 while(1);70 71#pragma acc parallel private(LocalArray) private(LocalArray[2])72 while(1);73 74#pragma acc parallel private(LocalArray, LocalArray[2])75 while(1);76 77#pragma acc parallel private(LocalComposite, LocalComposite.ScalarMember)78 while(1);79 80#pragma acc parallel private(LocalComposite.CompositeMember.A, LocalComposite.ScalarMember)81 while(1);82 83#pragma acc parallel private(LocalComposite.CompositeMember.A) private(LocalComposite.ScalarMember)84 while(1);85 86 Complete LocalComposite2;87#pragma acc parallel private(LocalComposite2.ScalarMember, LocalComposite2.ScalarMember)88 while(1);89 90 // Invalid cases, arbitrary expressions.91 struct Incomplete *I;92 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}93#pragma acc parallel private(*I)94 while(1);95 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}96#pragma acc parallel private(GlobalInt + IntParam)97 while(1);98 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}99#pragma acc parallel private(+GlobalInt)100 while(1);101 102 // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}103#pragma acc parallel private(PointerParam[:])104 while(1);105#pragma acc parallel private(PointerParam[:5])106 while(1);107#pragma acc parallel private(PointerParam[:IntParam])108 while(1);109 // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}110#pragma acc parallel private(PointerParam[2:])111 while(1);112#pragma acc parallel private(PointerParam[2:5])113 while(1);114#pragma acc parallel private(PointerParam[2])115 while(1);116#pragma acc parallel private(ArrayParam[:])117 while(1);118#pragma acc parallel private(ArrayParam[:5])119 while(1);120#pragma acc parallel private(ArrayParam[:IntParam])121 while(1);122#pragma acc parallel private(ArrayParam[2:])123 while(1);124 // expected-error@+1{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}125#pragma acc parallel private(ArrayParam[2:5])126 while(1);127#pragma acc parallel private(ArrayParam[2])128 while(1);129 130 // expected-error@+2{{OpenACC sub-array specified range [2:5] would be out of the range of the subscripted array size of 5}}131 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}132#pragma acc parallel private((float*)ArrayParam[2:5])133 while(1);134 // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}135#pragma acc parallel private((float)ArrayParam[2])136 while(1);137 138 // expected-error@+1{{OpenACC 'private' clause is not valid on 'init' directive}}139#pragma acc init private(LocalInt)140 for(;;);141}142