1fa67986dSErich Keane // RUN: %clang_cc1 %s -fopenacc -verify
2fa67986dSErich Keane
3fa67986dSErich Keane struct Incomplete;
4fa67986dSErich Keane enum SomeE{};
5fa67986dSErich Keane typedef struct IsComplete {
6fa67986dSErich Keane struct S { int A; } CompositeMember;
7fa67986dSErich Keane int ScalarMember;
8fa67986dSErich Keane float ArrayMember[5];
9fa67986dSErich Keane SomeE EnumMember;
10fa67986dSErich Keane char *PointerMember;
11fa67986dSErich Keane } Complete;
12fa67986dSErich Keane
13fa67986dSErich Keane int GlobalInt;
14fa67986dSErich Keane float GlobalArray[5];
15fa67986dSErich Keane char *GlobalPointer;
16fa67986dSErich Keane Complete GlobalComposite;
17fa67986dSErich Keane
uses(int IntParam,char * PointerParam,float ArrayParam[5],Complete CompositeParam,int & IntParamRef)18fa67986dSErich Keane void uses(int IntParam, char *PointerParam, float ArrayParam[5], Complete CompositeParam, int &IntParamRef) {
19fa67986dSErich Keane int LocalInt;
20fa67986dSErich Keane char *LocalPointer;
21fa67986dSErich Keane float LocalArray[5];
22fa67986dSErich Keane Complete LocalComposite;
23fa67986dSErich Keane
24fa67986dSErich Keane // Check Appertainment:
25fa67986dSErich Keane
26fa67986dSErich Keane #pragma acc parallel private(LocalInt)
27fa67986dSErich Keane while(true);
28fa67986dSErich Keane #pragma acc serial private(LocalInt)
29fa67986dSErich Keane while(true);
30fa67986dSErich Keane // expected-error@+1{{OpenACC 'private' clause is not valid on 'kernels' directive}}
31fa67986dSErich Keane #pragma acc kernels private(LocalInt)
32fa67986dSErich Keane while(true);
33fa67986dSErich Keane
34fa67986dSErich Keane // Valid cases:
35fa67986dSErich Keane #pragma acc parallel private(LocalInt, LocalPointer, LocalArray)
36fa67986dSErich Keane while(true);
37fa67986dSErich Keane #pragma acc parallel private(LocalArray)
38fa67986dSErich Keane while(true);
39fa67986dSErich Keane #pragma acc parallel private(LocalArray[2])
40fa67986dSErich Keane while(true);
41fa67986dSErich Keane #pragma acc parallel private(LocalComposite)
42fa67986dSErich Keane while(true);
43fa67986dSErich Keane #pragma acc parallel private(LocalComposite.EnumMember)
44fa67986dSErich Keane while(true);
45fa67986dSErich Keane #pragma acc parallel private(LocalComposite.ScalarMember)
46fa67986dSErich Keane while(true);
47fa67986dSErich Keane #pragma acc parallel private(LocalComposite.ArrayMember)
48fa67986dSErich Keane while(true);
49fa67986dSErich Keane #pragma acc parallel private(LocalComposite.ArrayMember[5])
50fa67986dSErich Keane while(true);
51fa67986dSErich Keane #pragma acc parallel private(LocalComposite.PointerMember)
52fa67986dSErich Keane while(true);
53fa67986dSErich Keane #pragma acc parallel private(GlobalInt, GlobalArray, GlobalPointer, GlobalComposite)
54fa67986dSErich Keane while(true);
55fa67986dSErich Keane #pragma acc parallel private(GlobalArray[2], GlobalPointer[2], GlobalComposite.CompositeMember.A)
56fa67986dSErich Keane while(true);
57fa67986dSErich Keane #pragma acc parallel private(LocalComposite, GlobalComposite)
58fa67986dSErich Keane while(true);
59fa67986dSErich Keane #pragma acc parallel private(IntParam, PointerParam, ArrayParam, CompositeParam) private(IntParamRef)
60fa67986dSErich Keane while(true);
61fa67986dSErich Keane #pragma acc parallel private(PointerParam[IntParam], ArrayParam[IntParam], CompositeParam.CompositeMember.A)
62fa67986dSErich Keane while(true);
63fa67986dSErich Keane
64fa67986dSErich Keane
65fa67986dSErich Keane // Invalid cases, arbitrary expressions.
66fa67986dSErich Keane Incomplete *I;
67*a15b685cSErich Keane // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
68fa67986dSErich Keane #pragma acc parallel private(*I)
69fa67986dSErich Keane while(true);
70*a15b685cSErich Keane // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
71fa67986dSErich Keane #pragma acc parallel private(GlobalInt + IntParam)
72fa67986dSErich Keane while(true);
73*a15b685cSErich Keane // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
74fa67986dSErich Keane #pragma acc parallel private(+GlobalInt)
75fa67986dSErich Keane while(true);
76fa67986dSErich Keane }
77fa67986dSErich Keane
78fa67986dSErich Keane template<typename T, unsigned I, typename V>
TemplUses(T t,T (& arrayT)[I],V TemplComp)79fa67986dSErich Keane void TemplUses(T t, T (&arrayT)[I], V TemplComp) {
80*a15b685cSErich Keane // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
81fa67986dSErich Keane #pragma acc parallel private(+t)
82fa67986dSErich Keane while(true);
83fa67986dSErich Keane
84*a15b685cSErich Keane // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
85fa67986dSErich Keane #pragma acc parallel private(+I)
86fa67986dSErich Keane while(true);
87fa67986dSErich Keane
88fa67986dSErich Keane // NTTP's are only valid if it is a reference to something.
89*a15b685cSErich Keane // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
90fa67986dSErich Keane // expected-note@#TEMPL_USES_INST{{in instantiation of}}
91fa67986dSErich Keane #pragma acc parallel private(I)
92fa67986dSErich Keane while(true);
93fa67986dSErich Keane
94*a15b685cSErich Keane // expected-error@+1{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
95fa67986dSErich Keane #pragma acc parallel private(t, I)
96fa67986dSErich Keane while(true);
97fa67986dSErich Keane
98fa67986dSErich Keane #pragma acc parallel private(arrayT)
99fa67986dSErich Keane while(true);
100fa67986dSErich Keane
101fa67986dSErich Keane #pragma acc parallel private(TemplComp)
102fa67986dSErich Keane while(true);
103fa67986dSErich Keane
104fa67986dSErich Keane #pragma acc parallel private(TemplComp.PointerMember[5])
105fa67986dSErich Keane while(true);
106fa67986dSErich Keane
107fa67986dSErich Keane #pragma acc parallel private(TemplComp.PointerMember[5]) private(TemplComp)
108fa67986dSErich Keane while(true);
109fa67986dSErich Keane
110fa67986dSErich Keane int *Pointer;
111fa67986dSErich Keane #pragma acc parallel private(Pointer[:I])
112fa67986dSErich Keane while(true);
113fa67986dSErich Keane #pragma acc parallel private(Pointer[:t])
114fa67986dSErich Keane while(true);
115c1298878SErich Keane // expected-error@+1{{OpenACC sub-array length is unspecified and cannot be inferred because the subscripted value is not an array}}
116fa67986dSErich Keane #pragma acc parallel private(Pointer[1:])
117fa67986dSErich Keane while(true);
118fa67986dSErich Keane }
119fa67986dSErich Keane
120fa67986dSErich Keane template<unsigned I, auto &NTTP_REF>
NTTP()121fa67986dSErich Keane void NTTP() {
122fa67986dSErich Keane // NTTP's are only valid if it is a reference to something.
123*a15b685cSErich Keane // expected-error@+2{{OpenACC variable is not a valid variable name, sub-array, array element, member of a composite variable, or composite variable member}}
124fa67986dSErich Keane // expected-note@#NTTP_INST{{in instantiation of}}
125fa67986dSErich Keane #pragma acc parallel private(I)
126fa67986dSErich Keane while(true);
127fa67986dSErich Keane
128fa67986dSErich Keane #pragma acc parallel private(NTTP_REF)
129fa67986dSErich Keane while(true);
130fa67986dSErich Keane }
131fa67986dSErich Keane
132fa67986dSErich Keane struct S {
133fa67986dSErich Keane int ThisMember;
134fa67986dSErich Keane int ThisMemberArray[5];
135fa67986dSErich Keane
136fa67986dSErich Keane void foo();
137fa67986dSErich Keane };
138fa67986dSErich Keane
foo()139fa67986dSErich Keane void S::foo() {
140fa67986dSErich Keane #pragma acc parallel private(ThisMember, this->ThisMemberArray[1])
141fa67986dSErich Keane while(true);
142fa67986dSErich Keane
143fa67986dSErich Keane #pragma acc parallel private(ThisMemberArray[1:2])
144fa67986dSErich Keane while(true);
145fa67986dSErich Keane
146fa67986dSErich Keane #pragma acc parallel private(this)
147fa67986dSErich Keane while(true);
148fa67986dSErich Keane
149fa67986dSErich Keane #pragma acc parallel private(ThisMember, this->ThisMember)
150fa67986dSErich Keane while(true);
151fa67986dSErich Keane }
152fa67986dSErich Keane
Inst()153fa67986dSErich Keane void Inst() {
154fa67986dSErich Keane static constexpr int NTTP_REFed = 1;
155fa67986dSErich Keane int i;
156fa67986dSErich Keane int Arr[5];
157fa67986dSErich Keane Complete C;
158fa67986dSErich Keane TemplUses(i, Arr, C); // #TEMPL_USES_INST
159fa67986dSErich Keane NTTP<5, NTTP_REFed>(); // #NTTP_INST
160fa67986dSErich Keane }
161