forked from OSchip/llvm-project
280 lines
9.7 KiB
C++
280 lines
9.7 KiB
C++
// 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 <int I>
|
|
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 <typename T>
|
|
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
|