374 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 13int Global;14short GlobalArray[5];15 16 17void NormalFunc() {18 // CHECK-LABEL: NormalFunc19 // CHECK-NEXT: CompoundStmt20 21#pragma acc update self(Global) if_present if (some_int() < some_long())22 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update23 // CHECK-NEXT: self clause24 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'25 // CHECK-NEXT: if_present clause26 // CHECK-NEXT: if clause27 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'28 // CHECK-NEXT: ImplicitCastExpr{{.*}}'long'29 // CHECK-NEXT: CallExpr{{.*}}'int'30 // CHECK-NEXT: ImplicitCastExpr31 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'32 // CHECK-NEXT: CallExpr{{.*}} 'long'33 // CHECK-NEXT: ImplicitCastExpr34 // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'35 36#pragma acc update self(Global) wait async device_type(nvidia) dtype(radeon)37 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update38 // CHECK-NEXT: self clause39 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'40 // CHECK-NEXT: wait clause41 // CHECK-NEXT: <<<NULL>>>42 // CHECK-NEXT: async clause43 // CHECK-NEXT: device_type(nvidia)44 // CHECK-NEXT: dtype(radeon)45#pragma acc update self(Global) wait(some_int(), some_long()) async(some_int())46 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update47 // CHECK-NEXT: self clause48 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'49 // CHECK-NEXT: wait clause50 // CHECK-NEXT: <<<NULL>>>51 // CHECK-NEXT: CallExpr{{.*}}'int'52 // CHECK-NEXT: ImplicitCastExpr53 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'54 // CHECK-NEXT: CallExpr{{.*}}'long'55 // CHECK-NEXT: ImplicitCastExpr56 // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'57 // CHECK-NEXT: async clause58 // CHECK-NEXT: CallExpr{{.*}}'int'59 // CHECK-NEXT: ImplicitCastExpr60 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'61#pragma acc update self(Global) wait(queues:some_int(), some_long())62 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update63 // CHECK-NEXT: self clause64 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'65 // CHECK-NEXT: wait clause66 // CHECK-NEXT: <<<NULL>>>67 // CHECK-NEXT: CallExpr{{.*}}'int'68 // CHECK-NEXT: ImplicitCastExpr69 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'70 // CHECK-NEXT: CallExpr{{.*}}'long'71 // CHECK-NEXT: ImplicitCastExpr72 // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'73#pragma acc update self(Global) wait(devnum: some_int() :some_int(), some_long())74 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update75 // CHECK-NEXT: self clause76 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'77 // CHECK-NEXT: wait clause78 // CHECK-NEXT: CallExpr{{.*}}'int'79 // CHECK-NEXT: ImplicitCastExpr80 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'81 // CHECK-NEXT: CallExpr{{.*}}'int'82 // CHECK-NEXT: ImplicitCastExpr83 // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()'84 // CHECK-NEXT: CallExpr{{.*}}'long'85 // CHECK-NEXT: ImplicitCastExpr86 // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()'87 88#pragma acc update self(Global, GlobalArray, GlobalArray[0], GlobalArray[0:1])89 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update90 // CHECK-NEXT: self clause91 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'92 // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'93 // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'short' lvalue94 // CHECK-NEXT: ImplicitCastExpr95 // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'96 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 097 // CHECK-NEXT: ArraySectionExpr98 // CHECK-NEXT: ImplicitCastExpr99 // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'100 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0101 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1102 103#pragma acc update host(Global, GlobalArray, GlobalArray[0], GlobalArray[0:1]) device(Global, GlobalArray, GlobalArray[0], GlobalArray[0:1])104 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update105 // CHECK-NEXT: host clause106 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'107 // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'108 // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'short' lvalue109 // CHECK-NEXT: ImplicitCastExpr110 // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'111 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0112 // CHECK-NEXT: ArraySectionExpr113 // CHECK-NEXT: ImplicitCastExpr114 // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'115 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0116 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1117 // CHECK-NEXT: device clause118 // CHECK-NEXT: DeclRefExpr{{.*}}'Global' 'int'119 // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'120 // CHECK-NEXT: ArraySubscriptExpr{{.*}} 'short' lvalue121 // CHECK-NEXT: ImplicitCastExpr122 // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'123 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0124 // CHECK-NEXT: ArraySectionExpr125 // CHECK-NEXT: ImplicitCastExpr126 // CHECK-NEXT: DeclRefExpr{{.*}}'GlobalArray' 'short[5]'127 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 0128 // CHECK-NEXT: IntegerLiteral{{.*}} 'int' 1129}130 131template<typename T>132void TemplFunc(T t) {133 // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc134 // CHECK-NEXT: TemplateTypeParmDecl135 // CHECK-NEXT: FunctionDecl{{.*}}TemplFunc136 // CHECK-NEXT: ParmVarDecl{{.*}} t 'T'137 // CHECK-NEXT: CompoundStmt138 139#pragma acc update self(t) if_present if (T::value < t)140 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update141 // CHECK-NEXT: self clause142 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'143 // CHECK-NEXT: if_present clause144 // CHECK-NEXT: if clause145 // CHECK-NEXT: BinaryOperator{{.*}}'<dependent type>' '<'146 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>'147 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'148 // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'T'149 150#pragma acc update self(t) wait async device_type(default) dtype(host)151 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update152 // CHECK-NEXT: self clause153 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'154 // CHECK-NEXT: wait clause155 // CHECK-NEXT: <<<NULL>>>156 // CHECK-NEXT: async clause157 // CHECK-NEXT: device_type(default)158 // CHECK-NEXT: dtype(host)159#pragma acc update self(t) wait(T::value, t) async(T::value)160 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update161 // CHECK-NEXT: self clause162 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'163 // CHECK-NEXT: wait clause164 // CHECK-NEXT: <<<NULL>>>165 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'166 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'167 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'168 // CHECK-NEXT: async clause169 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'170 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'171#pragma acc update self(t) wait(queues:T::value, t) async(t)172 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update173 // CHECK-NEXT: self clause174 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'175 // CHECK-NEXT: wait clause176 // CHECK-NEXT: <<<NULL>>>177 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'178 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'179 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'180 // CHECK-NEXT: async clause181 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'182#pragma acc update self(t) wait(devnum: T::value:t, T::value)183 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update184 // CHECK-NEXT: self clause185 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'186 // CHECK-NEXT: wait clause187 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'188 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'189 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'T'190 // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}}'<dependent type>'191 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T'192 193 decltype(T::value) Local = 0, LocalArray[5] = {};194 // CHECK-NEXT: DeclStmt 195 // CHECK-NEXT: VarDecl196 // CHECK-NEXT: IntegerLiteral197 // CHECK-NEXT: VarDecl198 // CHECK-NEXT: InitListExpr199 200#pragma acc update self(Local, LocalArray, LocalArray[0], LocalArray[0:1])201 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update202 // CHECK-NEXT: self clause203 // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(T::value)'204 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'205 // CHECK-NEXT: ArraySubscriptExpr206 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'207 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0208 // CHECK-NEXT: ArraySectionExpr209 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'210 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0211 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1212 213#pragma acc update host(Local, LocalArray, LocalArray[0], LocalArray[0:1]) device(Local, LocalArray, LocalArray[0], LocalArray[0:1])214 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update215 // CHECK-NEXT: host clause216 // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(T::value)'217 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'218 // CHECK-NEXT: ArraySubscriptExpr219 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'220 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0221 // CHECK-NEXT: ArraySectionExpr222 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'223 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0224 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1225 // CHECK-NEXT: device clause226 // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(T::value)'227 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'228 // CHECK-NEXT: ArraySubscriptExpr229 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'230 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0231 // CHECK-NEXT: ArraySectionExpr232 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(T::value)[5]'233 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0234 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1235 236 // Instantiation:237 // CHECK-NEXT: FunctionDecl{{.*}} TemplFunc 'void (SomeStruct)' implicit_instantiation238 // CHECK-NEXT: TemplateArgument type 'SomeStruct'239 // CHECK-NEXT: RecordType{{.*}} 'SomeStruct'240 // CHECK-NEXT: CXXRecord{{.*}} 'SomeStruct'241 // CHECK-NEXT: ParmVarDecl{{.*}} t 'SomeStruct'242 // CHECK-NEXT: CompoundStmt243 244 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update245 // CHECK-NEXT: self clause246 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'247 // CHECK-NEXT: if_present clause248 // CHECK-NEXT: if clause249 // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<'250 // CHECK-NEXT: ImplicitCastExpr {{.*}}'unsigned int'251 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'252 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'253 // CHECK-NEXT: ImplicitCastExpr {{.*}}'unsigned int'254 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'255 // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int256 // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct'257 258 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update259 // CHECK-NEXT: self clause260 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'261 // CHECK-NEXT: wait clause262 // CHECK-NEXT: <<<NULL>>>263 // CHECK-NEXT: async clause264 // CHECK-NEXT: device_type(default)265 // CHECK-NEXT: dtype(host)266 267 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update268 // CHECK-NEXT: self clause269 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'270 // CHECK-NEXT: wait clause271 // CHECK-NEXT: <<<NULL>>>272 // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'273 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'274 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'275 // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'276 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'277 // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int278 // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct'279 // CHECK-NEXT: async clause280 // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'281 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'282 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'283 284 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update285 // CHECK-NEXT: self clause286 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'287 // CHECK-NEXT: wait clause288 // CHECK-NEXT: <<<NULL>>>289 // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'290 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'291 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'292 // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'293 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'294 // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int295 // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct'296 // CHECK-NEXT: async clause297 // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'298 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'299 // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int300 // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct'301 302 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update303 // CHECK-NEXT: self clause304 // CHECK-NEXT: DeclRefExpr{{.*}} 't' 'SomeStruct'305 // CHECK-NEXT: wait clause306 // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'307 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'308 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'309 // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'310 // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int'311 // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int312 // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct'313 // CHECK-NEXT: ImplicitCastExpr{{.*}}'unsigned int'314 // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int'315 // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct'316 317 // CHECK-NEXT: DeclStmt 318 // CHECK-NEXT: VarDecl319 // CHECK-NEXT: ImplicitCastExpr320 // CHECK-NEXT: IntegerLiteral321 // CHECK-NEXT: VarDecl322 // CHECK-NEXT: InitListExpr323 // CHECK-NEXT: array_filler324 325 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update326 // CHECK-NEXT: self clause327 // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(SomeStruct::value)':'const unsigned int'328 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'329 // CHECK-NEXT: ArraySubscriptExpr330 // CHECK-NEXT: ImplicitCastExpr331 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'332 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0333 // CHECK-NEXT: ArraySectionExpr334 // CHECK-NEXT: ImplicitCastExpr335 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'336 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0337 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1338 339 // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update340 // CHECK-NEXT: host clause341 // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(SomeStruct::value)':'const unsigned int'342 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'343 // CHECK-NEXT: ArraySubscriptExpr344 // CHECK-NEXT: ImplicitCastExpr345 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'346 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0347 // CHECK-NEXT: ArraySectionExpr348 // CHECK-NEXT: ImplicitCastExpr349 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'350 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0351 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1352 // CHECK-NEXT: device clause353 // CHECK-NEXT: DeclRefExpr{{.*}} 'Local' 'decltype(SomeStruct::value)':'const unsigned int'354 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'355 // CHECK-NEXT: ArraySubscriptExpr356 // CHECK-NEXT: ImplicitCastExpr357 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'358 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0359 // CHECK-NEXT: ArraySectionExpr360 // CHECK-NEXT: ImplicitCastExpr361 // CHECK-NEXT: DeclRefExpr{{.*}} 'LocalArray' 'decltype(SomeStruct::value)[5]'362 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 0363 // CHECK-NEXT: IntegerLiteral{{.*}}'int' 1364}365 366struct SomeStruct{367 static constexpr unsigned value = 5;368 operator unsigned();369};370void use() {371 TemplFunc(SomeStruct{});372}373#endif374