335 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \2// RUN: -fsyntax-only -verify %s3 4// expected-no-diagnostics5 6// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \7// RUN: -ast-print %s | FileCheck %s --check-prefix=PRINT8 9// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \10// RUN: -ast-dump %s | FileCheck %s --check-prefix=DUMP11 12// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \13// RUN: -emit-pch -o %t %s14 15// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \16// RUN: -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP17 18// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp \19// RUN: -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT20 21#ifndef HEADER22#define HEADER23 24typedef void *omp_interop_t;25 26struct S {27 omp_interop_t o1;28 omp_interop_t o2;29 omp_interop_t o3;30 static omp_interop_t so;31 void foo();32 S();33 ~S();34};35omp_interop_t S::so;36 37struct T {38 static void static_member_func();39 static omp_interop_t to;40};41omp_interop_t T::to;42 43void T::static_member_func() {44 omp_interop_t o1;45 //PRINT: #pragma omp interop init(target : o1)46 #pragma omp interop init(target:o1)47 48 //PRINT: #pragma omp interop init(target : to)49 #pragma omp interop init(target: to)50 51 //PRINT: #pragma omp interop init(target : T::to)52 #pragma omp interop init(target: T::to)53 54 //PRINT: #pragma omp interop init(target : S::so)55 #pragma omp interop init(target: S::so)56}57 58 59S::S() {60 //PRINT: #pragma omp interop init(target : this->o1)61 #pragma omp interop init(target:o1)62 //PRINT: #pragma omp interop use(this->o1) init(target : this->o2)63 #pragma omp interop use(o1) init(target:o2)64 //PRINT: #pragma omp interop use(this->o2) init(target : this->o3)65 #pragma omp interop use(o2) init(target:o3)66}67S::~S() {68 //PRINT: #pragma omp interop destroy(this->o1) destroy(this->o2) destroy(this->o3)69 #pragma omp interop destroy(o1) destroy(o2) destroy(o3)70}71 72void S::foo() {73 //PRINT: #pragma omp interop init(target : so)74 #pragma omp interop init(target:so)75}76 77//PRINT-LABEL: void foo1(78//DUMP-LABEL: FunctionDecl {{.*}} foo179void foo1(int *ap, int dev) {80 omp_interop_t I;81 omp_interop_t &IRef = I;82 83 //PRINT: #pragma omp interop init(target : I)84 //DUMP: OMPInteropDirective85 //DUMP: OMPInitClause86 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'87 #pragma omp interop init(target:I)88 89 //PRINT: #pragma omp interop use(I)90 //DUMP: OMPInteropDirective91 //DUMP: OMPUseClause92 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'93 #pragma omp interop use(I)94 95 //PRINT: #pragma omp interop destroy(I)96 //DUMP: OMPInteropDirective97 //DUMP: OMPDestroyClause98 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'99 #pragma omp interop destroy(I)100 101 //PRINT: #pragma omp interop init(target : IRef)102 //DUMP: OMPInteropDirective103 //DUMP: OMPInitClause104 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef'105 #pragma omp interop init(target:IRef)106 107 //PRINT: #pragma omp interop use(IRef)108 //DUMP: OMPInteropDirective109 //DUMP: OMPUseClause110 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef'111 #pragma omp interop use(IRef)112 113 //PRINT: #pragma omp interop destroy(IRef)114 //DUMP: OMPInteropDirective115 //DUMP: OMPDestroyClause116 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef'117 #pragma omp interop destroy(IRef)118 119 const omp_interop_t CI = (omp_interop_t)0;120 //PRINT: #pragma omp interop use(CI)121 //DUMP: OMPInteropDirective122 //DUMP: OMPUseClause123 //DUMP: DeclRefExpr{{.*}}'const omp_interop_t'{{.*}}Var{{.*}}'CI'124 #pragma omp interop use(CI)125 126 //PRINT: #pragma omp interop device(dev) depend(inout : ap) init(targetsync : I)127 //DUMP: OMPInteropDirective128 //DUMP: OMPDeviceClause129 //DUMP: DeclRefExpr{{.*}}'dev' 'int'130 //DUMP: OMPDependClause131 //DUMP: DeclRefExpr{{.*}}'ap' 'int *'132 //DUMP: OMPInitClause133 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'134 #pragma omp interop device(dev) depend(inout:ap) init(targetsync:I)135 136 //PRINT: #pragma omp interop device(dev) depend(inout : ap) use(I)137 //DUMP: OMPInteropDirective138 //DUMP: OMPDeviceClause139 //DUMP: DeclRefExpr{{.*}}'dev' 'int'140 //DUMP: OMPDependClause141 //DUMP: DeclRefExpr{{.*}}'ap' 'int *'142 //DUMP: OMPUseClause143 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'144 #pragma omp interop device(dev) depend(inout:ap) use(I)145 146 //PRINT: #pragma omp interop device(dev) depend(inout : ap) destroy(I)147 //DUMP: OMPInteropDirective148 //DUMP: OMPDeviceClause149 //DUMP: DeclRefExpr{{.*}}'dev' 'int'150 //DUMP: OMPDependClause151 //DUMP: DeclRefExpr{{.*}}'ap' 'int *'152 //DUMP: OMPDestroyClause153 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'154 #pragma omp interop device(dev) depend(inout:ap) destroy(I)155 156 //PRINT: #pragma omp interop init(prefer_type(1,2,3,4,5,6), targetsync : I)157 //DUMP: OMPInteropDirective158 //DUMP: OMPInitClause159 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'160 //DUMP: IntegerLiteral{{.*}}1161 //DUMP: IntegerLiteral{{.*}}2162 //DUMP: IntegerLiteral{{.*}}3163 //DUMP: IntegerLiteral{{.*}}4164 //DUMP: IntegerLiteral{{.*}}5165 //DUMP: IntegerLiteral{{.*}}6166 #pragma omp interop init(prefer_type(1,2,3,4,5,6),targetsync:I)167 168 //PRINT: #pragma omp interop init(prefer_type(2,4,6,1), targetsync : I)169 //DUMP: OMPInteropDirective170 //DUMP: OMPInitClause171 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'172 //DUMP: IntegerLiteral{{.*}}2173 //DUMP: IntegerLiteral{{.*}}4174 //DUMP: IntegerLiteral{{.*}}6175 //DUMP: IntegerLiteral{{.*}}1176 #pragma omp interop init(prefer_type(2,4,6,1),targetsync:I)177 178 //PRINT: #pragma omp interop init(prefer_type("cuda","cuda_driver","opencl","sycl","hip","level_zero"), targetsync : I)179 //DUMP: OMPInteropDirective180 //DUMP: OMPInitClause181 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'182 //DUMP: StringLiteral{{.*}}"cuda"183 //DUMP: StringLiteral{{.*}}"cuda_driver"184 //DUMP: StringLiteral{{.*}}"opencl"185 //DUMP: StringLiteral{{.*}}"sycl"186 //DUMP: StringLiteral{{.*}}"hip"187 //DUMP: StringLiteral{{.*}}"level_zero"188 #pragma omp interop init( \189 prefer_type("cuda","cuda_driver","opencl","sycl","hip","level_zero"), \190 targetsync:I)191 192 //PRINT: #pragma omp interop init(prefer_type("level_zero",2,4), targetsync : I)193 //DUMP: OMPInteropDirective194 //DUMP: OMPInitClause195 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'196 //DUMP: StringLiteral{{.*}}"level_zero"197 //DUMP: IntegerLiteral{{.*}}2198 //DUMP: IntegerLiteral{{.*}}4199 #pragma omp interop init(prefer_type("level_zero",2,4),targetsync:I)200 201 omp_interop_t J;202 203 //PRINT: #pragma omp interop init(target : I) init(targetsync : J)204 //DUMP: OMPInteropDirective205 //DUMP: OMPInitClause206 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'207 //DUMP: OMPInitClause208 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'209 #pragma omp interop init(target:I) init(targetsync:J)210 211 //PRINT: #pragma omp interop init(target : I) use(J)212 //DUMP: OMPInteropDirective213 //DUMP: OMPInitClause214 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'215 //DUMP: OMPUseClause216 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'217 #pragma omp interop init(target:I) use(J)218 219 //PRINT: #pragma omp interop use(I) use(J)220 //DUMP: OMPInteropDirective221 //DUMP: OMPUseClause222 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'223 //DUMP: OMPUseClause224 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'225 #pragma omp interop use(I) use(J)226 227 //PRINT: #pragma omp interop destroy(I) destroy(J)228 //DUMP: OMPInteropDirective229 //DUMP: OMPDestroyClause230 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'231 //DUMP: OMPDestroyClause232 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'233 #pragma omp interop destroy(I) destroy(J)234 235 //PRINT: #pragma omp interop init(target : I) destroy(J)236 //DUMP: OMPInteropDirective237 //DUMP: OMPInitClause238 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'239 //DUMP: OMPDestroyClause240 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'241 #pragma omp interop init(target:I) destroy(J)242 243 //PRINT: #pragma omp interop destroy(I) use(J)244 //DUMP: OMPInteropDirective245 //DUMP: OMPDestroyClause246 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I'247 //DUMP: OMPUseClause248 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J'249 #pragma omp interop destroy(I) use(J)250 251 //PRINT: #pragma omp interop init(target : S::so)252 #pragma omp interop init(target: S::so)253}254 255//DUMP: FunctionTemplateDecl{{.*}}fooTemp256//DUMP-NEXT: NonTypeTemplateParmDecl{{.*}}'int{{.*}}I257template <int I>258void fooTemp() {259 omp_interop_t interop_var;260 //PRINT: #pragma omp interop init(prefer_type(I,4,"level_one"), target : interop_var)261 //DUMP: FunctionDecl{{.*}}fooTemp262 //DUMP: OMPInteropDirective263 //DUMP: OMPInitClause264 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}'interop_var'265 //DUMP: DeclRefExpr{{.*}}NonTypeTemplateParm{{.*}}'I' 'int'266 //DUMP: IntegerLiteral{{.*}}'int' 4267 //DUMP: StringLiteral{{.*}}"level_one"268 269 //PRINT: #pragma omp interop init(prefer_type(3,4,"level_one"), target : interop_var)270 //DUMP: FunctionDecl{{.*}}fooTemp271 //DUMP: TemplateArgument integral '3'272 //DUMP: OMPInteropDirective273 //DUMP: OMPInitClause274 //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}'interop_var'275 //DUMP: SubstNonTypeTemplateParmExpr{{.*}}'int'276 //DUMP: NonTypeTemplateParmDecl{{.*}}'int'{{.*}}I277 //DUMP: IntegerLiteral{{.*}}'int' 3278 //DUMP: IntegerLiteral{{.*}}'int' 4279 //DUMP: StringLiteral{{.*}}"level_one"280 #pragma omp interop init(prefer_type(I,4,"level_one"), target: interop_var)281}282 283//DUMP: FunctionTemplateDecl{{.*}}barTemp284//DUMP-NEXT: TemplateTypeParmDecl{{.*}}typename{{.*}}T285template <typename T>286void barTemp(T t) {287 //PRINT: #pragma omp interop init(prefer_type(4,"level_one"), target : t)288 //DUMP: FunctionDecl{{.*}}barTemp 'void (T)'289 //DUMP: ParmVarDecl{{.*}}t 'T'290 //DUMP: OMPInteropDirective291 //DUMP: OMPInitClause292 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T'293 //DUMP: IntegerLiteral{{.*}}'int' 4294 //DUMP: StringLiteral{{.*}}"level_one"295 #pragma omp interop init(prefer_type(4,"level_one"), target: t)296 297 //PRINT: #pragma omp interop use(t)298 //DUMP: OMPInteropDirective299 //DUMP: OMPUseClause300 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T'301 #pragma omp interop use(t)302 303 //PRINT: #pragma omp interop destroy(t)304 //DUMP: OMPInteropDirective305 //DUMP: OMPDestroyClause306 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T'307 #pragma omp interop destroy(t)308 309 //DUMP: FunctionDecl{{.*}}barTemp 'void (void *)'310 //DUMP: TemplateArgument type 'void *'311 //DUMP: ParmVarDecl{{.*}}t 'void *'312 //DUMP: OMPInteropDirective313 //DUMP: OMPInitClause314 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *'315 //PRINT: #pragma omp interop init(prefer_type(4,"level_one"), target : t)316 //DUMP: OMPInteropDirective317 //DUMP: OMPUseClause318 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *'319 //PRINT: #pragma omp interop use(t)320 //DUMP: OMPInteropDirective321 //DUMP: OMPDestroyClause322 //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *'323 //PRINT: #pragma omp interop destroy(t)324}325 326void bar()327{328 fooTemp<3>();329 omp_interop_t Ivar;330 barTemp(Ivar);331 S s;332}333 334#endif // HEADER335