1410f09afSMike Rice // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
2410f09afSMike Rice // RUN:   -fsyntax-only -verify %s
3410f09afSMike Rice 
4410f09afSMike Rice // expected-no-diagnostics
5410f09afSMike Rice 
6410f09afSMike Rice // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
7410f09afSMike Rice // RUN:   -ast-print %s | FileCheck %s --check-prefix=PRINT
8410f09afSMike Rice 
9410f09afSMike Rice // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
10410f09afSMike Rice // RUN:   -ast-dump  %s | FileCheck %s --check-prefix=DUMP
11410f09afSMike Rice 
12410f09afSMike Rice // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
13410f09afSMike Rice // RUN:   -emit-pch -o %t %s
14410f09afSMike Rice 
15410f09afSMike Rice // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
16410f09afSMike Rice // RUN:   -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP
17410f09afSMike Rice 
18410f09afSMike Rice // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
19410f09afSMike Rice // RUN:   -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT
20410f09afSMike Rice 
21410f09afSMike Rice #ifndef HEADER
22410f09afSMike Rice #define HEADER
23410f09afSMike Rice 
24410f09afSMike Rice typedef void *omp_interop_t;
25410f09afSMike Rice 
26410f09afSMike Rice //PRINT-LABEL: void foo1(
27410f09afSMike Rice //DUMP-LABEL:  FunctionDecl {{.*}} foo1
foo1(int * ap,int dev)28410f09afSMike Rice void foo1(int *ap, int dev) {
29410f09afSMike Rice   omp_interop_t I;
30410f09afSMike Rice   omp_interop_t &IRef = I;
31410f09afSMike Rice 
32410f09afSMike Rice   //PRINT: #pragma omp interop init(target : I)
33410f09afSMike Rice   //DUMP: OMPInteropDirective
34410f09afSMike Rice   //DUMP: OMPInitClause
35410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
36410f09afSMike Rice   #pragma omp interop init(target:I)
37410f09afSMike Rice 
38c615927cSMike Rice   //PRINT: #pragma omp interop use(I)
39c615927cSMike Rice   //DUMP: OMPInteropDirective
40c615927cSMike Rice   //DUMP: OMPUseClause
41c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
42c615927cSMike Rice   #pragma omp interop use(I)
43c615927cSMike Rice 
44*c2f8e158SMike Rice   //PRINT: #pragma omp interop destroy(I)
45*c2f8e158SMike Rice   //DUMP: OMPInteropDirective
46*c2f8e158SMike Rice   //DUMP: OMPDestroyClause
47*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
48*c2f8e158SMike Rice   #pragma omp interop destroy(I)
49*c2f8e158SMike Rice 
50410f09afSMike Rice   //PRINT: #pragma omp interop init(target : IRef)
51410f09afSMike Rice   //DUMP: OMPInteropDirective
52410f09afSMike Rice   //DUMP: OMPInitClause
53410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef'
54410f09afSMike Rice   #pragma omp interop init(target:IRef)
55410f09afSMike Rice 
56c615927cSMike Rice   //PRINT: #pragma omp interop use(IRef)
57c615927cSMike Rice   //DUMP: OMPInteropDirective
58c615927cSMike Rice   //DUMP: OMPUseClause
59c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef'
60c615927cSMike Rice   #pragma omp interop use(IRef)
61c615927cSMike Rice 
62*c2f8e158SMike Rice   //PRINT: #pragma omp interop destroy(IRef)
63*c2f8e158SMike Rice   //DUMP: OMPInteropDirective
64*c2f8e158SMike Rice   //DUMP: OMPDestroyClause
65*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef'
66*c2f8e158SMike Rice   #pragma omp interop destroy(IRef)
67*c2f8e158SMike Rice 
68c615927cSMike Rice   const omp_interop_t CI = (omp_interop_t)0;
69c615927cSMike Rice   //PRINT: #pragma omp interop use(CI)
70c615927cSMike Rice   //DUMP: OMPInteropDirective
71c615927cSMike Rice   //DUMP: OMPUseClause
72c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}'const omp_interop_t'{{.*}}Var{{.*}}'CI'
73c615927cSMike Rice   #pragma omp interop use(CI)
74c615927cSMike Rice 
75410f09afSMike Rice   //PRINT: #pragma omp interop device(dev) depend(inout : ap) init(targetsync : I)
76410f09afSMike Rice   //DUMP: OMPInteropDirective
77410f09afSMike Rice   //DUMP: OMPDeviceClause
78410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'dev' 'int'
79410f09afSMike Rice   //DUMP: OMPDependClause
80410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'ap' 'int *'
81410f09afSMike Rice   //DUMP: OMPInitClause
82410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
83410f09afSMike Rice   #pragma omp interop device(dev) depend(inout:ap) init(targetsync:I)
84410f09afSMike Rice 
85c615927cSMike Rice   //PRINT: #pragma omp interop device(dev) depend(inout : ap) use(I)
86c615927cSMike Rice   //DUMP: OMPInteropDirective
87c615927cSMike Rice   //DUMP: OMPDeviceClause
88c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}'dev' 'int'
89c615927cSMike Rice   //DUMP: OMPDependClause
90c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}'ap' 'int *'
91c615927cSMike Rice   //DUMP: OMPUseClause
92c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
93c615927cSMike Rice   #pragma omp interop device(dev) depend(inout:ap) use(I)
94c615927cSMike Rice 
95*c2f8e158SMike Rice   //PRINT: #pragma omp interop device(dev) depend(inout : ap) destroy(I)
96*c2f8e158SMike Rice   //DUMP: OMPInteropDirective
97*c2f8e158SMike Rice   //DUMP: OMPDeviceClause
98*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}'dev' 'int'
99*c2f8e158SMike Rice   //DUMP: OMPDependClause
100*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}'ap' 'int *'
101*c2f8e158SMike Rice   //DUMP: OMPDestroyClause
102*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
103*c2f8e158SMike Rice   #pragma omp interop device(dev) depend(inout:ap) destroy(I)
104*c2f8e158SMike Rice 
105410f09afSMike Rice   //PRINT: #pragma omp interop init(prefer_type(1,2,3,4,5,6), targetsync : I)
106410f09afSMike Rice   //DUMP: OMPInteropDirective
107410f09afSMike Rice   //DUMP: OMPInitClause
108410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
109410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}1
110410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}2
111410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}3
112410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}4
113410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}5
114410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}6
115410f09afSMike Rice   #pragma omp interop init(prefer_type(1,2,3,4,5,6),targetsync:I)
116410f09afSMike Rice 
117410f09afSMike Rice   //PRINT: #pragma omp interop init(prefer_type(2,4,6,1), targetsync : I)
118410f09afSMike Rice   //DUMP: OMPInteropDirective
119410f09afSMike Rice   //DUMP: OMPInitClause
120410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
121410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}2
122410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}4
123410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}6
124410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}1
125410f09afSMike Rice   #pragma omp interop init(prefer_type(2,4,6,1),targetsync:I)
126410f09afSMike Rice 
127410f09afSMike Rice   //PRINT: #pragma omp interop init(prefer_type("cuda","cuda_driver","opencl","sycl","hip","level_zero"), targetsync : I)
128410f09afSMike Rice   //DUMP: OMPInteropDirective
129410f09afSMike Rice   //DUMP: OMPInitClause
130410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
131410f09afSMike Rice   //DUMP: StringLiteral{{.*}}"cuda"
132410f09afSMike Rice   //DUMP: StringLiteral{{.*}}"cuda_driver"
133410f09afSMike Rice   //DUMP: StringLiteral{{.*}}"opencl"
134410f09afSMike Rice   //DUMP: StringLiteral{{.*}}"sycl"
135410f09afSMike Rice   //DUMP: StringLiteral{{.*}}"hip"
136410f09afSMike Rice   //DUMP: StringLiteral{{.*}}"level_zero"
137410f09afSMike Rice   #pragma omp interop init( \
138410f09afSMike Rice     prefer_type("cuda","cuda_driver","opencl","sycl","hip","level_zero"), \
139410f09afSMike Rice     targetsync:I)
140410f09afSMike Rice 
141410f09afSMike Rice   //PRINT: #pragma omp interop init(prefer_type("level_zero",2,4), targetsync : I)
142410f09afSMike Rice   //DUMP: OMPInteropDirective
143410f09afSMike Rice   //DUMP: OMPInitClause
144410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
145410f09afSMike Rice   //DUMP: StringLiteral{{.*}}"level_zero"
146410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}2
147410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}4
148410f09afSMike Rice   #pragma omp interop init(prefer_type("level_zero",2,4),targetsync:I)
149410f09afSMike Rice 
150410f09afSMike Rice   omp_interop_t J;
151410f09afSMike Rice 
152410f09afSMike Rice   //PRINT: #pragma omp interop init(target : I) init(targetsync : J)
153410f09afSMike Rice   //DUMP: OMPInteropDirective
154410f09afSMike Rice   //DUMP: OMPInitClause
155410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
156410f09afSMike Rice   //DUMP: OMPInitClause
157410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
158410f09afSMike Rice   #pragma omp interop init(target:I) init(targetsync:J)
159410f09afSMike Rice 
160c615927cSMike Rice   //PRINT: #pragma omp interop init(target : I) use(J)
161c615927cSMike Rice   //DUMP: OMPInteropDirective
162c615927cSMike Rice   //DUMP: OMPInitClause
163c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
164c615927cSMike Rice   //DUMP: OMPUseClause
165c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
166c615927cSMike Rice   #pragma omp interop init(target:I) use(J)
167c615927cSMike Rice 
168c615927cSMike Rice   //PRINT: #pragma omp interop use(I) use(J)
169c615927cSMike Rice   //DUMP: OMPInteropDirective
170c615927cSMike Rice   //DUMP: OMPUseClause
171c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
172c615927cSMike Rice   //DUMP: OMPUseClause
173c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
174c615927cSMike Rice   #pragma omp interop use(I) use(J)
175*c2f8e158SMike Rice 
176*c2f8e158SMike Rice   //PRINT: #pragma omp interop destroy(I) destroy(J)
177*c2f8e158SMike Rice   //DUMP: OMPInteropDirective
178*c2f8e158SMike Rice   //DUMP: OMPDestroyClause
179*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
180*c2f8e158SMike Rice   //DUMP: OMPDestroyClause
181*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
182*c2f8e158SMike Rice   #pragma omp interop destroy(I) destroy(J)
183*c2f8e158SMike Rice 
184*c2f8e158SMike Rice   //PRINT: #pragma omp interop init(target : I) destroy(J)
185*c2f8e158SMike Rice   //DUMP: OMPInteropDirective
186*c2f8e158SMike Rice   //DUMP: OMPInitClause
187*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
188*c2f8e158SMike Rice   //DUMP: OMPDestroyClause
189*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
190*c2f8e158SMike Rice   #pragma omp interop init(target:I) destroy(J)
191*c2f8e158SMike Rice 
192*c2f8e158SMike Rice   //PRINT: #pragma omp interop destroy(I) use(J)
193*c2f8e158SMike Rice   //DUMP: OMPInteropDirective
194*c2f8e158SMike Rice   //DUMP: OMPDestroyClause
195*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
196*c2f8e158SMike Rice   //DUMP: OMPUseClause
197*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
198*c2f8e158SMike Rice   #pragma omp interop destroy(I) use(J)
199410f09afSMike Rice }
200410f09afSMike Rice 
201410f09afSMike Rice //DUMP: FunctionTemplateDecl{{.*}}fooTemp
202410f09afSMike Rice //DUMP-NEXT: NonTypeTemplateParmDecl{{.*}}'int{{.*}}I
203410f09afSMike Rice template <int I>
fooTemp()204410f09afSMike Rice void fooTemp() {
205410f09afSMike Rice   omp_interop_t interop_var;
206410f09afSMike Rice   //PRINT: #pragma omp interop init(prefer_type(I,4,"level_one"), target : interop_var)
207410f09afSMike Rice   //DUMP: FunctionDecl{{.*}}fooTemp
208410f09afSMike Rice   //DUMP: OMPInteropDirective
209410f09afSMike Rice   //DUMP: OMPInitClause
210410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}'interop_var'
211410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}NonTypeTemplateParm{{.*}}'I' 'int'
212410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}'int' 4
213410f09afSMike Rice   //DUMP: StringLiteral{{.*}}"level_one"
214410f09afSMike Rice 
215410f09afSMike Rice   //PRINT: #pragma omp interop init(prefer_type(3,4,"level_one"), target : interop_var)
216410f09afSMike Rice   //DUMP: FunctionDecl{{.*}}fooTemp
217410f09afSMike Rice   //DUMP: TemplateArgument integral 3
218410f09afSMike Rice   //DUMP: OMPInteropDirective
219410f09afSMike Rice   //DUMP: OMPInitClause
220410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}'interop_var'
221410f09afSMike Rice   //DUMP: SubstNonTypeTemplateParmExpr{{.*}}'int'
222410f09afSMike Rice   //DUMP: NonTypeTemplateParmDecl{{.*}}'int'{{.*}}I
223410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}'int' 3
224410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}'int' 4
225410f09afSMike Rice   //DUMP: StringLiteral{{.*}}"level_one"
226410f09afSMike Rice   #pragma omp interop init(prefer_type(I,4,"level_one"), target: interop_var)
227410f09afSMike Rice }
228410f09afSMike Rice 
229410f09afSMike Rice //DUMP: FunctionTemplateDecl{{.*}}barTemp
230410f09afSMike Rice //DUMP-NEXT: TemplateTypeParmDecl{{.*}}typename{{.*}}T
231410f09afSMike Rice template <typename T>
barTemp(T t)232410f09afSMike Rice void barTemp(T t) {
233410f09afSMike Rice   //PRINT: #pragma omp interop init(prefer_type(4,"level_one"), target : t)
234410f09afSMike Rice   //DUMP: FunctionDecl{{.*}}barTemp 'void (T)'
235410f09afSMike Rice   //DUMP: ParmVarDecl{{.*}}t 'T'
236410f09afSMike Rice   //DUMP: OMPInteropDirective
237410f09afSMike Rice   //DUMP: OMPInitClause
238410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T'
239410f09afSMike Rice   //DUMP: IntegerLiteral{{.*}}'int' 4
240410f09afSMike Rice   //DUMP: StringLiteral{{.*}}"level_one"
241410f09afSMike Rice   #pragma omp interop init(prefer_type(4,"level_one"), target: t)
242410f09afSMike Rice 
243c615927cSMike Rice   //PRINT: #pragma omp interop use(t)
244c615927cSMike Rice   //DUMP: OMPInteropDirective
245c615927cSMike Rice   //DUMP: OMPUseClause
246c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T'
247c615927cSMike Rice   #pragma omp interop use(t)
248c615927cSMike Rice 
249*c2f8e158SMike Rice   //PRINT: #pragma omp interop destroy(t)
250*c2f8e158SMike Rice   //DUMP: OMPInteropDirective
251*c2f8e158SMike Rice   //DUMP: OMPDestroyClause
252*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T'
253*c2f8e158SMike Rice   #pragma omp interop destroy(t)
254*c2f8e158SMike Rice 
255410f09afSMike Rice   //DUMP: FunctionDecl{{.*}}barTemp 'void (void *)'
256410f09afSMike Rice   //DUMP: TemplateArgument type 'void *'
257410f09afSMike Rice   //DUMP: ParmVarDecl{{.*}}t 'void *'
258410f09afSMike Rice   //DUMP: OMPInteropDirective
259410f09afSMike Rice   //DUMP: OMPInitClause
260410f09afSMike Rice   //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *'
261410f09afSMike Rice   //PRINT: #pragma omp interop init(prefer_type(4,"level_one"), target : t)
262c615927cSMike Rice   //DUMP: OMPInteropDirective
263c615927cSMike Rice   //DUMP: OMPUseClause
264c615927cSMike Rice   //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *'
265c615927cSMike Rice   //PRINT: #pragma omp interop use(t)
266*c2f8e158SMike Rice   //DUMP: OMPInteropDirective
267*c2f8e158SMike Rice   //DUMP: OMPDestroyClause
268*c2f8e158SMike Rice   //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *'
269*c2f8e158SMike Rice   //PRINT: #pragma omp interop destroy(t)
270410f09afSMike Rice }
271410f09afSMike Rice 
bar()272410f09afSMike Rice void bar()
273410f09afSMike Rice {
274410f09afSMike Rice   fooTemp<3>();
275410f09afSMike Rice   omp_interop_t Ivar;
276410f09afSMike Rice   barTemp(Ivar);
277410f09afSMike Rice }
278410f09afSMike Rice 
279410f09afSMike Rice #endif // HEADER
280