240 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 10int some_int();11long some_long();12 13void NormalUses() {14 // CHECK: FunctionDecl{{.*}}NormalUses15 // CHECK-NEXT: CompoundStmt16 17#pragma acc parallel loop wait18 for (int i = 0; i < 5; ++i) {}19 // CHECK-NEXT: OpenACCCombinedConstruct{{.*}}parallel loop20 // CHECK-NEXT: wait clause21 // CHECK-NEXT: <<<NULL>>>22 // CHECK-NEXT: ForStmt23#pragma acc serial loop wait24 for (int i = 0; i < 5; ++i) {}25 // CHECK: OpenACCCombinedConstruct{{.*}}serial loop26 // CHECK-NEXT: wait clause27 // CHECK-NEXT: <<<NULL>>>28 // CHECK-NEXT: ForStmt29#pragma acc kernels loop wait(some_int(), some_long())30 for (int i = 0; i < 5; ++i) {}31 // CHECK: OpenACCCombinedConstruct{{.*}}kernels loop32 // CHECK-NEXT: wait clause33 // CHECK-NEXT: <<<NULL>>>34 // CHECK-NEXT: CallExpr{{.*}}'int'35 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>36 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'37 // CHECK-NEXT: CallExpr{{.*}}'long'38 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>39 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'40 // CHECK-NEXT: ForStmt41#pragma acc parallel loop wait(queues:some_int(), some_long())42 for (int i = 0; i < 5; ++i) {}43 // CHECK: OpenACCCombinedConstruct{{.*}}parallel loop44 // CHECK-NEXT: wait clause has queues tag45 // CHECK-NEXT: <<<NULL>>>46 // CHECK-NEXT: CallExpr{{.*}}'int'47 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>48 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'49 // CHECK-NEXT: CallExpr{{.*}}'long'50 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>51 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'52 // CHECK-NEXT: ForStmt53#pragma acc serial loop wait(devnum: some_int() :some_int(), some_long())54 for (int i = 0; i < 5; ++i) {}55 // CHECK: OpenACCCombinedConstruct{{.*}}serial loop56 // CHECK-NEXT: wait clause has devnum57 // CHECK-NEXT: CallExpr{{.*}}'int'58 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>59 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'60 // CHECK-NEXT: CallExpr{{.*}}'int'61 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>62 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'63 // CHECK-NEXT: CallExpr{{.*}}'long'64 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>65 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'66 // CHECK-NEXT: ForStmt67#pragma acc kernels loop wait(devnum: some_int() : queues :some_int(), some_long()) wait(devnum: some_int() : queues :some_int(), some_long())68 for (int i = 0; i < 5; ++i) {}69 // CHECK: OpenACCCombinedConstruct{{.*}}kernels loop70 // CHECK-NEXT: wait clause has devnum has queues tag71 // CHECK-NEXT: CallExpr{{.*}}'int'72 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>73 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'74 // CHECK-NEXT: CallExpr{{.*}}'int'75 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>76 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'77 // CHECK-NEXT: CallExpr{{.*}}'long'78 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>79 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'80 // CHECK-NEXT: wait clause has devnum has queues tag81 // CHECK-NEXT: CallExpr{{.*}}'int'82 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>83 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'84 // CHECK-NEXT: CallExpr{{.*}}'int'85 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>86 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'87 // CHECK-NEXT: CallExpr{{.*}}'long'88 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>89 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'90 // CHECK-NEXT: ForStmt91}92 93template<typename U>94void TemplUses(U u) {95 // CHECK: FunctionTemplateDecl96 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 U97 // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (U)'98 // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'99 // CHECK-NEXT: CompoundStmt100 101#pragma acc parallel loop wait102 for (int i = 0; i < 5; ++i) {}103 // CHECK: OpenACCCombinedConstruct{{.*}}parallel loop104 // CHECK-NEXT: wait clause105 // CHECK-NEXT: <<<NULL>>>106 // CHECK-NEXT: ForStmt107 108#pragma acc serial loop wait109 for (int i = 0; i < 5; ++i) {}110 // CHECK: OpenACCCombinedConstruct{{.*}}serial loop111 // CHECK-NEXT: wait clause112 // CHECK-NEXT: <<<NULL>>>113 // CHECK-NEXT: ForStmt114 115#pragma acc kernels loop wait(U::value, u)116 for (int i = 0; i < 5; ++i) {}117 // CHECK: OpenACCCombinedConstruct{{.*}}kernels loop118 // CHECK-NEXT: wait clause119 // CHECK-NEXT: <<<NULL>>>120 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue121 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'122 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'123 // CHECK-NEXT: ForStmt124 125#pragma acc parallel loop wait(queues: U::value, u)126 for (int i = 0; i < 5; ++i) {}127 // CHECK: OpenACCCombinedConstruct{{.*}}parallel loop128 // CHECK-NEXT: wait clause has queues tag129 // CHECK-NEXT: <<<NULL>>>130 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue131 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'132 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'133 // CHECK-NEXT: ForStmt134 135#pragma acc serial loop wait(devnum:u:queues: U::value, u)136 for (int i = 0; i < 5; ++i) {}137 // CHECK: OpenACCCombinedConstruct{{.*}}serial loop138 // CHECK-NEXT: wait clause has devnum has queues tag139 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'140 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue141 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'142 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'143 // CHECK-NEXT: ForStmt144 145#pragma acc kernels loop wait(devnum:u: U::value, u)146 for (int i = 0; i < 5; ++i) {}147 // CHECK: OpenACCCombinedConstruct{{.*}}kernels loop148 // CHECK-NEXT: wait clause has devnum149 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'150 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue151 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'152 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'153 // CHECK-NEXT: ForStmt154 155 // Check the instantiated versions of the above.156 // CHECK: FunctionDecl{{.*}} used TemplUses 'void (HasInt)' implicit_instantiation157 // CHECK-NEXT: TemplateArgument type 'HasInt'158 // CHECK-NEXT: RecordType{{.*}} 'HasInt'159 // CHECK-NEXT: CXXRecord{{.*}} 'HasInt'160 // CHECK-NEXT: ParmVarDecl{{.*}} used u 'HasInt'161 // CHECK-NEXT: CompoundStmt162 163 // CHECK: OpenACCCombinedConstruct{{.*}}parallel loop164 // CHECK-NEXT: wait clause165 // CHECK-NEXT: <<<NULL>>>166 // CHECK-NEXT: ForStmt167 168 // CHECK: OpenACCCombinedConstruct{{.*}}serial loop169 // CHECK-NEXT: wait clause170 // CHECK-NEXT: <<<NULL>>>171 // CHECK-NEXT: ForStmt172 173 // CHECK: OpenACCCombinedConstruct{{.*}}kernels loop174 // CHECK-NEXT: wait clause175 // CHECK-NEXT: <<<NULL>>>176 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>177 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'178 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'179 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>180 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'181 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char182 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar183 // CHECK-NEXT: ForStmt184 185 // CHECK: OpenACCCombinedConstruct{{.*}}parallel loop186 // CHECK-NEXT: wait clause has queues tag187 // CHECK-NEXT: <<<NULL>>>188 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>189 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'190 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'191 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>192 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'193 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char194 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar195 // CHECK-NEXT: ForStmt196 197 // CHECK: OpenACCCombinedConstruct{{.*}}serial loop198 // CHECK-NEXT: wait clause has devnum has queues tag199 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>200 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'201 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char202 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar203 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>204 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'205 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'206 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>207 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'208 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char209 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar210 // CHECK-NEXT: ForStmt211 212 // CHECK: OpenACCCombinedConstruct{{.*}}kernels loop213 // CHECK-NEXT: wait clause has devnum214 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>215 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'216 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char217 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar218 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>219 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'220 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'221 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>222 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'223 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char224 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar225 // CHECK-NEXT: ForStmt226}227 228struct HasInt {229 using IntTy = int;230 using ShortTy = short;231 static constexpr int value = 1;232 233 operator char();234};235 236void Inst() {237 TemplUses<HasInt>({});238}239#endif240