// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \ // RUN: -fsyntax-only -verify %s // expected-no-diagnostics // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \ // RUN: -ast-print %s | FileCheck %s --check-prefix=PRINT // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \ // RUN: -ast-dump %s | FileCheck %s --check-prefix=DUMP // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \ // RUN: -emit-pch -o %t %s // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \ // RUN: -include-pch %t -ast-dump-all %s | FileCheck %s --check-prefix=DUMP // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -fopenmp-version=51 \ // RUN: -include-pch %t -ast-print %s | FileCheck %s --check-prefix=PRINT #ifndef HEADER #define HEADER typedef void *omp_interop_t; //PRINT-LABEL: void foo1( //DUMP-LABEL: FunctionDecl {{.*}} foo1 void foo1(int *ap, int dev) { omp_interop_t I; omp_interop_t &IRef = I; //PRINT: #pragma omp interop init(target : I) //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' #pragma omp interop init(target:I) //PRINT: #pragma omp interop use(I) //DUMP: OMPInteropDirective //DUMP: OMPUseClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' #pragma omp interop use(I) //PRINT: #pragma omp interop destroy(I) //DUMP: OMPInteropDirective //DUMP: OMPDestroyClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' #pragma omp interop destroy(I) //PRINT: #pragma omp interop init(target : IRef) //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef' #pragma omp interop init(target:IRef) //PRINT: #pragma omp interop use(IRef) //DUMP: OMPInteropDirective //DUMP: OMPUseClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef' #pragma omp interop use(IRef) //PRINT: #pragma omp interop destroy(IRef) //DUMP: OMPInteropDirective //DUMP: OMPDestroyClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'IRef' #pragma omp interop destroy(IRef) const omp_interop_t CI = (omp_interop_t)0; //PRINT: #pragma omp interop use(CI) //DUMP: OMPInteropDirective //DUMP: OMPUseClause //DUMP: DeclRefExpr{{.*}}'const omp_interop_t'{{.*}}Var{{.*}}'CI' #pragma omp interop use(CI) //PRINT: #pragma omp interop device(dev) depend(inout : ap) init(targetsync : I) //DUMP: OMPInteropDirective //DUMP: OMPDeviceClause //DUMP: DeclRefExpr{{.*}}'dev' 'int' //DUMP: OMPDependClause //DUMP: DeclRefExpr{{.*}}'ap' 'int *' //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' #pragma omp interop device(dev) depend(inout:ap) init(targetsync:I) //PRINT: #pragma omp interop device(dev) depend(inout : ap) use(I) //DUMP: OMPInteropDirective //DUMP: OMPDeviceClause //DUMP: DeclRefExpr{{.*}}'dev' 'int' //DUMP: OMPDependClause //DUMP: DeclRefExpr{{.*}}'ap' 'int *' //DUMP: OMPUseClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' #pragma omp interop device(dev) depend(inout:ap) use(I) //PRINT: #pragma omp interop device(dev) depend(inout : ap) destroy(I) //DUMP: OMPInteropDirective //DUMP: OMPDeviceClause //DUMP: DeclRefExpr{{.*}}'dev' 'int' //DUMP: OMPDependClause //DUMP: DeclRefExpr{{.*}}'ap' 'int *' //DUMP: OMPDestroyClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' #pragma omp interop device(dev) depend(inout:ap) destroy(I) //PRINT: #pragma omp interop init(prefer_type(1,2,3,4,5,6), targetsync : I) //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' //DUMP: IntegerLiteral{{.*}}1 //DUMP: IntegerLiteral{{.*}}2 //DUMP: IntegerLiteral{{.*}}3 //DUMP: IntegerLiteral{{.*}}4 //DUMP: IntegerLiteral{{.*}}5 //DUMP: IntegerLiteral{{.*}}6 #pragma omp interop init(prefer_type(1,2,3,4,5,6),targetsync:I) //PRINT: #pragma omp interop init(prefer_type(2,4,6,1), targetsync : I) //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' //DUMP: IntegerLiteral{{.*}}2 //DUMP: IntegerLiteral{{.*}}4 //DUMP: IntegerLiteral{{.*}}6 //DUMP: IntegerLiteral{{.*}}1 #pragma omp interop init(prefer_type(2,4,6,1),targetsync:I) //PRINT: #pragma omp interop init(prefer_type("cuda","cuda_driver","opencl","sycl","hip","level_zero"), targetsync : I) //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' //DUMP: StringLiteral{{.*}}"cuda" //DUMP: StringLiteral{{.*}}"cuda_driver" //DUMP: StringLiteral{{.*}}"opencl" //DUMP: StringLiteral{{.*}}"sycl" //DUMP: StringLiteral{{.*}}"hip" //DUMP: StringLiteral{{.*}}"level_zero" #pragma omp interop init( \ prefer_type("cuda","cuda_driver","opencl","sycl","hip","level_zero"), \ targetsync:I) //PRINT: #pragma omp interop init(prefer_type("level_zero",2,4), targetsync : I) //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' //DUMP: StringLiteral{{.*}}"level_zero" //DUMP: IntegerLiteral{{.*}}2 //DUMP: IntegerLiteral{{.*}}4 #pragma omp interop init(prefer_type("level_zero",2,4),targetsync:I) omp_interop_t J; //PRINT: #pragma omp interop init(target : I) init(targetsync : J) //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J' #pragma omp interop init(target:I) init(targetsync:J) //PRINT: #pragma omp interop init(target : I) use(J) //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' //DUMP: OMPUseClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J' #pragma omp interop init(target:I) use(J) //PRINT: #pragma omp interop use(I) use(J) //DUMP: OMPInteropDirective //DUMP: OMPUseClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' //DUMP: OMPUseClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J' #pragma omp interop use(I) use(J) //PRINT: #pragma omp interop destroy(I) destroy(J) //DUMP: OMPInteropDirective //DUMP: OMPDestroyClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' //DUMP: OMPDestroyClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J' #pragma omp interop destroy(I) destroy(J) //PRINT: #pragma omp interop init(target : I) destroy(J) //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' //DUMP: OMPDestroyClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J' #pragma omp interop init(target:I) destroy(J) //PRINT: #pragma omp interop destroy(I) use(J) //DUMP: OMPInteropDirective //DUMP: OMPDestroyClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'I' //DUMP: OMPUseClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}Var{{.*}}'J' #pragma omp interop destroy(I) use(J) } //DUMP: FunctionTemplateDecl{{.*}}fooTemp //DUMP-NEXT: NonTypeTemplateParmDecl{{.*}}'int{{.*}}I template void fooTemp() { omp_interop_t interop_var; //PRINT: #pragma omp interop init(prefer_type(I,4,"level_one"), target : interop_var) //DUMP: FunctionDecl{{.*}}fooTemp //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}'interop_var' //DUMP: DeclRefExpr{{.*}}NonTypeTemplateParm{{.*}}'I' 'int' //DUMP: IntegerLiteral{{.*}}'int' 4 //DUMP: StringLiteral{{.*}}"level_one" //PRINT: #pragma omp interop init(prefer_type(3,4,"level_one"), target : interop_var) //DUMP: FunctionDecl{{.*}}fooTemp //DUMP: TemplateArgument integral 3 //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}'omp_interop_t'{{.*}}'interop_var' //DUMP: SubstNonTypeTemplateParmExpr{{.*}}'int' //DUMP: NonTypeTemplateParmDecl{{.*}}'int'{{.*}}I //DUMP: IntegerLiteral{{.*}}'int' 3 //DUMP: IntegerLiteral{{.*}}'int' 4 //DUMP: StringLiteral{{.*}}"level_one" #pragma omp interop init(prefer_type(I,4,"level_one"), target: interop_var) } //DUMP: FunctionTemplateDecl{{.*}}barTemp //DUMP-NEXT: TemplateTypeParmDecl{{.*}}typename{{.*}}T template void barTemp(T t) { //PRINT: #pragma omp interop init(prefer_type(4,"level_one"), target : t) //DUMP: FunctionDecl{{.*}}barTemp 'void (T)' //DUMP: ParmVarDecl{{.*}}t 'T' //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T' //DUMP: IntegerLiteral{{.*}}'int' 4 //DUMP: StringLiteral{{.*}}"level_one" #pragma omp interop init(prefer_type(4,"level_one"), target: t) //PRINT: #pragma omp interop use(t) //DUMP: OMPInteropDirective //DUMP: OMPUseClause //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T' #pragma omp interop use(t) //PRINT: #pragma omp interop destroy(t) //DUMP: OMPInteropDirective //DUMP: OMPDestroyClause //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'T' #pragma omp interop destroy(t) //DUMP: FunctionDecl{{.*}}barTemp 'void (void *)' //DUMP: TemplateArgument type 'void *' //DUMP: ParmVarDecl{{.*}}t 'void *' //DUMP: OMPInteropDirective //DUMP: OMPInitClause //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *' //PRINT: #pragma omp interop init(prefer_type(4,"level_one"), target : t) //DUMP: OMPInteropDirective //DUMP: OMPUseClause //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *' //PRINT: #pragma omp interop use(t) //DUMP: OMPInteropDirective //DUMP: OMPDestroyClause //DUMP: DeclRefExpr{{.*}}ParmVar{{.*}}'t' 'void *' //PRINT: #pragma omp interop destroy(t) } void bar() { fooTemp<3>(); omp_interop_t Ivar; barTemp(Ivar); } #endif // HEADER