267 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 int I;18 // CHECK-NEXT: DeclStmt19 // CHECK-NEXT: VarDecl20 21#pragma acc data copyin(I) wait22 ;23 // CHECK-NEXT: OpenACCDataConstruct{{.*}}data24 // CHECK-NEXT: copyin clause25 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'int'26 // CHECK-NEXT: wait clause27 // CHECK-NEXT: <<<NULL>>>28 // CHECK-NEXT: NullStmt29#pragma acc enter data copyin(I) wait30 // CHECK: OpenACCEnterDataConstruct{{.*}}enter data31 // CHECK-NEXT: copyin clause32 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'int'33 // CHECK-NEXT: wait clause34 // CHECK-NEXT: <<<NULL>>>35#pragma acc exit data copyout(I) wait(some_int(), some_long())36 // CHECK: OpenACCExitDataConstruct{{.*}}exit data37 // CHECK-NEXT: copyout clause38 // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'int'39 // CHECK-NEXT: wait clause40 // CHECK-NEXT: <<<NULL>>>41 // CHECK-NEXT: CallExpr{{.*}}'int'42 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>43 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'44 // CHECK-NEXT: CallExpr{{.*}}'long'45 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>46 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'47#pragma acc data copyin(I) wait(queues:some_int(), some_long())48 ;49 // CHECK: OpenACCDataConstruct{{.*}}data50 // CHECK-NEXT: copyin clause51 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'int'52 // CHECK-NEXT: wait clause has queues tag53 // CHECK-NEXT: <<<NULL>>>54 // CHECK-NEXT: CallExpr{{.*}}'int'55 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>56 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'57 // CHECK-NEXT: CallExpr{{.*}}'long'58 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>59 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'60 // CHECK-NEXT: NullStmt61#pragma acc enter data copyin(I) wait(devnum: some_int() :some_int(), some_long())62 // CHECK: OpenACCEnterDataConstruct{{.*}}enter data63 // CHECK-NEXT: copyin clause64 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'int'65 // CHECK-NEXT: wait clause has devnum66 // CHECK-NEXT: CallExpr{{.*}}'int'67 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>68 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'69 // CHECK-NEXT: CallExpr{{.*}}'int'70 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>71 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'72 // CHECK-NEXT: CallExpr{{.*}}'long'73 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>74 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'75#pragma acc exit data copyout(I) wait(devnum: some_int() : queues :some_int(), some_long()) wait(devnum: some_int() : queues :some_int(), some_long())76 // CHECK: OpenACCExitDataConstruct{{.*}}exit data77 // CHECK-NEXT: copyout clause78 // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'int'79 // CHECK-NEXT: wait clause has devnum has queues tag80 // CHECK-NEXT: CallExpr{{.*}}'int'81 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>82 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'83 // CHECK-NEXT: CallExpr{{.*}}'int'84 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>85 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'86 // CHECK-NEXT: CallExpr{{.*}}'long'87 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>88 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'89 // CHECK-NEXT: wait clause has devnum has queues tag90 // CHECK-NEXT: CallExpr{{.*}}'int'91 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>92 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'93 // CHECK-NEXT: CallExpr{{.*}}'int'94 // CHECK-NEXT: ImplicitCastExpr{{.*}}'int (*)()' <FunctionToPointerDecay>95 // CHECK-NEXT: DeclRefExpr{{.*}}'int ()' lvalue Function{{.*}} 'some_int' 'int ()'96 // CHECK-NEXT: CallExpr{{.*}}'long'97 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long (*)()' <FunctionToPointerDecay>98 // CHECK-NEXT: DeclRefExpr{{.*}}'long ()' lvalue Function{{.*}} 'some_long' 'long ()'99}100 101template<typename U>102void TemplUses(U u) {103 // CHECK: FunctionTemplateDecl104 // CHECK-NEXT: TemplateTypeParmDecl{{.*}}typename depth 0 index 0 U105 // CHECK-NEXT: FunctionDecl{{.*}} TemplUses 'void (U)'106 // CHECK-NEXT: ParmVarDecl{{.*}} referenced u 'U'107 // CHECK-NEXT: CompoundStmt108 109 U I;110 // CHECK-NEXT: DeclStmt111 // CHECK-NEXT: VarDecl112 113#pragma acc data copyin(I) wait114 ;115 // CHECK: OpenACCDataConstruct{{.*}}data116 // CHECK-NEXT: copyin clause117 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'U'118 // CHECK-NEXT: wait clause119 // CHECK-NEXT: <<<NULL>>>120 // CHECK-NEXT: NullStmt121 122#pragma acc enter data copyin(I) wait123 // CHECK: OpenACCEnterDataConstruct{{.*}}enter data124 // CHECK-NEXT: copyin clause125 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'U'126 // CHECK-NEXT: wait clause127 // CHECK-NEXT: <<<NULL>>>128 129#pragma acc exit data copyout(I) wait(U::value, u)130 // CHECK: OpenACCExitDataConstruct{{.*}}exit data131 // CHECK-NEXT: copyout clause132 // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'U'133 // CHECK-NEXT: wait clause134 // CHECK-NEXT: <<<NULL>>>135 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue136 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'137 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'138 139#pragma acc data copyin(I) wait(queues: U::value, u)140 ;141 // CHECK: OpenACCDataConstruct{{.*}}data142 // CHECK-NEXT: copyin clause143 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'U'144 // CHECK-NEXT: wait clause has queues tag145 // CHECK-NEXT: <<<NULL>>>146 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue147 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'148 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'149 // CHECK-NEXT: NullStmt150 151#pragma acc enter data copyin(I) wait(devnum:u:queues: U::value, u)152 // CHECK: OpenACCEnterDataConstruct{{.*}}data153 // CHECK-NEXT: copyin clause154 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'U'155 // CHECK-NEXT: wait clause has devnum has queues tag156 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'157 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue158 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'159 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'160 161#pragma acc exit data copyout(I) wait(devnum:u: U::value, u)162 // CHECK: OpenACCExitDataConstruct{{.*}}exit data163 // CHECK-NEXT: copyout clause164 // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'U'165 // CHECK-NEXT: wait clause has devnum166 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'167 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue168 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'U'169 // CHECK-NEXT: DeclRefExpr{{.*}} 'U' lvalue ParmVar{{.*}} 'u' 'U'170 171 // Check the instantiated versions of the above.172 // CHECK: FunctionDecl{{.*}} used TemplUses 'void (HasInt)' implicit_instantiation173 // CHECK-NEXT: TemplateArgument type 'HasInt'174 // CHECK-NEXT: RecordType{{.*}} 'HasInt'175 // CHECK-NEXT: CXXRecord{{.*}} 'HasInt'176 // CHECK-NEXT: ParmVarDecl{{.*}} used u 'HasInt'177 // CHECK-NEXT: CompoundStmt178 179 // CHECK-NEXT: DeclStmt180 // CHECK-NEXT: VarDecl181 182 // CHECK: OpenACCDataConstruct{{.*}}data183 // CHECK-NEXT: copyin clause184 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'HasInt'185 // CHECK-NEXT: wait clause186 // CHECK-NEXT: <<<NULL>>>187 // CHECK-NEXT: NullStmt188 189 // CHECK: OpenACCEnterDataConstruct{{.*}}enter data190 // CHECK-NEXT: copyin clause191 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'HasInt'192 // CHECK-NEXT: wait clause193 // CHECK-NEXT: <<<NULL>>>194 195 // CHECK: OpenACCExitDataConstruct{{.*}}exit data196 // CHECK-NEXT: copyout clause197 // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'HasInt'198 // CHECK-NEXT: wait clause199 // CHECK-NEXT: <<<NULL>>>200 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>201 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'202 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'203 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>204 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'205 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char206 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar207 208 // CHECK: OpenACCDataConstruct{{.*}}data209 // CHECK-NEXT: copyin clause210 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'HasInt'211 // CHECK-NEXT: wait clause has queues tag212 // CHECK-NEXT: <<<NULL>>>213 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>214 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'215 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'216 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>217 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'218 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char219 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar220 // CHECK-NEXT: NullStmt221 222 // CHECK: OpenACCEnterDataConstruct{{.*}}enter data223 // CHECK-NEXT: copyin clause224 // CHECK-NEXT: DeclRefExpr{{.*}}'I' 'HasInt'225 // CHECK-NEXT: wait clause has devnum has queues tag226 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>227 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'228 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char229 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar230 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>231 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'232 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'233 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>234 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'235 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char236 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar237 238 // CHECK: OpenACCExitDataConstruct{{.*}}exit data239 // CHECK-NEXT: copyout clause240 // CHECK-NEXT: DeclRefExpr{{.*}} 'I' 'HasInt'241 // CHECK-NEXT: wait clause has devnum242 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>243 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'244 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char245 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar246 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'int' <LValueToRValue>247 // CHECK-NEXT: DeclRefExpr{{.*}} 'const int' lvalue Var{{.*}} 'value' 'const int'248 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'HasInt'249 // CHECK-NEXT: ImplicitCastExpr{{.*}} 'char' <UserDefinedConversion>250 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'char'251 // CHECK-NEXT: MemberExpr{{.*}} '<bound member function type>' .operator char252 // CHECK-NEXT: DeclRefExpr{{.*}} 'HasInt' lvalue ParmVar253}254 255struct HasInt {256 using IntTy = int;257 using ShortTy = short;258 static constexpr int value = 1;259 260 operator char();261};262 263void Inst() {264 TemplUses<HasInt>({});265}266#endif267