136 lines · cpp
1// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s2 3// Test this with PCH.4// RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s5// RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s6 7#ifndef PCH_HELPER8#define PCH_HELPER9void NormalFunc(int j, float f) {10 // CHECK: FunctionDecl{{.*}}NormalFunc11 // CHECK-NEXT: ParmVarDecl12 // CHECK-NEXT: ParmVarDecl13 // CHECK-NEXT: CompoundStmt14#pragma acc kernels loop if( j < f)15 for (unsigned i = 0; i < 5; ++i);16 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}kernels loop17 // CHECK-NEXT: if clause18 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'19 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating>20 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>21 // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'j' 'int'22 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>23 // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'24 // CHECK-NEXT: ForStmt25 // CHECK: NullStmt26 27}28 29template<typename T>30void TemplFunc() {31 // CHECK: FunctionTemplateDecl{{.*}}TemplFunc32 // CHECK-NEXT: TemplateTypeParmDecl33 34 // Match the prototype:35 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc36 // CHECK-NEXT: CompoundStmt37 38#pragma acc parallel loop if(T::SomeFloat < typename T::IntTy{})39 for (unsigned i = 0; i < 5; ++i);40 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop41 // CHECK-NEXT: if clause42 // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'43 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue44 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'45 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'46 // CHECK-NEXT: InitListExpr{{.*}} 'void'47 // CHECK-NEXT: ForStmt48 // CHECK: NullStmt49 50#pragma acc serial loop if(typename T::IntTy{})51 for (unsigned i = 0; i < 5; ++i);52 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}serial loop53 // CHECK-NEXT: if clause54 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'55 // CHECK-NEXT: InitListExpr{{.*}} 'void'56 // CHECK-NEXT: ForStmt57 // CHECK: NullStmt58 59#pragma acc kernels loop if(T::SomeFloat)60 for (unsigned i = 0; i < 5; ++i);61 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}kernels loop62 // CHECK-NEXT: if clause63 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue64 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'65 // CHECK-NEXT: ForStmt66 // CHECK: NullStmt67 68#pragma acc parallel loop if(T::BC)69 for (unsigned i = 0; i < 5; ++i);70 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop71 // CHECK-NEXT: if clause72 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue73 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'74 // CHECK-NEXT: ForStmt75 // CHECK: NullStmt76 77 // Match the instantiation:78 // CHECK: FunctionDecl{{.*}}TemplFunc{{.*}}implicit_instantiation79 // CHECK-NEXT: TemplateArgument type 'InstTy'80 // CHECK-NEXT: RecordType{{.*}} 'InstTy'81 // CHECK-NEXT: CXXRecord{{.*}} 'InstTy'82 // CHECK-NEXT: CompoundStmt83 84 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop85 // CHECK-NEXT: if clause86 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'87 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>88 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'89 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'90 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating>91 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename InstTy::IntTy <NoOp>92 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'93 // CHECK-NEXT: ForStmt94 // CHECK: NullStmt95 96 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}serial loop97 // CHECK-NEXT: if clause98 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <IntegralToBoolean>99 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename InstTy::IntTy <NoOp>100 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'101 // CHECK-NEXT: ForStmt102 // CHECK: NullStmt103 104 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}kernels loop105 // CHECK-NEXT: if clause106 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>107 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>108 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'109 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'110 // CHECK-NEXT: ForStmt111 // CHECK: NullStmt112 113 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop114 // CHECK-NEXT: if clause115 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'bool' <UserDefinedConversion>116 // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'bool'117 // CHECK-NEXT: MemberExpr{{.*}} .operator bool118 // CHECK-NEXT: DeclRefExpr{{.*}} 'const BoolConversion' lvalue Var{{.*}} 'BC' 'const BoolConversion'119 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'120 // CHECK-NEXT: ForStmt121 // CHECK: NullStmt122 123}124 125struct BoolConversion{ operator bool() const;};126struct InstTy {127 using IntTy = int;128 static constexpr float SomeFloat = 5.0;129 static constexpr BoolConversion BC;130};131 132void Instantiate() {133 TemplFunc<InstTy>();134}135#endif136