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 10 void NormalFunc() { 11 // CHECK-LABEL: NormalFunc 12 // CHECK-NEXT: CompoundStmt 13 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 14 // CHECK-NEXT: default(none) 15 // CHECK-NEXT: CompoundStmt 16 #pragma acc parallel default(none) 17 { 18 #pragma acc parallel 19 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 20 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 21 // CHECK-NEXT: default(present) 22 // CHECK-NEXT: CompoundStmt 23 #pragma acc parallel default(present) 24 {} 25 } 26 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial 27 // CHECK-NEXT: CompoundStmt 28 #pragma acc serial 29 { 30 #pragma acc serial 31 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial 32 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial 33 // CHECK-NEXT: CompoundStmt 34 #pragma acc serial 35 {} 36 } 37 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}kernels 38 // CHECK-NEXT: CompoundStmt 39 #pragma acc kernels 40 { 41 #pragma acc kernels 42 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}kernels 43 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}kernels 44 // CHECK-NEXT: CompoundStmt 45 #pragma acc kernels 46 {} 47 } 48 } 49 50 template<typename T> 51 void TemplFunc() { 52 #pragma acc parallel default(none) 53 { 54 typename T::type I; 55 } 56 57 #pragma acc serial default(present) 58 { 59 typename T::type I; 60 } 61 62 #pragma acc kernels 63 { 64 typename T::type I; 65 } 66 67 // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc 68 // CHECK-NEXT: TemplateTypeParmDecl 69 70 // Template Pattern: 71 // CHECK-NEXT: FunctionDecl 72 // CHECK-NEXT: CompoundStmt 73 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 74 // CHECK-NEXT: default(none) 75 // CHECK-NEXT: CompoundStmt 76 // CHECK-NEXT: DeclStmt 77 // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type' 78 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial 79 // CHECK-NEXT: default(present) 80 // CHECK-NEXT: CompoundStmt 81 // CHECK-NEXT: DeclStmt 82 // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type' 83 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}kernels 84 // CHECK-NEXT: CompoundStmt 85 // CHECK-NEXT: DeclStmt 86 // CHECK-NEXT: VarDecl{{.*}} I 'typename T::type' 87 88 // Check instantiation. 89 // CHECK-LABEL: FunctionDecl{{.*}} used TemplFunc 'void ()' implicit_instantiation 90 // CHECK-NEXT: TemplateArgument type 'S' 91 // CHECK-NEXT: RecordType 92 // CHECK-NEXT: CXXRecord 93 // CHECK-NEXT: CompoundStmt 94 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}parallel 95 // CHECK-NEXT: default(none) 96 // CHECK-NEXT: CompoundStmt 97 // CHECK-NEXT: DeclStmt 98 // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int' 99 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}serial 100 // CHECK-NEXT: default(present) 101 // CHECK-NEXT: CompoundStmt 102 // CHECK-NEXT: DeclStmt 103 // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int' 104 // CHECK-NEXT: OpenACCComputeConstruct {{.*}}kernels 105 // CHECK-NEXT: CompoundStmt 106 // CHECK-NEXT: DeclStmt 107 // CHECK-NEXT: VarDecl{{.*}} I 'typename S::type':'int' 108 } 109 110 struct S { 111 using type = int; 112 }; 113 114 void use() { 115 TemplFunc<S>(); 116 } 117 118 struct HasCtor { HasCtor(); operator int(); ~HasCtor();}; 119 120 void useCtorType() { 121 // CHECK-LABEL: useCtorType 122 // CHECK-NEXT: CompoundStmt 123 124 #pragma acc kernels num_workers(HasCtor{}) 125 // CHECK-NEXT: OpenACCComputeConstruct{{.*}} kernels 126 // CHECK-NEXT: num_workers clause 127 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int' <UserDefinedConversion> 128 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int' 129 // CHECK-NEXT: MemberExpr{{.*}}.operator int 130 // CHECK-NEXT: MaterializeTemporaryExpr{{.*}}'HasCtor' 131 // CHECK-NEXT: CXXBindTemporaryExpr{{.*}}'HasCtor' 132 // CHECK-NEXT: CXXTemporaryObjectExpr{{.*}}'HasCtor' 133 134 while(true); 135 // CHECK-NEXT: WhileStmt 136 // CHECK-NEXT: CXXBoolLiteralExpr 137 // CHECK-NEXT: NullStmt 138 } 139 #endif 140