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