123 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_HELPER9 10template<typename T>11void TemplFunc() {12 // CHECK: FunctionTemplateDecl{{.*}}TemplFunc13 // CHECK-NEXT: TemplateTypeParmDecl14 15 // Match the prototype:16 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc17 // CHECK-NEXT: CompoundStmt18 19#pragma acc serial loop self20 for (unsigned i = 0; i < 5; ++i);21 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}serial loop22 // CHECK-NEXT: self clause23 // CHECK-NEXT: <<<NULL>>24 // CHECK-NEXT: ForStmt25 // CHECK: NullStmt26 27#pragma acc kernels loop self(T::SomeFloat)28 for (unsigned i = 0; i < 5; ++i);29 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}kernels loop30 // CHECK-NEXT: self clause31 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue32 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'33 // CHECK-NEXT: ForStmt34 // CHECK: NullStmt35 36#pragma acc parallel loop self(T::SomeFloat) if (T::SomeFloat)37 for (unsigned i = 0; i < 5; ++i);38 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop39 // CHECK-NEXT: self clause40 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue41 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'42 // CHECK-NEXT: if clause43 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue44 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'45 // CHECK-NEXT: ForStmt46 // CHECK: NullStmt47 48#pragma acc serial loop if(T::SomeFloat) self(T::SomeFloat)49 for (unsigned i = 0; i < 5; ++i);50 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}serial loop51 // CHECK-NEXT: if clause52 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue53 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'54 // CHECK-NEXT: self clause55 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue56 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'57 // CHECK-NEXT: ForStmt58 // CHECK: NullStmt59 //60 // Match the instantiation:61 // CHECK: FunctionDecl{{.*}}TemplFunc{{.*}}implicit_instantiation62 // CHECK-NEXT: TemplateArgument type 'InstTy'63 // CHECK-NEXT: RecordType{{.*}} 'InstTy'64 // CHECK-NEXT: CXXRecord{{.*}} 'InstTy'65 // CHECK-NEXT: CompoundStmt66 //67 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}serial loop68 // CHECK-NEXT: self clause69 // CHECK-NEXT: <<<NULL>>70 // CHECK-NEXT: ForStmt71 // CHECK: NullStmt72 73 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}kernels loop74 // CHECK-NEXT: self clause75 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>76 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>77 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'78 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'79 // CHECK-NEXT: ForStmt80 // CHECK: NullStmt81 82 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop83 // CHECK-NEXT: self clause84 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>85 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>86 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'87 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'88 // CHECK-NEXT: if clause89 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>90 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>91 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'92 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'93 // CHECK-NEXT: ForStmt94 // CHECK: NullStmt95 96 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}serial loop97 // CHECK-NEXT: if clause98 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>99 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>100 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'101 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'102 // CHECK-NEXT: self clause103 // CHECK-NEXT: ImplicitCastExpr{{.*}}'bool' <FloatingToBoolean>104 // CHECK-NEXT: ImplicitCastExpr{{.*}}'float' <LValueToRValue>105 // CHECK-NEXT: DeclRefExpr{{.*}} 'const float' lvalue Var{{.*}} 'SomeFloat' 'const float'106 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'InstTy'107 // CHECK-NEXT: ForStmt108 // CHECK: NullStmt109 110}111 112struct BoolConversion{ operator bool() const;};113struct InstTy {114 using IntTy = int;115 static constexpr float SomeFloat = 5.0;116 static constexpr BoolConversion BC;117};118 119void Instantiate() {120 TemplFunc<InstTy>();121}122#endif123