// RUN: %clang_cc1 %s -fopenacc -Wno-openacc-cache-var-inside-loop -ast-dump | FileCheck %s // Test this with PCH. // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s #ifndef PCH_HELPER #define PCH_HELPER void use() { // CHECK: FunctionDecl{{.*}} use 'void ()' // CHECK-NEXT: CompoundStmt int Array[5]; // CHECK-NEXT: DeclStmt // CHECK-NEXT: VarDecl{{.*}}Array 'int[5]' #pragma acc loop // CHECK-NEXT: OpenACCLoopConstruct for (int i = 0; i < 5; ++i) { // CHECK-NEXT: ForStmt // CHECK-NEXT: DeclStmt // CHECK-NEXT: VarDecl{{.*}}i 'int' // CHECK-NEXT: IntegerLiteral // CHECK-NEXT: <<>> // CHECK-NEXT: BinaryOperator // CHECK-NEXT: ImplicitCastExpr // CHECK-NEXT: DeclRefExpr // CHECK-NEXT: IntegerLiteral // CHECK-NEXT: UnaryOperator // CHECK-NEXT: DeclRefExpr // CHECK-NEXT: CompoundStmt #pragma acc cache(Array[1]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'int[5]' // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 _Pragma("acc cache(Array[1])") // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'int[5]' // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 #pragma acc cache(Array[1:2]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ArraySectionExpr{{.*}}'' lvalue // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'int[5]' // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 2 // No vars here, since they are bad references. #pragma acc cache (Array[i]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache } // No vars here, since they are bad references. #pragma acc cache(Array[1:2]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache return; // CHECK-NEXT: ReturnStmt } struct S { int Array[5]; int Array2D[5][5]; void StructUse() { // CHECK: CXXMethodDecl{{.*}}StructUse 'void ()' // CHECK-NEXT: CompoundStmt #pragma acc loop // CHECK-NEXT: OpenACCLoopConstruct for (int i = 0; i < 5; ++i) { // CHECK-NEXT: ForStmt // CHECK-NEXT: DeclStmt // CHECK-NEXT: VarDecl{{.*}}i 'int' // CHECK-NEXT: IntegerLiteral // CHECK-NEXT: <<>> // CHECK-NEXT: BinaryOperator // CHECK-NEXT: ImplicitCastExpr // CHECK-NEXT: DeclRefExpr // CHECK-NEXT: IntegerLiteral // CHECK-NEXT: UnaryOperator // CHECK-NEXT: DeclRefExpr // CHECK-NEXT: CompoundStmt #pragma acc cache(Array[1]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->Array // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 #pragma acc cache(Array[1:2]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ArraySectionExpr{{.*}}'' lvalue // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' // CHECK-NEXT: MemberExpr{{.*}} 'int[5]' lvalue ->Array // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 2 #pragma acc cache(Array2D[1][1]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int[5]' lvalue // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)[5]' // CHECK-NEXT: MemberExpr{{.*}} 'int[5][5]' lvalue ->Array2D // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 #pragma acc cache(Array2D[1][1:2]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ArraySectionExpr{{.*}}'' lvalue // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int[5]' lvalue // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)[5]' // CHECK-NEXT: MemberExpr{{.*}} 'int[5][5]' lvalue ->Array2D // CHECK-NEXT: CXXThisExpr{{.*}} 'S *' // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 2 } } }; template void templ_use() { // CHECK: FunctionDecl{{.*}} templ_use 'void ()' // CHECK-NEXT: CompoundStmt T Array[5]; // CHECK-NEXT: DeclStmt // CHECK-NEXT: VarDecl{{.*}}Array 'T[5]' #pragma acc loop // CHECK-NEXT: OpenACCLoopConstruct for (int i = 0; i < 5; ++i) { // CHECK-NEXT: ForStmt // CHECK-NEXT: DeclStmt // CHECK-NEXT: VarDecl{{.*}}i 'int' // CHECK-NEXT: IntegerLiteral // CHECK-NEXT: <<>> // CHECK-NEXT: BinaryOperator // CHECK-NEXT: ImplicitCastExpr // CHECK-NEXT: DeclRefExpr // CHECK-NEXT: IntegerLiteral // CHECK-NEXT: UnaryOperator // CHECK-NEXT: DeclRefExpr // CHECK-NEXT: CompoundStmt #pragma acc cache(Array[1]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ArraySubscriptExpr{{.*}}'T' lvalue // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'T[5]' // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 #pragma acc cache(Array[1:2]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ArraySectionExpr{{.*}}'' lvalue // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'T[5]' // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 2 // No vars here, since they are bad references. #pragma acc cache(Array[i]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache } // No vars here, since they are bad references. #pragma acc cache(Array[1]) // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache return; // CHECK-NEXT: ReturnStmt // Instantiation: // CHECK: FunctionDecl{{.*}} templ_use 'void ()' implicit_instantiation // CHECK-NEXT: TemplateArgument type 'int' // CHECK-NEXT: BuiltinType{{.*}} 'int' // CHECK-NEXT: CompoundStmt // CHECK-NEXT: DeclStmt // CHECK-NEXT: VarDecl{{.*}}Array 'int[5]' // CHECK-NEXT: OpenACCLoopConstruct // CHECK-NEXT: ForStmt // CHECK-NEXT: DeclStmt // CHECK-NEXT: VarDecl{{.*}}i 'int' // CHECK-NEXT: IntegerLiteral // CHECK-NEXT: <<>> // CHECK-NEXT: BinaryOperator // CHECK-NEXT: ImplicitCastExpr // CHECK-NEXT: DeclRefExpr // CHECK-NEXT: IntegerLiteral // CHECK-NEXT: UnaryOperator // CHECK-NEXT: DeclRefExpr // CHECK-NEXT: CompoundStmt // // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ArraySubscriptExpr{{.*}}'int' lvalue // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'int[5]' // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ArraySectionExpr{{.*}}'' lvalue // CHECK-NEXT: ImplicitCastExpr{{.*}}'int *' // CHECK-NEXT: DeclRefExpr{{.*}}'Array' 'int[5]' // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 2 // No vars here, since they are bad references. // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: OpenACCCacheConstruct{{.*}} cache // CHECK-NEXT: ReturnStmt } void foo() { templ_use(); } #endif