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