1 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s 2 3 // Test this with PCH. 4 // RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s 5 // RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s 6 7 #ifndef PCH_HELPER 8 #define PCH_HELPER 9 void NormalFunc(int j, float f) { 10 // CHECK: FunctionDecl{{.*}}NormalFunc 11 // CHECK-NEXT: ParmVarDecl 12 // CHECK-NEXT: ParmVarDecl 13 // CHECK-NEXT: CompoundStmt 14 #pragma acc data if( j < f) default(none) 15 ; 16 // CHECK-NEXT: OpenACCDataConstruct{{.*}}data 17 // CHECK-NEXT: if clause 18 // 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: NullStmt 26 27 } 28 29 int Global; 30 31 template<typename T> 32 void TemplFunc() { 33 // CHECK: FunctionTemplateDecl{{.*}}TemplFunc 34 // CHECK-NEXT: TemplateTypeParmDecl 35 36 // Match the prototype: 37 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc 38 // CHECK-NEXT: CompoundStmt 39 40 #pragma acc data default(none) if(T::SomeFloat < typename T::IntTy{}) 41 ; 42 // CHECK-NEXT: OpenACCDataConstruct{{.*}}data 43 // CHECK-NEXT: default(none) 44 // CHECK-NEXT: if clause 45 // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<' 46 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 47 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 48 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy' 49 // CHECK-NEXT: InitListExpr{{.*}} 'void' 50 // CHECK-NEXT: NullStmt 51 52 #pragma acc enter data copyin(Global) if(typename T::IntTy{}) 53 ; 54 // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data 55 // CHECK-NEXT: copyin clause 56 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int' 57 // CHECK-NEXT: if clause 58 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename T::IntTy' 'typename T::IntTy' 59 // CHECK-NEXT: InitListExpr{{.*}} 'void' 60 // CHECK-NEXT: NullStmt 61 62 #pragma acc exit data copyout(Global) if(T::SomeFloat) 63 ; 64 // CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data 65 // CHECK-NEXT: copyout clause 66 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int' 67 // CHECK-NEXT: if clause 68 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 69 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 70 // CHECK-NEXT: NullStmt 71 72 #pragma acc host_data use_device(Global) if(T::BC) 73 ; 74 // CHECK-NEXT: OpenACCHostDataConstruct{{.*}}host_data 75 // CHECK-NEXT: use_device clause 76 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int' 77 // CHECK-NEXT: if clause 78 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue 79 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' 80 // CHECK-NEXT: NullStmt 81 82 // Match the instantiation: 83 // CHECK: FunctionDecl{{.*}}TemplFunc{{.*}}implicit_instantiation 84 // CHECK-NEXT: TemplateArgument type 'InstTy' 85 // CHECK-NEXT: RecordType{{.*}} 'InstTy' 86 // CHECK-NEXT: CXXRecord{{.*}} 'InstTy' 87 // CHECK-NEXT: CompoundStmt 88 89 // CHECK-NEXT: OpenACCDataConstruct{{.*}}data 90 // CHECK-NEXT: default(none) 91 // CHECK-NEXT: if clause 92 // 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 struct InstTy::IntTy <NoOp> 98 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int' 99 // CHECK-NEXT: NullStmt 100 101 // CHECK-NEXT: OpenACCEnterDataConstruct{{.*}}enter data 102 // CHECK-NEXT: copyin clause 103 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int' 104 // CHECK-NEXT: if clause 105 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <IntegralToBoolean> 106 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}}'typename InstTy::IntTy':'int' functional cast to typename struct InstTy::IntTy <NoOp> 107 // CHECK-NEXT: InitListExpr {{.*}}'typename InstTy::IntTy':'int' 108 // CHECK-NEXT: NullStmt 109 110 // CHECK-NEXT: OpenACCExitDataConstruct{{.*}}exit data 111 // CHECK-NEXT: copyout clause 112 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int' 113 // CHECK-NEXT: if clause 114 // 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: NullStmt 119 120 // CHECK-NEXT: OpenACCHostDataConstruct{{.*}}host_data 121 // CHECK-NEXT: use_device clause 122 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int' 123 // CHECK-NEXT: if clause 124 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'bool' <UserDefinedConversion> 125 // CHECK-NEXT: CXXMemberCallExpr{{.*}} 'bool' 126 // CHECK-NEXT: MemberExpr{{.*}} .operator bool 127 // CHECK-NEXT: DeclRefExpr{{.*}} 'const BoolConversion' lvalue Var{{.*}} 'BC' 'const BoolConversion' 128 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy' 129 // CHECK-NEXT: NullStmt 130 131 } 132 133 struct BoolConversion{ operator bool() const;}; 134 struct InstTy { 135 using IntTy = int; 136 static constexpr float SomeFloat = 5.0; 137 static constexpr BoolConversion BC; 138 }; 139 140 void Instantiate() { 141 TemplFunc<InstTy>(); 142 } 143 #endif 144