1 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
2 // RUN: -fsyntax-only -verify %s
3
4 // expected-no-diagnostics
5
6 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
7 // RUN: -ast-print %s | FileCheck %s --check-prefix=PRINT
8
9 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
10 // RUN: -ast-dump %s | FileCheck %s --check-prefix=DUMP
11
12 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
13 // RUN: -emit-pch -o %t %s
14
15 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
16 // RUN: -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP
17
18 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \
19 // RUN: -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT
20
21 #ifndef HEADER
22 #define HEADER
23
24 typedef void *omp_interop_t;
25
26 //PRINT-LABEL: void foo1(
27 //DUMP-LABEL: FunctionDecl {{.*}} foo1
foo1(int * ap,int dev)28 void foo1(int *ap, int dev) {
29 omp_interop_t I;
30 omp_interop_t &IRef = I;
31
32 //PRINT: #pragma omp interop init(target : I)
33 //DUMP: OMPInteropDirective
34 //DUMP: OMPInitClause
35 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
36 #pragma omp interop init(target:I)
37
38 //PRINT: #pragma omp interop use(I)
39 //DUMP: OMPInteropDirective
40 //DUMP: OMPUseClause
41 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
42 #pragma omp interop use(I)
43
44 //PRINT: #pragma omp interop destroy(I)
45 //DUMP: OMPInteropDirective
46 //DUMP: OMPDestroyClause
47 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
48 #pragma omp interop destroy(I)
49
50 //PRINT: #pragma omp interop init(target : IRef)
51 //DUMP: OMPInteropDirective
52 //DUMP: OMPInitClause
53 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef'
54 #pragma omp interop init(target:IRef)
55
56 //PRINT: #pragma omp interop use(IRef)
57 //DUMP: OMPInteropDirective
58 //DUMP: OMPUseClause
59 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef'
60 #pragma omp interop use(IRef)
61
62 //PRINT: #pragma omp interop destroy(IRef)
63 //DUMP: OMPInteropDirective
64 //DUMP: OMPDestroyClause
65 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef'
66 #pragma omp interop destroy(IRef)
67
68 const omp_interop_t CI = (omp_interop_t)0;
69 //PRINT: #pragma omp interop use(CI)
70 //DUMP: OMPInteropDirective
71 //DUMP: OMPUseClause
72 //DUMP: DeclRefExpr{{.*}}'const omp_interop_t'{{.*}}Var{{.*}}'CI'
73 #pragma omp interop use(CI)
74
75 //PRINT: #pragma omp interop device(dev) depend(inout : ap) init(targetsync : I)
76 //DUMP: OMPInteropDirective
77 //DUMP: OMPDeviceClause
78 //DUMP: DeclRefExpr{{.*}}'dev' 'int'
79 //DUMP: OMPDependClause
80 //DUMP: DeclRefExpr{{.*}}'ap' 'int *'
81 //DUMP: OMPInitClause
82 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
83 #pragma omp interop device(dev) depend(inout:ap) init(targetsync:I)
84
85 //PRINT: #pragma omp interop device(dev) depend(inout : ap) use(I)
86 //DUMP: OMPInteropDirective
87 //DUMP: OMPDeviceClause
88 //DUMP: DeclRefExpr{{.*}}'dev' 'int'
89 //DUMP: OMPDependClause
90 //DUMP: DeclRefExpr{{.*}}'ap' 'int *'
91 //DUMP: OMPUseClause
92 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
93 #pragma omp interop device(dev) depend(inout:ap) use(I)
94
95 //PRINT: #pragma omp interop device(dev) depend(inout : ap) destroy(I)
96 //DUMP: OMPInteropDirective
97 //DUMP: OMPDeviceClause
98 //DUMP: DeclRefExpr{{.*}}'dev' 'int'
99 //DUMP: OMPDependClause
100 //DUMP: DeclRefExpr{{.*}}'ap' 'int *'
101 //DUMP: OMPDestroyClause
102 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
103 #pragma omp interop device(dev) depend(inout:ap) destroy(I)
104
105 //PRINT: #pragma omp interop init(prefer_type(1,2,3,4,5,6), targetsync : I)
106 //DUMP: OMPInteropDirective
107 //DUMP: OMPInitClause
108 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
109 //DUMP: IntegerLiteral{{.*}}1
110 //DUMP: IntegerLiteral{{.*}}2
111 //DUMP: IntegerLiteral{{.*}}3
112 //DUMP: IntegerLiteral{{.*}}4
113 //DUMP: IntegerLiteral{{.*}}5
114 //DUMP: IntegerLiteral{{.*}}6
115 #pragma omp interop init(prefer_type(1,2,3,4,5,6),targetsync:I)
116
117 //PRINT: #pragma omp interop init(prefer_type(2,4,6,1), targetsync : I)
118 //DUMP: OMPInteropDirective
119 //DUMP: OMPInitClause
120 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
121 //DUMP: IntegerLiteral{{.*}}2
122 //DUMP: IntegerLiteral{{.*}}4
123 //DUMP: IntegerLiteral{{.*}}6
124 //DUMP: IntegerLiteral{{.*}}1
125 #pragma omp interop init(prefer_type(2,4,6,1),targetsync:I)
126
127 //PRINT: #pragma omp interop init(prefer_type("cuda","cuda_driver","opencl","sycl","hip","level_zero"), targetsync : I)
128 //DUMP: OMPInteropDirective
129 //DUMP: OMPInitClause
130 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
131 //DUMP: StringLiteral{{.*}}"cuda"
132 //DUMP: StringLiteral{{.*}}"cuda_driver"
133 //DUMP: StringLiteral{{.*}}"opencl"
134 //DUMP: StringLiteral{{.*}}"sycl"
135 //DUMP: StringLiteral{{.*}}"hip"
136 //DUMP: StringLiteral{{.*}}"level_zero"
137 #pragma omp interop init( \
138 prefer_type("cuda","cuda_driver","opencl","sycl","hip","level_zero"), \
139 targetsync:I)
140
141 //PRINT: #pragma omp interop init(prefer_type("level_zero",2,4), targetsync : I)
142 //DUMP: OMPInteropDirective
143 //DUMP: OMPInitClause
144 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
145 //DUMP: StringLiteral{{.*}}"level_zero"
146 //DUMP: IntegerLiteral{{.*}}2
147 //DUMP: IntegerLiteral{{.*}}4
148 #pragma omp interop init(prefer_type("level_zero",2,4),targetsync:I)
149
150 omp_interop_t J;
151
152 //PRINT: #pragma omp interop init(target : I) init(targetsync : J)
153 //DUMP: OMPInteropDirective
154 //DUMP: OMPInitClause
155 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
156 //DUMP: OMPInitClause
157 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
158 #pragma omp interop init(target:I) init(targetsync:J)
159
160 //PRINT: #pragma omp interop init(target : I) use(J)
161 //DUMP: OMPInteropDirective
162 //DUMP: OMPInitClause
163 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
164 //DUMP: OMPUseClause
165 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
166 #pragma omp interop init(target:I) use(J)
167
168 //PRINT: #pragma omp interop use(I) use(J)
169 //DUMP: OMPInteropDirective
170 //DUMP: OMPUseClause
171 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
172 //DUMP: OMPUseClause
173 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
174 #pragma omp interop use(I) use(J)
175
176 //PRINT: #pragma omp interop destroy(I) destroy(J)
177 //DUMP: OMPInteropDirective
178 //DUMP: OMPDestroyClause
179 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
180 //DUMP: OMPDestroyClause
181 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
182 #pragma omp interop destroy(I) destroy(J)
183
184 //PRINT: #pragma omp interop init(target : I) destroy(J)
185 //DUMP: OMPInteropDirective
186 //DUMP: OMPInitClause
187 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
188 //DUMP: OMPDestroyClause
189 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
190 #pragma omp interop init(target:I) destroy(J)
191
192 //PRINT: #pragma omp interop destroy(I) use(J)
193 //DUMP: OMPInteropDirective
194 //DUMP: OMPDestroyClause
195 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'
196 //DUMP: OMPUseClause
197 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'
198 #pragma omp interop destroy(I) use(J)
199 }
200
201 //DUMP: FunctionTemplateDecl{{.*}}fooTemp
202 //DUMP-NEXT: NonTypeTemplateParmDecl{{.*}}'int{{.*}}I
203 template <int I>
fooTemp()204 void fooTemp() {
205 omp_interop_t interop_var;
206 //PRINT: #pragma omp interop init(prefer_type(I,4,"level_one"), target : interop_var)
207 //DUMP: FunctionDecl{{.*}}fooTemp
208 //DUMP: OMPInteropDirective
209 //DUMP: OMPInitClause
210 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}'interop_var'
211 //DUMP: DeclRefExpr{{.*}}NonTypeTemplateParm{{.*}}'I' 'int'
212 //DUMP: IntegerLiteral{{.*}}'int' 4
213 //DUMP: StringLiteral{{.*}}"level_one"
214
215 //PRINT: #pragma omp interop init(prefer_type(3,4,"level_one"), target : interop_var)
216 //DUMP: FunctionDecl{{.*}}fooTemp
217 //DUMP: TemplateArgument integral 3
218 //DUMP: OMPInteropDirective
219 //DUMP: OMPInitClause
220 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}'interop_var'
221 //DUMP: SubstNonTypeTemplateParmExpr{{.*}}'int'
222 //DUMP: NonTypeTemplateParmDecl{{.*}}'int'{{.*}}I
223 //DUMP: IntegerLiteral{{.*}}'int' 3
224 //DUMP: IntegerLiteral{{.*}}'int' 4
225 //DUMP: StringLiteral{{.*}}"level_one"
226 #pragma omp interop init(prefer_type(I,4,"level_one"), target: interop_var)
227 }
228
229 //DUMP: FunctionTemplateDecl{{.*}}barTemp
230 //DUMP-NEXT: TemplateTypeParmDecl{{.*}}typename{{.*}}T
231 template <typename T>
barTemp(T t)232 void barTemp(T t) {
233 //PRINT: #pragma omp interop init(prefer_type(4,"level_one"), target : t)
234 //DUMP: FunctionDecl{{.*}}barTemp 'void (T)'
235 //DUMP: ParmVarDecl{{.*}}t 'T'
236 //DUMP: OMPInteropDirective
237 //DUMP: OMPInitClause
238 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T'
239 //DUMP: IntegerLiteral{{.*}}'int' 4
240 //DUMP: StringLiteral{{.*}}"level_one"
241 #pragma omp interop init(prefer_type(4,"level_one"), target: t)
242
243 //PRINT: #pragma omp interop use(t)
244 //DUMP: OMPInteropDirective
245 //DUMP: OMPUseClause
246 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T'
247 #pragma omp interop use(t)
248
249 //PRINT: #pragma omp interop destroy(t)
250 //DUMP: OMPInteropDirective
251 //DUMP: OMPDestroyClause
252 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T'
253 #pragma omp interop destroy(t)
254
255 //DUMP: FunctionDecl{{.*}}barTemp 'void (void *)'
256 //DUMP: TemplateArgument type 'void *'
257 //DUMP: ParmVarDecl{{.*}}t 'void *'
258 //DUMP: OMPInteropDirective
259 //DUMP: OMPInitClause
260 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *'
261 //PRINT: #pragma omp interop init(prefer_type(4,"level_one"), target : t)
262 //DUMP: OMPInteropDirective
263 //DUMP: OMPUseClause
264 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *'
265 //PRINT: #pragma omp interop use(t)
266 //DUMP: OMPInteropDirective
267 //DUMP: OMPDestroyClause
268 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *'
269 //PRINT: #pragma omp interop destroy(t)
270 }
271
bar()272 void bar()
273 {
274 fooTemp<3>();
275 omp_interop_t Ivar;
276 barTemp(Ivar);
277 }
278
279 #endif // HEADER
280