231 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_HELPER9int some_int();10short some_short();11long some_long();12enum E{};13E some_enum();14struct CorrectConvert {15 operator int();16} Convert;17 18 19void NormalUses() {20 // CHECK: FunctionDecl{{.*}}NormalUses21 // CHECK-NEXT: CompoundStmt22#pragma acc parallel loop num_workers(some_int())23 for (unsigned i = 0; i < 5; ++i);24 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop25 // CHECK-NEXT: num_workers clause26 // CHECK-NEXT: CallExpr{{.*}}'int'27 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>28 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'29 // CHECK-NEXT: ForStmt30 // CHECK: NullStmt31 32#pragma acc kernels loop num_workers(some_short())33 for (unsigned i = 0; i < 5; ++i);34 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop35 // CHECK-NEXT: num_workers clause36 // CHECK-NEXT: CallExpr{{.*}}'short'37 // CHECK-NEXT: ImplicitCastExpr{{.*}}'short (*)()' <FunctionToPointerDecay>38 // CHECK-NEXT: DeclRefExpr{{.*}}'short ()' lvalue Function{{.*}} 'some_short' 'short ()'39 // CHECK-NEXT: ForStmt40 // CHECK: NullStmt41 42#pragma acc parallel loop num_workers(some_long())43 for (unsigned i = 0; i < 5; ++i);44 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop45 // CHECK-NEXT: num_workers clause46 // CHECK-NEXT: CallExpr{{.*}}'long'47 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>48 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'49 // CHECK-NEXT: ForStmt50 // CHECK: NullStmt51 52#pragma acc parallel loop num_workers(some_enum())53 for (unsigned i = 0; i < 5; ++i);54 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop55 // CHECK-NEXT: num_workers clause56 // CHECK-NEXT: CallExpr{{.*}}'E'57 // CHECK-NEXT: ImplicitCastExpr{{.*}}'E (*)()' <FunctionToPointerDecay>58 // CHECK-NEXT: DeclRefExpr{{.*}}'E ()' lvalue Function{{.*}} 'some_enum' 'E ()'59 // CHECK-NEXT: ForStmt60 // CHECK: NullStmt61 62#pragma acc kernels loop num_workers(Convert)63 for (unsigned i = 0; i < 5; ++i);64 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop65 // CHECK-NEXT: num_workers clause66 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>67 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'68 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int69 // CHECK-NEXT: DeclRefExpr{{.*}} 'struct CorrectConvert' lvalue Var70 // CHECK-NEXT: ForStmt71 // CHECK: NullStmt72}73 74template<typename T, typename U>75void TemplUses(T t, U u) {76 // CHECK-NEXT: FunctionTemplateDecl77 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 T78 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 1 U79 // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (T, U)'80 // CHECK-NEXT: ParmVarDecl{{.*}} referenced t 'T'81 // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'82 // CHECK-NEXT: CompoundStmt83 84#pragma acc parallel loop num_workers(t)85 for (unsigned i = 0; i < 5; ++i);86 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop87 // CHECK-NEXT: num_workers clause88 // CHECK-NEXT: DeclRefExpr{{.*}} 'T' lvalue ParmVar{{.*}} 't' 'T'89 // CHECK-NEXT: ForStmt90 // CHECK: NullStmt91 92#pragma acc kernels loop num_workers(u)93 for (unsigned i = 0; i < 5; ++i);94 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop95 // CHECK-NEXT: num_workers clause96 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'97 // CHECK-NEXT: ForStmt98 // CHECK: NullStmt99 100#pragma acc parallel loop num_workers(U::value)101 for (unsigned i = 0; i < 5; ++i);102 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop103 // CHECK-NEXT: num_workers clause104 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue105 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'106 // CHECK-NEXT: ForStmt107 // CHECK: NullStmt108 109#pragma acc kernels loop num_workers(T{})110 for (unsigned i = 0; i < 5; ++i);111 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop112 // CHECK-NEXT: num_workers clause113 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'T' 'T' list114 // CHECK-NEXT: InitListExpr{{.*}} 'void'115 // CHECK-NEXT: ForStmt116 // CHECK: NullStmt117 118#pragma acc parallel loop num_workers(U{})119 for (unsigned i = 0; i < 5; ++i);120 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop121 // CHECK-NEXT: num_workers clause122 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'U' 'U' list123 // CHECK-NEXT: InitListExpr{{.*}} 'void'124 // CHECK-NEXT: ForStmt125 // CHECK: NullStmt126 127#pragma acc kernels loop num_workers(typename U::IntTy{})128 for (unsigned i = 0; i < 5; ++i);129 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop130 // CHECK-NEXT: num_workers clause131 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename U::IntTy' 'typename U::IntTy' list132 // CHECK-NEXT: InitListExpr{{.*}} 'void'133 // CHECK-NEXT: ForStmt134 // CHECK: NullStmt135 136#pragma acc parallel loop num_workers(typename U::ShortTy{})137 for (unsigned i = 0; i < 5; ++i);138 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop139 // CHECK-NEXT: num_workers clause140 // CHECK-NEXT: CXXUnresolvedConstructExpr{{.*}} 'typename U::ShortTy' 'typename U::ShortTy' list141 // CHECK-NEXT: InitListExpr{{.*}} 'void'142 // CHECK-NEXT: ForStmt143 // CHECK: NullStmt144 145 // Check the instantiated versions of the above.146 // CHECK-NEXT: FunctionDecl{{.*}} used TemplUses 'void (CorrectConvert, HasInt)' implicit_instantiation147 // CHECK-NEXT: TemplateArgument type 'CorrectConvert'148 // CHECK-NEXT: RecordType{{.*}} 'CorrectConvert'149 // CHECK-NEXT: CXXRecord{{.*}} 'CorrectConvert'150 // CHECK-NEXT: TemplateArgument type 'HasInt'151 // CHECK-NEXT: RecordType{{.*}} 'HasInt'152 // CHECK-NEXT: CXXRecord{{.*}} 'HasInt'153 // CHECK-NEXT: ParmVarDecl{{.*}} used t 'CorrectConvert'154 // CHECK-NEXT: ParmVarDecl{{.*}} used u 'HasInt'155 // CHECK-NEXT: CompoundStmt156 157 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop158 // CHECK-NEXT: num_workers clause159 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>160 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'161 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int162 // CHECK-NEXT: DeclRefExpr{{.*}} 'CorrectConvert' lvalue ParmVar163 // CHECK-NEXT: ForStmt164 // CHECK: NullStmt165 166 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop167 // CHECK-NEXT: num_workers clause168 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>169 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'170 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char171 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar172 // CHECK-NEXT: ForStmt173 // CHECK: NullStmt174 175 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop176 // CHECK-NEXT: num_workers clause177 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>178 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'179 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'180 // CHECK-NEXT: ForStmt181 // CHECK: NullStmt182 183 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop184 // CHECK-NEXT: num_workers clause185 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <UserDefinedConversion>186 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'int'187 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator int188 // CHECK-NEXT: MaterializeTemporaryExpr{{.*}} 'CorrectConvert' lvalue189 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'CorrectConvert' functional cast to struct CorrectConvert <NoOp>190 // CHECK-NEXT: InitListExpr{{.*}}'CorrectConvert'191 // CHECK-NEXT: ForStmt192 // CHECK: NullStmt193 194 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop195 // CHECK-NEXT: num_workers clause196 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>197 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'198 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char199 // CHECK-NEXT: MaterializeTemporaryExpr{{.*}} 'HasInt' lvalue200 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'HasInt' functional cast to struct HasInt <NoOp>201 // CHECK-NEXT: InitListExpr{{.*}}'HasInt'202 // CHECK-NEXT: ForStmt203 // CHECK: NullStmt204 205 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} kernels loop206 // CHECK-NEXT: num_workers clause207 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'typename HasInt::IntTy':'int' functional cast to typename HasInt::IntTy <NoOp>208 // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::IntTy':'int'209 // CHECK-NEXT: ForStmt210 // CHECK: NullStmt211 212 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}} parallel loop213 // CHECK-NEXT: num_workers clause214 // CHECK-NEXT: CXXFunctionalCastExpr{{.*}} 'typename HasInt::ShortTy':'short' functional cast to typename HasInt::ShortTy <NoOp>215 // CHECK-NEXT: InitListExpr{{.*}}'typename HasInt::ShortTy':'short'216 // CHECK-NEXT: ForStmt217 // CHECK: NullStmt218}219struct HasInt {220 using IntTy = int;221 using ShortTy = short;222 static constexpr int value = 1;223 224 operator char();225};226 227void Inst() {228 TemplUses<CorrectConvert, HasInt>({}, {});229}230#endif // PCH_HELPER231