144 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 data if( j < f) default(none)15 ;16 // CHECK-NEXT: OpenACCDataConstruct{{.*}}data17 // 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: default(none)25 // CHECK-NEXT: NullStmt26 27}28 29int Global;30 31template<typename T>32void TemplFunc() {33 // CHECK: FunctionTemplateDecl{{.*}}TemplFunc34 // CHECK-NEXT: TemplateTypeParmDecl35 36 // Match the prototype:37 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc38 // CHECK-NEXT: CompoundStmt39 40#pragma acc data default(none) if(T::SomeFloat < typename T::IntTy{})41 ;42 // CHECK-NEXT: OpenACCDataConstruct{{.*}}data43 // CHECK-NEXT: default(none)44 // CHECK-NEXT: if clause45 // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'46 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue47 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'48 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'49 // CHECK-NEXT: InitListExpr{{.*}} 'void'50 // CHECK-NEXT: NullStmt51 52#pragma acc enter data copyin(Global) if(typename T::IntTy{})53 ;54 // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data55 // CHECK-NEXT: copyin clause56 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'57 // CHECK-NEXT: if clause58 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy'59 // CHECK-NEXT: InitListExpr{{.*}} 'void'60 // CHECK-NEXT: NullStmt61 62#pragma acc exit data copyout(Global) if(T::SomeFloat)63 ;64 // CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data65 // CHECK-NEXT: copyout clause66 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'67 // CHECK-NEXT: if clause68 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue69 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'70 // CHECK-NEXT: NullStmt71 72#pragma acc host_data use_device(Global) if(T::BC)73 ;74 // CHECK-NEXT: OpenACCHostDataConstruct{{.*}}host_data75 // CHECK-NEXT: use_device clause76 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'77 // CHECK-NEXT: if clause78 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue79 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'80 // CHECK-NEXT: NullStmt81 82 // Match the instantiation:83 // CHECK: FunctionDecl{{.*}}TemplFunc{{.*}}implicit_instantiation84 // CHECK-NEXT: TemplateArgument type 'InstTy'85 // CHECK-NEXT: RecordType{{.*}} 'InstTy'86 // CHECK-NEXT: CXXRecord{{.*}} 'InstTy'87 // CHECK-NEXT: CompoundStmt88 89 // CHECK-NEXT: OpenACCDataConstruct{{.*}}data90 // CHECK-NEXT: default(none)91 // CHECK-NEXT: if clause92 // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'93 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>94 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'95 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'96 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <IntegralToFloating>97 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename InstTy::IntTy <NoOp>98 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'99 // CHECK-NEXT: NullStmt100 101 // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data102 // CHECK-NEXT: copyin clause103 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'104 // CHECK-NEXT: if clause105 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <IntegralToBoolean>106 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename InstTy::IntTy <NoOp>107 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int'108 // CHECK-NEXT: NullStmt109 110 // CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data111 // CHECK-NEXT: copyout clause112 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'113 // CHECK-NEXT: if clause114 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>115 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>116 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'117 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'118 // CHECK-NEXT: NullStmt119 120 // CHECK-NEXT: OpenACCHostDataConstruct{{.*}}host_data121 // CHECK-NEXT: use_device clause122 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'123 // CHECK-NEXT: if clause124 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'bool' <UserDefinedConversion>125 // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'bool'126 // CHECK-NEXT: MemberExpr{{.*}} .operator bool127 // CHECK-NEXT: DeclRefExpr{{.*}} 'const BoolConversion' lvalue Var{{.*}} 'BC' 'const BoolConversion'128 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'129 // CHECK-NEXT: NullStmt130 131}132 133struct BoolConversion{ operator bool() const;};134struct InstTy {135 using IntTy = int;136 static constexpr float SomeFloat = 5.0;137 static constexpr BoolConversion BC;138};139 140void Instantiate() {141 TemplFunc<InstTy>();142}143#endif144