xref: /llvm-project/clang/test/SemaOpenACC/compute-construct-varlist-ast.cpp (revision 7577284c4f3cb81a8ac648683bd3af292827391f)
1054f7c05Serichkeane // RUN: %clang_cc1 %s -fopenacc -Wno-openacc-deprecated-clause-alias -ast-dump | FileCheck %s
2fa67986dSErich Keane 
3*7577284cSerichkeane // Test this with PCH.
4*7577284cSerichkeane // RUN: %clang_cc1 %s -fopenacc -emit-pch -Wno-openacc-deprecated-clause-alias -o %t %s
5*7577284cSerichkeane // RUN: %clang_cc1 %s -fopenacc -include-pch %t -Wno-openacc-deprecated-clause-alias -ast-dump-all | FileCheck %s
6*7577284cSerichkeane 
7*7577284cSerichkeane #ifndef PCH_HELPER
8*7577284cSerichkeane #define PCH_HELPER
9*7577284cSerichkeane 
10fa67986dSErich Keane int Global;
11fa67986dSErich Keane short GlobalArray[5];
12fa67986dSErich Keane 
13fa67986dSErich Keane void NormalUses(float *PointerParam) {
14fa67986dSErich Keane   // CHECK: FunctionDecl{{.*}}NormalUses
15fa67986dSErich Keane   // CHECK: ParmVarDecl
16fa67986dSErich Keane   // CHECK-NEXT: CompoundStmt
17fa67986dSErich Keane 
18fa67986dSErich Keane #pragma acc parallel private(Global, GlobalArray[2])
19fa67986dSErich Keane   while(true);
20fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
21fa67986dSErich Keane   // CHECK-NEXT: private clause
22fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
23fa67986dSErich Keane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'short' lvalue
24fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'short *' <ArrayToPointerDecay>
25fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
26fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 2
27fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
28fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
29fa67986dSErich Keane   // CHECK-NEXT: NullStmt
30fa67986dSErich Keane 
31fa67986dSErich Keane #pragma acc parallel private(GlobalArray, PointerParam[Global])
32fa67986dSErich Keane   while(true);
33fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
34fa67986dSErich Keane   // CHECK-NEXT: private clause
35fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
36fa67986dSErich Keane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
37fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
38fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
39fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
40fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
41fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
42fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
43fa67986dSErich Keane   // CHECK-NEXT: NullStmt
44fa67986dSErich Keane 
45a13c5140Serichkeane #pragma acc parallel firstprivate(GlobalArray, PointerParam[Global])
46a13c5140Serichkeane   while(true);
47a13c5140Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
48a13c5140Serichkeane   // CHECK-NEXT: firstprivate clause
49a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
50a13c5140Serichkeane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
51a13c5140Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
52a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
53a13c5140Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
54a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
55a13c5140Serichkeane   // CHECK-NEXT: WhileStmt
56a13c5140Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
57a13c5140Serichkeane   // CHECK-NEXT: NullStmt
58a13c5140Serichkeane 
59bd909d2eSerichkeane #pragma acc parallel present(GlobalArray, PointerParam[Global])
60bd909d2eSerichkeane   while(true);
61bd909d2eSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
62bd909d2eSerichkeane   // CHECK-NEXT: present clause
63bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
64bd909d2eSerichkeane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
65bd909d2eSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
66bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
67bd909d2eSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
68bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
69bd909d2eSerichkeane   // CHECK-NEXT: WhileStmt
70bd909d2eSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
71bd909d2eSerichkeane   // CHECK-NEXT: NullStmt
72bd909d2eSerichkeane 
73bd909d2eSerichkeane #pragma acc parallel no_create(GlobalArray, PointerParam[Global])
74bd909d2eSerichkeane   while(true);
75bd909d2eSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
76bd909d2eSerichkeane   // CHECK-NEXT: no_create clause
77bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
78bd909d2eSerichkeane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
79bd909d2eSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
80bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
81bd909d2eSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
82bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
83bd909d2eSerichkeane   // CHECK-NEXT: WhileStmt
84bd909d2eSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
85bd909d2eSerichkeane   // CHECK-NEXT: NullStmt
86bd909d2eSerichkeane 
87fa67986dSErich Keane #pragma acc parallel private(GlobalArray) private(PointerParam[Global])
88fa67986dSErich Keane   while(true);
89fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
90fa67986dSErich Keane   // CHECK-NEXT: private clause
91fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
92fa67986dSErich Keane   // CHECK-NEXT: private clause
93fa67986dSErich Keane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
94fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
95fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
96fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
97fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
98fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
99fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
100fa67986dSErich Keane   // CHECK-NEXT: NullStmt
101fa67986dSErich Keane 
102054f7c05Serichkeane #pragma acc parallel copy(GlobalArray) pcopy(PointerParam[Global]) present_or_copy(Global)
103054f7c05Serichkeane   while(true);
104054f7c05Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
105054f7c05Serichkeane   // CHECK-NEXT: copy clause
106054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
107054f7c05Serichkeane   // CHECK-NEXT: pcopy clause
108054f7c05Serichkeane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
109054f7c05Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
110054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
111054f7c05Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
112054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
113054f7c05Serichkeane   // CHECK-NEXT: present_or_copy clause
114054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
115054f7c05Serichkeane   // CHECK-NEXT: WhileStmt
116054f7c05Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
117054f7c05Serichkeane   // CHECK-NEXT: NullStmt
118054f7c05Serichkeane 
11901e91a2dSerichkeane #pragma acc parallel copyin(GlobalArray) pcopyin(readonly: PointerParam[Global]) present_or_copyin(Global)
12001e91a2dSerichkeane   while(true);
12101e91a2dSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
12201e91a2dSerichkeane   // CHECK-NEXT: copyin clause
12301e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
12401e91a2dSerichkeane   // CHECK-NEXT: pcopyin clause : readonly
12501e91a2dSerichkeane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
12601e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
12701e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
12801e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
12901e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
13001e91a2dSerichkeane   // CHECK-NEXT: present_or_copyin clause
13101e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
13201e91a2dSerichkeane   // CHECK-NEXT: WhileStmt
13301e91a2dSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
13401e91a2dSerichkeane   // CHECK-NEXT: NullStmt
13501e91a2dSerichkeane 
13601e91a2dSerichkeane #pragma acc parallel copyout(GlobalArray) pcopyout(zero:PointerParam[Global]) present_or_copyout(Global)
13701e91a2dSerichkeane   while(true);
13801e91a2dSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
13901e91a2dSerichkeane   // CHECK-NEXT: copyout clause
14001e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
14101e91a2dSerichkeane   // CHECK-NEXT: pcopyout clause : zero
14201e91a2dSerichkeane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
14301e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
14401e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
14501e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
14601e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
14701e91a2dSerichkeane   // CHECK-NEXT: present_or_copyout clause
14801e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
14901e91a2dSerichkeane   // CHECK-NEXT: WhileStmt
15001e91a2dSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
15101e91a2dSerichkeane   // CHECK-NEXT: NullStmt
15201e91a2dSerichkeane 
15301e91a2dSerichkeane #pragma acc parallel create(GlobalArray) pcreate(zero:PointerParam[Global]) present_or_create(Global)
15401e91a2dSerichkeane   while(true);
15501e91a2dSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
15601e91a2dSerichkeane   // CHECK-NEXT: create clause
15701e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
15801e91a2dSerichkeane   // CHECK-NEXT: pcreate clause : zero
15901e91a2dSerichkeane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'float' lvalue
16001e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
16101e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}}'PointerParam' 'float *'
16201e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
16301e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
16401e91a2dSerichkeane   // CHECK-NEXT: present_or_create clause
16501e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
16601e91a2dSerichkeane   // CHECK-NEXT: WhileStmt
16701e91a2dSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
16801e91a2dSerichkeane   // CHECK-NEXT: NullStmt
16901e91a2dSerichkeane 
170fa67986dSErich Keane #pragma acc parallel private(GlobalArray, PointerParam[Global : Global])
171fa67986dSErich Keane   while(true);
172fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
173fa67986dSErich Keane   // CHECK-NEXT: private clause
174fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
175fa67986dSErich Keane   // CHECK-NEXT: ArraySectionExpr
176c1298878SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
177fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}} 'PointerParam' 'float *'
178c1298878SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
179fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
180c1298878SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
181fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
182fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
183fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
184fa67986dSErich Keane   // CHECK-NEXT: NullStmt
185a13c5140Serichkeane 
186a13c5140Serichkeane #pragma acc parallel firstprivate(GlobalArray, PointerParam[Global : Global])
187a13c5140Serichkeane   while(true);
188a13c5140Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
189a13c5140Serichkeane   // CHECK-NEXT: firstprivate clause
190a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
191a13c5140Serichkeane   // CHECK-NEXT: ArraySectionExpr
192a13c5140Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float *' <LValueToRValue>
193a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}} 'PointerParam' 'float *'
194a13c5140Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
195a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
196a13c5140Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
197a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
198a13c5140Serichkeane   // CHECK-NEXT: WhileStmt
199a13c5140Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
200a13c5140Serichkeane   // CHECK-NEXT: NullStmt
20148c8a579Serichkeane 
20248c8a579Serichkeane #pragma acc parallel attach(PointerParam) deviceptr(PointerParam)
20348c8a579Serichkeane   while (true);
20448c8a579Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
20548c8a579Serichkeane   // CHECK-NEXT: attach clause
20648c8a579Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}} 'PointerParam' 'float *'
20748c8a579Serichkeane   // CHECK-NEXT: deviceptr clause
20848c8a579Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'float *' lvalue ParmVar{{.*}} 'PointerParam' 'float *'
20948c8a579Serichkeane   // CHECK-NEXT: WhileStmt
21048c8a579Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
21148c8a579Serichkeane   // CHECK-NEXT: NullStmt
212fa67986dSErich Keane }
213fa67986dSErich Keane 
214fa67986dSErich Keane // This example is an error typically, but we want to make sure we're properly
215fa67986dSErich Keane // capturing NTTPs until instantiation time.
216fa67986dSErich Keane template<unsigned I>
217fa67986dSErich Keane void UnInstTempl() {
218fa67986dSErich Keane   // CHECK-NEXT: FunctionTemplateDecl{{.*}} UnInstTempl
219fa67986dSErich Keane   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}}referenced 'unsigned int' depth 0 index 0 I
220fa67986dSErich Keane   // CHECK-NEXT: FunctionDecl{{.*}} UnInstTempl 'void ()'
221fa67986dSErich Keane   // CHECK-NEXT: CompoundStmt
222fa67986dSErich Keane #pragma acc parallel private(I)
223fa67986dSErich Keane   while(true);
224fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
225fa67986dSErich Keane   // CHECK-NEXT: private clause
226fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'unsigned int' NonTypeTemplateParm{{.*}}'I' 'unsigned int'
227fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
228fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
229fa67986dSErich Keane   // CHECK-NEXT: NullStmt
230a13c5140Serichkeane #pragma acc parallel firstprivate(I)
231a13c5140Serichkeane   while(true);
232a13c5140Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
233a13c5140Serichkeane   // CHECK-NEXT: firstprivate clause
234a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'unsigned int' NonTypeTemplateParm{{.*}}'I' 'unsigned int'
235a13c5140Serichkeane   // CHECK-NEXT: WhileStmt
236a13c5140Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
237a13c5140Serichkeane   // CHECK-NEXT: NullStmt
238fa67986dSErich Keane }
239fa67986dSErich Keane 
240fa67986dSErich Keane template<auto &NTTP, typename T, typename U>
241fa67986dSErich Keane void TemplUses(T t, U u, T*PointerParam) {
242fa67986dSErich Keane   // CHECK-NEXT: FunctionTemplateDecl
243fa67986dSErich Keane   // CHECK-NEXT: NonTypeTemplateParmDecl {{.*}}referenced 'auto &' depth 0 index 0 NTTP
244fa67986dSErich Keane   // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 T
245fa67986dSErich Keane   // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 2 U
246fa67986dSErich Keane   // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U, T *)'
247fa67986dSErich Keane   // CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'
248fa67986dSErich Keane   // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'
249fa67986dSErich Keane   // CHECK-NEXT: ParmVarDecl{{.*}} referenced PointerParam 'T *'
250fa67986dSErich Keane   // CHECK-NEXT: CompoundStmt
251fa67986dSErich Keane 
252fa67986dSErich Keane 
253fa67986dSErich Keane #pragma acc parallel private(GlobalArray, PointerParam[Global])
254fa67986dSErich Keane   while(true);
255fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
256fa67986dSErich Keane   // CHECK-NEXT: private clause
257fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
258fa67986dSErich Keane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'T' lvalue
259fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'T *' lvalue ParmVar{{.*}}'PointerParam' 'T *'
260fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
261fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
262fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
263fa67986dSErich Keane   // CHECK-NEXT: NullStmt
264fa67986dSErich Keane 
265fa67986dSErich Keane #pragma acc parallel private(t, u)
266fa67986dSErich Keane   while(true);
267fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
268fa67986dSErich Keane   // CHECK-NEXT: private clause
269fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
270fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
271fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
272fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
273fa67986dSErich Keane   // CHECK-NEXT: NullStmt
274fa67986dSErich Keane 
275a13c5140Serichkeane #pragma acc parallel firstprivate(t, u)
276a13c5140Serichkeane   while(true);
277a13c5140Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
278a13c5140Serichkeane   // CHECK-NEXT: firstprivate clause
279a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
280a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
281a13c5140Serichkeane   // CHECK-NEXT: WhileStmt
282a13c5140Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
283a13c5140Serichkeane   // CHECK-NEXT: NullStmt
284a13c5140Serichkeane 
285fa67986dSErich Keane #pragma acc parallel private(t) private(u)
286fa67986dSErich Keane   while(true);
287fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
288fa67986dSErich Keane   // CHECK-NEXT: private clause
289fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
290fa67986dSErich Keane   // CHECK-NEXT: private clause
291fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
292fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
293fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
294fa67986dSErich Keane   // CHECK-NEXT: NullStmt
295fa67986dSErich Keane 
296fa67986dSErich Keane #pragma acc parallel private(t) private(NTTP, u)
297fa67986dSErich Keane   while(true);
298fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
299fa67986dSErich Keane   // CHECK-NEXT: private clause
300fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
301fa67986dSErich Keane   // CHECK-NEXT: private clause
302fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
303fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
304fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
305fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
306fa67986dSErich Keane   // CHECK-NEXT: NullStmt
307fa67986dSErich Keane 
308a13c5140Serichkeane #pragma acc parallel private(t) firstprivate(NTTP, u)
309a13c5140Serichkeane   while(true);
310a13c5140Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
311a13c5140Serichkeane   // CHECK-NEXT: private clause
312a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
313a13c5140Serichkeane   // CHECK-NEXT: firstprivate clause
314a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
315a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
316a13c5140Serichkeane   // CHECK-NEXT: WhileStmt
317a13c5140Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
318a13c5140Serichkeane   // CHECK-NEXT: NullStmt
319a13c5140Serichkeane 
320bd909d2eSerichkeane #pragma acc parallel no_create(t) present(NTTP, u)
321bd909d2eSerichkeane   while(true);
322bd909d2eSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
323bd909d2eSerichkeane   // CHECK-NEXT: no_create clause
324bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
325bd909d2eSerichkeane   // CHECK-NEXT: present clause
326bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
327bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
328bd909d2eSerichkeane   // CHECK-NEXT: WhileStmt
329bd909d2eSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
330bd909d2eSerichkeane   // CHECK-NEXT: NullStmt
331bd909d2eSerichkeane 
332054f7c05Serichkeane #pragma acc parallel copy(t) pcopy(NTTP, u) present_or_copy(u[0:t])
333054f7c05Serichkeane   while(true);
334054f7c05Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
335054f7c05Serichkeane   // CHECK-NEXT: copy clause
336054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
337054f7c05Serichkeane   // CHECK-NEXT: pcopy clause
338054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
339054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
340054f7c05Serichkeane   // CHECK-NEXT: present_or_copy clause
341054f7c05Serichkeane   // CHECK-NEXT: ArraySectionExpr
342054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
343054f7c05Serichkeane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
344054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
345054f7c05Serichkeane   // CHECK-NEXT: WhileStmt
346054f7c05Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
347054f7c05Serichkeane   // CHECK-NEXT: NullStmt
348054f7c05Serichkeane 
34901e91a2dSerichkeane #pragma acc parallel copyin(t) pcopyin(readonly:NTTP, u) present_or_copyin(u[0:t])
35001e91a2dSerichkeane   while(true);
35101e91a2dSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
35201e91a2dSerichkeane   // CHECK-NEXT: copyin clause
35301e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
35401e91a2dSerichkeane   // CHECK-NEXT: pcopyin clause : readonly
35501e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
35601e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
35701e91a2dSerichkeane   // CHECK-NEXT: present_or_copyin clause
35801e91a2dSerichkeane   // CHECK-NEXT: ArraySectionExpr
35901e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
36001e91a2dSerichkeane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
36101e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
36201e91a2dSerichkeane   // CHECK-NEXT: WhileStmt
36301e91a2dSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
36401e91a2dSerichkeane   // CHECK-NEXT: NullStmt
36501e91a2dSerichkeane 
36601e91a2dSerichkeane #pragma acc parallel copyout(t) pcopyout(zero:NTTP, u) present_or_copyout(u[0:t])
36701e91a2dSerichkeane   while(true);
36801e91a2dSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
36901e91a2dSerichkeane   // CHECK-NEXT: copyout clause
37001e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
37101e91a2dSerichkeane   // CHECK-NEXT: pcopyout clause : zero
37201e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
37301e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
37401e91a2dSerichkeane   // CHECK-NEXT: present_or_copyout clause
37501e91a2dSerichkeane   // CHECK-NEXT: ArraySectionExpr
37601e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
37701e91a2dSerichkeane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
37801e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
37901e91a2dSerichkeane   // CHECK-NEXT: WhileStmt
38001e91a2dSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
38101e91a2dSerichkeane   // CHECK-NEXT: NullStmt
38201e91a2dSerichkeane 
38301e91a2dSerichkeane #pragma acc parallel create(t) pcreate(zero: NTTP, u) present_or_create(u[0:t])
38401e91a2dSerichkeane   while(true);
38501e91a2dSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
38601e91a2dSerichkeane   // CHECK-NEXT: create clause
38701e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
38801e91a2dSerichkeane   // CHECK-NEXT: pcreate clause : zero
38901e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'auto' lvalue NonTypeTemplateParm{{.*}} 'NTTP' 'auto &'
39001e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
39101e91a2dSerichkeane   // CHECK-NEXT: present_or_create clause
39201e91a2dSerichkeane   // CHECK-NEXT: ArraySectionExpr
39301e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
39401e91a2dSerichkeane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
39501e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
39601e91a2dSerichkeane   // CHECK-NEXT: WhileStmt
39701e91a2dSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
39801e91a2dSerichkeane   // CHECK-NEXT: NullStmt
39901e91a2dSerichkeane 
400fa67986dSErich Keane #pragma acc parallel private(u[0])
401fa67986dSErich Keane   while(true);
402fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
403fa67986dSErich Keane   // CHECK-NEXT: private clause
404fa67986dSErich Keane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'<dependent type>' lvalue
405fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
406fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
407fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
408fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
409fa67986dSErich Keane   // CHECK-NEXT: NullStmt
410fa67986dSErich Keane 
411fa67986dSErich Keane #pragma acc parallel private(u[0:t])
412fa67986dSErich Keane   while(true);
413fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
414fa67986dSErich Keane   // CHECK-NEXT: private clause
415fa67986dSErich Keane   // CHECK-NEXT: ArraySectionExpr
416fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'U' lvalue ParmVar{{.*}} 'u' 'U'
417fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
418fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'T' lvalue ParmVar{{.*}} 't' 'T'
419fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
420fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
421fa67986dSErich Keane   // CHECK-NEXT: NullStmt
422fa67986dSErich Keane 
42348c8a579Serichkeane #pragma acc parallel attach(PointerParam) deviceptr(PointerParam)
42448c8a579Serichkeane   while (true);
42548c8a579Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
42648c8a579Serichkeane   // CHECK-NEXT: attach clause
42748c8a579Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T *' lvalue ParmVar{{.*}} 'PointerParam' 'T *'
42848c8a579Serichkeane   // CHECK-NEXT: deviceptr clause
42948c8a579Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'T *' lvalue ParmVar{{.*}} 'PointerParam' 'T *'
43048c8a579Serichkeane   // CHECK-NEXT: WhileStmt
43148c8a579Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
43248c8a579Serichkeane   // CHECK-NEXT: NullStmt
43348c8a579Serichkeane 
434fa67986dSErich Keane   // CHECK-NEXT: DeclStmt
435fa67986dSErich Keane   // CHECK-NEXT: VarDecl{{.*}}EndMarker
436fa67986dSErich Keane   int EndMarker;
437fa67986dSErich Keane 
438fa67986dSErich Keane   // Check the instantiated versions of the above.
439fa67986dSErich Keane   // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (int, int *, int *)' implicit_instantiation
440fa67986dSErich Keane   // CHECK-NEXT: TemplateArgument decl
441fa67986dSErich Keane   // CHECK-NEXT: Var{{.*}} 'CEVar' 'const unsigned int'
442fa67986dSErich Keane   // CHECK-NEXT: TemplateArgument type 'int'
443fa67986dSErich Keane   // CHECK-NEXT: BuiltinType{{.*}} 'int'
444fa67986dSErich Keane   // CHECK-NEXT: TemplateArgument type 'int[1]'
445*7577284cSerichkeane   // CHECK-NEXT: ConstantArrayType{{.*}} 'int[1]'{{.*}} 1
446fa67986dSErich Keane   // CHECK-NEXT: BuiltinType{{.*}} 'int'
447fa67986dSErich Keane   // CHECK-NEXT: ParmVarDecl{{.*}} used t 'int'
448fa67986dSErich Keane   // CHECK-NEXT: ParmVarDecl{{.*}} used u 'int *'
449fa67986dSErich Keane   // CHECK-NEXT: ParmVarDecl{{.*}} used PointerParam 'int *'
450fa67986dSErich Keane   // CHECK-NEXT: CompoundStmt
451fa67986dSErich Keane 
452fa67986dSErich Keane // #pragma acc parallel private(GlobalArray, PointerParam[Global])
453fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
454fa67986dSErich Keane   // CHECK-NEXT: private clause
455fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'short[5]' lvalue Var{{.*}}'GlobalArray' 'short[5]'
456fa67986dSErich Keane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue
457fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
458fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}}'PointerParam' 'int *'
459fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
460fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue Var{{.*}}'Global' 'int'
461fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
462fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
463fa67986dSErich Keane   // CHECK-NEXT: NullStmt
464fa67986dSErich Keane 
465fa67986dSErich Keane // #pragma acc parallel private(t, u)
466fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
467fa67986dSErich Keane   // CHECK-NEXT: private clause
468fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
469fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
470fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
471fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
472fa67986dSErich Keane   // CHECK-NEXT: NullStmt
473fa67986dSErich Keane 
474a13c5140Serichkeane // #pragma acc parallel firstprivate(t, u)
475a13c5140Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
476a13c5140Serichkeane   // CHECK-NEXT: firstprivate clause
477a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
478a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
479a13c5140Serichkeane   // CHECK-NEXT: WhileStmt
480a13c5140Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
481a13c5140Serichkeane   // CHECK-NEXT: NullStmt
482a13c5140Serichkeane 
483fa67986dSErich Keane // #pragma acc parallel private(t) private(u)
484fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
485fa67986dSErich Keane   // CHECK-NEXT: private clause
486fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
487fa67986dSErich Keane   // CHECK-NEXT: private clause
488fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
489fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
490fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
491fa67986dSErich Keane   // CHECK-NEXT: NullStmt
492fa67986dSErich Keane 
493fa67986dSErich Keane // #pragma acc parallel private(t) private(NTTP, u)
494fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
495fa67986dSErich Keane   // CHECK-NEXT: private clause
496fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
497fa67986dSErich Keane   // CHECK-NEXT: private clause
498fa67986dSErich Keane   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
499fa67986dSErich Keane   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
500fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
501fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
502fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
503fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
504fa67986dSErich Keane   // CHECK-NEXT: NullStmt
505fa67986dSErich Keane 
506a13c5140Serichkeane // #pragma acc parallel private(t) firstprivate(NTTP, u)
507a13c5140Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
508a13c5140Serichkeane   // CHECK-NEXT: private clause
509a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
510a13c5140Serichkeane   // CHECK-NEXT: firstprivate clause
511a13c5140Serichkeane   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
512a13c5140Serichkeane   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
513a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
514a13c5140Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
515a13c5140Serichkeane   // CHECK-NEXT: WhileStmt
516a13c5140Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
517a13c5140Serichkeane   // CHECK-NEXT: NullStmt
518a13c5140Serichkeane 
519bd909d2eSerichkeane // #pragma acc parallel no_create(t) present(NTTP, u)
520bd909d2eSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
521bd909d2eSerichkeane   // CHECK-NEXT: no_create clause
522bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
523bd909d2eSerichkeane   // CHECK-NEXT: present clause
524bd909d2eSerichkeane   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
525bd909d2eSerichkeane   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
526bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
527bd909d2eSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
528bd909d2eSerichkeane   // CHECK-NEXT: WhileStmt
529bd909d2eSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
530bd909d2eSerichkeane   // CHECK-NEXT: NullStmt
531bd909d2eSerichkeane 
532054f7c05Serichkeane //#pragma acc parallel copy(t) pcopy(NTTP, u) copy_or_present(u[0:t])
533054f7c05Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
534054f7c05Serichkeane   // CHECK-NEXT: copy clause
535054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
536054f7c05Serichkeane   // CHECK-NEXT: pcopy clause
537054f7c05Serichkeane   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
538054f7c05Serichkeane   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
539054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
540054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
541054f7c05Serichkeane   // CHECK-NEXT: present_or_copy clause
542054f7c05Serichkeane   // CHECK-NEXT: ArraySectionExpr
543054f7c05Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
544054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
545054f7c05Serichkeane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
546054f7c05Serichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
547054f7c05Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
548054f7c05Serichkeane   // CHECK-NEXT: WhileStmt
549054f7c05Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
550054f7c05Serichkeane   // CHECK-NEXT: NullStmt
551054f7c05Serichkeane 
55201e91a2dSerichkeane //#pragma acc parallel copyin(t) pcopyin(readonly:NTTP, u) present_or_copyin(u[0:t])
55301e91a2dSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
55401e91a2dSerichkeane   // CHECK-NEXT: copyin clause
55501e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
55601e91a2dSerichkeane   // CHECK-NEXT: pcopyin clause : readonly
55701e91a2dSerichkeane   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
55801e91a2dSerichkeane   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
55901e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
56001e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
56101e91a2dSerichkeane   // CHECK-NEXT: present_or_copyin clause
56201e91a2dSerichkeane   // CHECK-NEXT: ArraySectionExpr
56301e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
56401e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
56501e91a2dSerichkeane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
56601e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
56701e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
56801e91a2dSerichkeane   // CHECK-NEXT: WhileStmt
56901e91a2dSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
57001e91a2dSerichkeane   // CHECK-NEXT: NullStmt
57101e91a2dSerichkeane 
57201e91a2dSerichkeane //#pragma acc parallel copyout(t) pcopyout(zero:NTTP, u) present_or_copyout(u[0:t])
57301e91a2dSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
57401e91a2dSerichkeane   // CHECK-NEXT: copyout clause
57501e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
57601e91a2dSerichkeane   // CHECK-NEXT: pcopyout clause : zero
57701e91a2dSerichkeane   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
57801e91a2dSerichkeane   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
57901e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
58001e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
58101e91a2dSerichkeane   // CHECK-NEXT: present_or_copyout clause
58201e91a2dSerichkeane   // CHECK-NEXT: ArraySectionExpr
58301e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
58401e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
58501e91a2dSerichkeane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
58601e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
58701e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
58801e91a2dSerichkeane   // CHECK-NEXT: WhileStmt
58901e91a2dSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
59001e91a2dSerichkeane   // CHECK-NEXT: NullStmt
59101e91a2dSerichkeane 
59201e91a2dSerichkeane //#pragma acc parallel create(t) pcreate(zero: NTTP, u) present_or_create(u[0:t])
59301e91a2dSerichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
59401e91a2dSerichkeane   // CHECK-NEXT: create clause
59501e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
59601e91a2dSerichkeane   // CHECK-NEXT: pcreate clause : zero
59701e91a2dSerichkeane   // CHECK-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'const unsigned int' lvalue
59801e91a2dSerichkeane   // CHECK-NEXT: NonTypeTemplateParmDecl{{.*}} referenced 'auto &' depth 0 index 0 NTTP
59901e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'const unsigned int' lvalue Var{{.*}} 'CEVar' 'const unsigned int'
60001e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
60101e91a2dSerichkeane   // CHECK-NEXT: present_or_create clause
60201e91a2dSerichkeane   // CHECK-NEXT: ArraySectionExpr
60301e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
60401e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
60501e91a2dSerichkeane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
60601e91a2dSerichkeane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
60701e91a2dSerichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
60801e91a2dSerichkeane   // CHECK-NEXT: WhileStmt
60901e91a2dSerichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
61001e91a2dSerichkeane   // CHECK-NEXT: NullStmt
61101e91a2dSerichkeane 
612fa67986dSErich Keane // #pragma acc parallel private(u[0])
613fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
614fa67986dSErich Keane   // CHECK-NEXT: private clause
615fa67986dSErich Keane   // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue
616fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
617fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
618fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
619fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
620fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
621fa67986dSErich Keane   // CHECK-NEXT: NullStmt
622fa67986dSErich Keane 
623fa67986dSErich Keane // #pragma acc parallel private(u[0:t])
624fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
625fa67986dSErich Keane   // CHECK-NEXT: private clause
626fa67986dSErich Keane   // CHECK-NEXT: ArraySectionExpr
627c1298878SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <LValueToRValue>
628fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'u' 'int *'
629fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0
630c1298878SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>
631fa67986dSErich Keane   // CHECK-NEXT: DeclRefExpr{{.*}}'int' lvalue ParmVar{{.*}} 't' 'int'
632fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
633fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
634fa67986dSErich Keane   // CHECK-NEXT: NullStmt
635fa67986dSErich Keane 
63648c8a579Serichkeane //#pragma acc parallel attach(PointerParam) deviceptr(PointerParam)
63748c8a579Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
63848c8a579Serichkeane   // CHECK-NEXT: attach clause
63948c8a579Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'PointerParam' 'int *'
64048c8a579Serichkeane   // CHECK-NEXT: deviceptr clause
64148c8a579Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}}'int *' lvalue ParmVar{{.*}} 'PointerParam' 'int *'
64248c8a579Serichkeane   // CHECK-NEXT: WhileStmt
64348c8a579Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
64448c8a579Serichkeane   // CHECK-NEXT: NullStmt
64548c8a579Serichkeane 
646fa67986dSErich Keane   // CHECK-NEXT: DeclStmt
647fa67986dSErich Keane   // CHECK-NEXT: VarDecl{{.*}}EndMarker
648fa67986dSErich Keane }
649fa67986dSErich Keane 
650fa67986dSErich Keane struct S {
651fa67986dSErich Keane   // CHECK-NEXT: CXXRecordDecl{{.*}} struct S definition
652fa67986dSErich Keane   // CHECK: CXXRecordDecl{{.*}} implicit struct S
653fa67986dSErich Keane   int ThisMember;
654fa67986dSErich Keane   // CHECK-NEXT: FieldDecl{{.*}} ThisMember 'int'
65548c8a579Serichkeane   int *ThisMemberPtr;
65648c8a579Serichkeane   // CHECK-NEXT: FieldDecl{{.*}} ThisMemberPtr 'int *'
657fa67986dSErich Keane   int ThisMemberArray[5];
658fa67986dSErich Keane   // CHECK-NEXT: FieldDecl{{.*}} ThisMemberArray 'int[5]'
659fa67986dSErich Keane 
660fa67986dSErich Keane   void foo();
661fa67986dSErich Keane   // CHECK-NEXT: CXXMethodDecl{{.*}} foo 'void ()'
662fa67986dSErich Keane 
663fa67986dSErich Keane   template<typename T>
66448c8a579Serichkeane   void bar(T *PointerParam) {
665fa67986dSErich Keane   // CHECK-NEXT: FunctionTemplateDecl{{.*}}bar
666fa67986dSErich Keane   // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 T
66748c8a579Serichkeane   // CHECK-NEXT: CXXMethodDecl{{.*}} bar 'void (T *)' implicit-inline
66848c8a579Serichkeane   // CHECK-NEXT: ParmVarDecl{{.*}} PointerParam 'T *'
669fa67986dSErich Keane   // CHECK-NEXT: CompoundStmt
670fa67986dSErich Keane 
671fa67986dSErich Keane #pragma acc parallel private(ThisMember, this->ThisMemberArray[1])
672fa67986dSErich Keane   while(true);
673fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
674fa67986dSErich Keane   // CHECK-NEXT: private clause
675fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int' lvalue ->ThisMember
676fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this
677fa67986dSErich Keane   // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'int' lvalue
678fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
679fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray
680fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
681fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
682fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
683fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
684fa67986dSErich Keane   // CHECK-NEXT: NullStmt
685fa67986dSErich Keane 
686fa67986dSErich Keane #pragma acc parallel private(ThisMemberArray[1:2])
687fa67986dSErich Keane   while(true);
688fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
689fa67986dSErich Keane   // CHECK-NEXT: private clause
690fa67986dSErich Keane   // CHECK-NEXT: ArraySectionExpr{{.*}}
691c1298878SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
692fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray
693fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this
694fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
695fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2
696fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
697fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
698fa67986dSErich Keane   // CHECK-NEXT: NullStmt
699fa67986dSErich Keane 
700fa67986dSErich Keane #pragma acc parallel private(this)
701fa67986dSErich Keane   while(true);
702fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
703fa67986dSErich Keane   // CHECK-NEXT: private clause
704fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
705fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
706fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
707fa67986dSErich Keane   // CHECK-NEXT: NullStmt
708fa67986dSErich Keane 
70948c8a579Serichkeane #pragma acc parallel attach(PointerParam, this, this->ThisMemberPtr) deviceptr(PointerParam, this, ThisMemberPtr)
71048c8a579Serichkeane   while (true);
71148c8a579Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
71248c8a579Serichkeane   // CHECK-NEXT: attach clause
71348c8a579Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'T *' lvalue ParmVar{{.*}} 'PointerParam' 'T *'
71448c8a579Serichkeane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
71548c8a579Serichkeane   // CHECK-NEXT: MemberExpr{{.*}} 'int *' lvalue ->ThisMemberPtr
71648c8a579Serichkeane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
71748c8a579Serichkeane   // CHECK-NEXT: deviceptr clause
71848c8a579Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'T *' lvalue ParmVar{{.*}} 'PointerParam' 'T *'
71948c8a579Serichkeane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
72048c8a579Serichkeane   // CHECK-NEXT: MemberExpr{{.*}} 'int *' lvalue ->ThisMemberPtr
72148c8a579Serichkeane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this
72248c8a579Serichkeane   // CHECK-NEXT: WhileStmt
72348c8a579Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
72448c8a579Serichkeane   // CHECK-NEXT: NullStmt
72548c8a579Serichkeane 
726fa67986dSErich Keane   // Check Instantiations:
72748c8a579Serichkeane   // CHECK-NEXT: CXXMethodDecl{{.*}} used bar 'void (int *)' implicit_instantiation implicit-inline
728fa67986dSErich Keane   // CHECK-NEXT: TemplateArgument type 'int'
729fa67986dSErich Keane   // CHECK-NEXT: BuiltinType{{.*}} 'int'
73048c8a579Serichkeane   // CHECK-NEXT: ParmVarDecl{{.*}} PointerParam 'int *'
731fa67986dSErich Keane   // CHECK-NEXT: CompoundStmt
732fa67986dSErich Keane 
733fa67986dSErich Keane // #pragma acc parallel private(ThisMember, this->ThisMemberArray[1])
734fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
735fa67986dSErich Keane   // CHECK-NEXT: private clause
736fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int' lvalue ->ThisMember
737fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this
738fa67986dSErich Keane   // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'int' lvalue
739fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
740fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray
741fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
742fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
743fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
744fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
745fa67986dSErich Keane   // CHECK-NEXT: NullStmt
746fa67986dSErich Keane 
747fa67986dSErich Keane // #pragma acc parallel private(ThisMemberArray[1:2])
748fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
749fa67986dSErich Keane   // CHECK-NEXT: private clause
750fa67986dSErich Keane   // CHECK-NEXT: ArraySectionExpr{{.*}}
751c1298878SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
752fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray
753fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this
754fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
755fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2
756fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
757fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
758fa67986dSErich Keane   // CHECK-NEXT: NullStmt
759fa67986dSErich Keane 
760fa67986dSErich Keane // #pragma acc parallel private(this)
761fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
762fa67986dSErich Keane   // CHECK-NEXT: private clause
763fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
764fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
765fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
766fa67986dSErich Keane   // CHECK-NEXT: NullStmt
76748c8a579Serichkeane 
76848c8a579Serichkeane //#pragma acc parallel attach(PointerParam, this, this->ThisMemberPtr) deviceptr(PointerParam, this, ThisMemberPtr)
76948c8a579Serichkeane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
77048c8a579Serichkeane   // CHECK-NEXT: attach clause
77148c8a579Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'int *' lvalue ParmVar{{.*}} 'PointerParam' 'int *'
77248c8a579Serichkeane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
77348c8a579Serichkeane   // CHECK-NEXT: MemberExpr{{.*}} 'int *' lvalue ->ThisMemberPtr
77448c8a579Serichkeane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
77548c8a579Serichkeane   // CHECK-NEXT: deviceptr clause
77648c8a579Serichkeane   // CHECK-NEXT: DeclRefExpr{{.*}} 'int *' lvalue ParmVar{{.*}} 'PointerParam' 'int *'
77748c8a579Serichkeane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
77848c8a579Serichkeane   // CHECK-NEXT: MemberExpr{{.*}} 'int *' lvalue ->ThisMemberPtr
77948c8a579Serichkeane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this
78048c8a579Serichkeane   // CHECK-NEXT: WhileStmt
78148c8a579Serichkeane   // CHECK-NEXT: CXXBoolLiteralExpr
78248c8a579Serichkeane   // CHECK-NEXT: NullStmt
783fa67986dSErich Keane }
784fa67986dSErich Keane };
785fa67986dSErich Keane 
786fa67986dSErich Keane void S::foo() {
787fa67986dSErich Keane   // CHECK: CXXMethodDecl{{.*}} foo 'void ()'
788fa67986dSErich Keane   // CHECK-NEXT: CompoundStmt
789fa67986dSErich Keane #pragma acc parallel private(ThisMember, this->ThisMemberArray[1])
790fa67986dSErich Keane   while(true);
791fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
792fa67986dSErich Keane   // CHECK-NEXT: private clause
793fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int' lvalue ->ThisMember
794fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this
795fa67986dSErich Keane   // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'int' lvalue
796fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
797fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray
798fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
799fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
800fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
801fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
802fa67986dSErich Keane   // CHECK-NEXT: NullStmt
803fa67986dSErich Keane 
804fa67986dSErich Keane #pragma acc parallel private(ThisMemberArray[1:2])
805fa67986dSErich Keane   while(true);
806fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
807fa67986dSErich Keane   // CHECK-NEXT: private clause
808fa67986dSErich Keane   // CHECK-NEXT: ArraySectionExpr{{.*}}
809c1298878SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
810fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray
811fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' implicit this
812fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
813fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2
814fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
815fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
816fa67986dSErich Keane   // CHECK-NEXT: NullStmt
817fa67986dSErich Keane 
818fa67986dSErich Keane #pragma acc parallel private(this)
819fa67986dSErich Keane   while(true);
820fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
821fa67986dSErich Keane   // CHECK-NEXT: private clause
822fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' this
823fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
824fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
825fa67986dSErich Keane   // CHECK-NEXT: NullStmt
826fa67986dSErich Keane }
827fa67986dSErich Keane 
828fa67986dSErich Keane template<typename U>
829fa67986dSErich Keane struct STempl {
830fa67986dSErich Keane   // CHECK-NEXT: ClassTemplateDecl{{.*}} STempl
831fa67986dSErich Keane   // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename depth 0 index 0 U
832fa67986dSErich Keane   // CHECK-NEXT: CXXRecordDecl{{.*}} struct STempl definition
833fa67986dSErich Keane   // CHECK: CXXRecordDecl{{.*}} implicit struct STempl
834fa67986dSErich Keane   U ThisMember;
835fa67986dSErich Keane   // CHECK-NEXT: FieldDecl{{.*}} ThisMember 'U'
836fa67986dSErich Keane   U ThisMemberArray[5];
837fa67986dSErich Keane   // CHECK-NEXT: FieldDecl{{.*}} ThisMemberArray 'U[5]'
838fa67986dSErich Keane 
839fa67986dSErich Keane   void foo() {
840fa67986dSErich Keane     // CHECK-NEXT: CXXMethodDecl {{.*}} foo 'void ()'
841fa67986dSErich Keane     // CHECK-NEXT: CompoundStmt
842fa67986dSErich Keane 
843fa67986dSErich Keane #pragma acc parallel private(ThisMember, this->ThisMemberArray[1])
844fa67986dSErich Keane   while(true);
845fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
846fa67986dSErich Keane   // CHECK-NEXT: private clause
847fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'U' lvalue ->ThisMember
848fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' implicit this
84941f9c78fSerichkeane   // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'U' lvalue
85041f9c78fSerichkeane   // CHECK-NEXT: MemberExpr{{.*}} 'U[5]' lvalue ->ThisMemberArray
851fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' this
852fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
853fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
854fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
855fa67986dSErich Keane   // CHECK-NEXT: NullStmt
856fa67986dSErich Keane 
857fa67986dSErich Keane #pragma acc parallel private(ThisMemberArray[1:2])
858fa67986dSErich Keane   while(true);
859fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
860fa67986dSErich Keane   // CHECK-NEXT: private clause
861fa67986dSErich Keane   // CHECK-NEXT: ArraySectionExpr{{.*}}
862fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'U[5]' lvalue ->ThisMemberArray
863fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' implicit this
864fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
865fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2
866fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
867fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
868fa67986dSErich Keane   // CHECK-NEXT: NullStmt
869fa67986dSErich Keane 
870fa67986dSErich Keane #pragma acc parallel private(this)
871fa67986dSErich Keane   while(true);
872fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
873fa67986dSErich Keane   // CHECK-NEXT: private clause
874fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' this
875fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
876fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
877fa67986dSErich Keane   // CHECK-NEXT: NullStmt
878fa67986dSErich Keane }
879fa67986dSErich Keane 
880fa67986dSErich Keane   template<typename T>
881fa67986dSErich Keane   void bar() {
882fa67986dSErich Keane   // CHECK-NEXT: FunctionTemplateDecl{{.*}} bar
883fa67986dSErich Keane   // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename depth 1 index 0 T
884fa67986dSErich Keane   // CHECK-NEXT: CXXMethodDecl{{.*}} bar 'void ()'
885fa67986dSErich Keane   // CHECK-NEXT: CompoundStmt
886fa67986dSErich Keane 
887fa67986dSErich Keane #pragma acc parallel private(ThisMember, this->ThisMemberArray[1])
888fa67986dSErich Keane   while(true);
889fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
890fa67986dSErich Keane   // CHECK-NEXT: private clause
891fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'U' lvalue ->ThisMember
892fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' implicit this
89341f9c78fSerichkeane   // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'U' lvalue
89441f9c78fSerichkeane   // CHECK-NEXT: MemberExpr{{.*}} 'U[5]' lvalue ->ThisMemberArray
895fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' this
896fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
897fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
898fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
899fa67986dSErich Keane   // CHECK-NEXT: NullStmt
900fa67986dSErich Keane 
901fa67986dSErich Keane #pragma acc parallel private(ThisMemberArray[1:2])
902fa67986dSErich Keane   while(true);
903fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
904fa67986dSErich Keane   // CHECK-NEXT: private clause
905fa67986dSErich Keane   // CHECK-NEXT: ArraySectionExpr{{.*}}
906fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'U[5]' lvalue ->ThisMemberArray
907fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' implicit this
908fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
909fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2
910fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
911fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
912fa67986dSErich Keane   // CHECK-NEXT: NullStmt
913fa67986dSErich Keane 
914fa67986dSErich Keane #pragma acc parallel private(this)
915fa67986dSErich Keane   while(true);
916fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
917fa67986dSErich Keane   // CHECK-NEXT: private clause
918fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<U> *' this
919fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
920fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
921fa67986dSErich Keane   // CHECK-NEXT: NullStmt
922fa67986dSErich Keane }
923fa67986dSErich Keane 
924fa67986dSErich Keane // Instantiation of the class template.
925fa67986dSErich Keane 
926fa67986dSErich Keane // CHECK-NEXT: ClassTemplateSpecializationDecl{{.*}}struct STempl
927fa67986dSErich Keane // CHECK: TemplateArgument type 'int'
928fa67986dSErich Keane // CHECK-NEXT: BuiltinType {{.*}}'int'
929fa67986dSErich Keane // CHECK-NEXT: CXXRecordDecl{{.*}} struct STempl
930fa67986dSErich Keane // CHECK-NEXT: FieldDecl{{.*}}ThisMember 'int'
931fa67986dSErich Keane // CHECK-NEXT: FieldDecl{{.*}} ThisMemberArray 'int[5]'
932fa67986dSErich Keane 
933fa67986dSErich Keane // CHECK-NEXT: CXXMethodDecl{{.*}} foo 'void ()'
934fa67986dSErich Keane // CHECK-NEXT: FunctionTemplateDecl{{.*}}bar
935fa67986dSErich Keane // CHECK-NEXT: TemplateTypeParmDecl{{.*}} typename depth 0 index 0 T
936fa67986dSErich Keane // CHECK-NEXT: CXXMethodDecl{{.*}}bar 'void ()'
937fa67986dSErich Keane // CHECK-NEXT: CXXMethodDecl{{.*}}bar 'void ()'
938fa67986dSErich Keane // CHECK-NEXT: TemplateArgument type 'int'
939fa67986dSErich Keane // CHECK-NEXT: BuiltinType{{.*}} 'int'
940fa67986dSErich Keane // CHECK-NEXT: CompoundStmt
941fa67986dSErich Keane 
942fa67986dSErich Keane //#pragma acc parallel private(ThisMember, this->ThisMemberArray[1])
943fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
944fa67986dSErich Keane   // CHECK-NEXT: private clause
945fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int' lvalue ->ThisMember
946fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<int> *' implicit this
947fa67986dSErich Keane   // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'int' lvalue
948fa67986dSErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
949fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray
950fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<int> *' this
951fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
952fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
953fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
954fa67986dSErich Keane   // CHECK-NEXT: NullStmt
955fa67986dSErich Keane 
956fa67986dSErich Keane //#pragma acc parallel private(ThisMemberArray[1:2])
957fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
958fa67986dSErich Keane   // CHECK-NEXT: private clause
959fa67986dSErich Keane   // CHECK-NEXT: ArraySectionExpr{{.*}}
960c1298878SErich Keane   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int *' <ArrayToPointerDecay>
961fa67986dSErich Keane   // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->ThisMemberArray
962fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<int> *' implicit this
963fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1
964fa67986dSErich Keane   // CHECK-NEXT: IntegerLiteral{{.*}}'int' 2
965fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
966fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
967fa67986dSErich Keane   // CHECK-NEXT: NullStmt
968fa67986dSErich Keane 
969fa67986dSErich Keane //#pragma acc parallel private(this)
970fa67986dSErich Keane   // CHECK-NEXT: OpenACCComputeConstruct{{.*}} parallel
971fa67986dSErich Keane   // CHECK-NEXT: private clause
972fa67986dSErich Keane   // CHECK-NEXT: CXXThisExpr{{.*}} 'STempl<int> *' this
973fa67986dSErich Keane   // CHECK-NEXT: WhileStmt
974fa67986dSErich Keane   // CHECK-NEXT: CXXBoolLiteralExpr
975fa67986dSErich Keane   // CHECK-NEXT: NullStmt
976fa67986dSErich Keane };
977fa67986dSErich Keane 
978fa67986dSErich Keane void Inst() {
979fa67986dSErich Keane   static constexpr unsigned CEVar = 1;
980fa67986dSErich Keane   int i;
981fa67986dSErich Keane   int Arr[5];
982fa67986dSErich Keane   TemplUses<CEVar, int, int[1]>({}, {}, &i);
983fa67986dSErich Keane 
984fa67986dSErich Keane   S s;
98548c8a579Serichkeane   s.bar<int>(&i);
986fa67986dSErich Keane   STempl<int> stempl;
987fa67986dSErich Keane   stempl.bar<int>();
988fa67986dSErich Keane }
989*7577284cSerichkeane #endif
990