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 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> 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> 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 272 void bar() 273 { 274 fooTemp<3>(); 275 omp_interop_t Ivar; 276 barTemp(Ivar); 277 } 278 279 #endif // HEADER 280