1 //===- ASTReaderStmt.cpp - Stmt/Expr Deserialization ----------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Statement/expression deserialization. This implements the 10 // ASTReader::ReadStmt method. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "clang/Serialization/ASTRecordReader.h" 15 #include "clang/AST/ASTConcept.h" 16 #include "clang/AST/ASTContext.h" 17 #include "clang/AST/AttrIterator.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclAccessPair.h" 20 #include "clang/AST/DeclCXX.h" 21 #include "clang/AST/DeclGroup.h" 22 #include "clang/AST/DeclObjC.h" 23 #include "clang/AST/DeclTemplate.h" 24 #include "clang/AST/DeclarationName.h" 25 #include "clang/AST/Expr.h" 26 #include "clang/AST/ExprCXX.h" 27 #include "clang/AST/ExprObjC.h" 28 #include "clang/AST/ExprOpenMP.h" 29 #include "clang/AST/NestedNameSpecifier.h" 30 #include "clang/AST/OpenMPClause.h" 31 #include "clang/AST/OperationKinds.h" 32 #include "clang/AST/Stmt.h" 33 #include "clang/AST/StmtCXX.h" 34 #include "clang/AST/StmtObjC.h" 35 #include "clang/AST/StmtOpenMP.h" 36 #include "clang/AST/StmtVisitor.h" 37 #include "clang/AST/TemplateBase.h" 38 #include "clang/AST/Type.h" 39 #include "clang/AST/UnresolvedSet.h" 40 #include "clang/Basic/CapturedStmt.h" 41 #include "clang/Basic/ExpressionTraits.h" 42 #include "clang/Basic/LLVM.h" 43 #include "clang/Basic/Lambda.h" 44 #include "clang/Basic/LangOptions.h" 45 #include "clang/Basic/OpenMPKinds.h" 46 #include "clang/Basic/OperatorKinds.h" 47 #include "clang/Basic/SourceLocation.h" 48 #include "clang/Basic/Specifiers.h" 49 #include "clang/Basic/TypeTraits.h" 50 #include "clang/Lex/Token.h" 51 #include "clang/Serialization/ASTBitCodes.h" 52 #include "llvm/ADT/DenseMap.h" 53 #include "llvm/ADT/SmallString.h" 54 #include "llvm/ADT/SmallVector.h" 55 #include "llvm/ADT/StringRef.h" 56 #include "llvm/Bitstream/BitstreamReader.h" 57 #include "llvm/Support/Casting.h" 58 #include "llvm/Support/ErrorHandling.h" 59 #include <algorithm> 60 #include <cassert> 61 #include <cstdint> 62 #include <string> 63 64 using namespace clang; 65 using namespace serialization; 66 67 namespace clang { 68 69 class ASTStmtReader : public StmtVisitor<ASTStmtReader> { 70 ASTRecordReader &Record; 71 llvm::BitstreamCursor &DeclsCursor; 72 73 SourceLocation readSourceLocation() { 74 return Record.readSourceLocation(); 75 } 76 77 SourceRange readSourceRange() { 78 return Record.readSourceRange(); 79 } 80 81 std::string readString() { 82 return Record.readString(); 83 } 84 85 TypeSourceInfo *readTypeSourceInfo() { 86 return Record.readTypeSourceInfo(); 87 } 88 89 Decl *readDecl() { 90 return Record.readDecl(); 91 } 92 93 template<typename T> 94 T *readDeclAs() { 95 return Record.readDeclAs<T>(); 96 } 97 98 public: 99 ASTStmtReader(ASTRecordReader &Record, llvm::BitstreamCursor &Cursor) 100 : Record(Record), DeclsCursor(Cursor) {} 101 102 /// The number of record fields required for the Stmt class 103 /// itself. 104 static const unsigned NumStmtFields = 1; 105 106 /// The number of record fields required for the Expr class 107 /// itself. 108 static const unsigned NumExprFields = NumStmtFields + 7; 109 110 /// Read and initialize a ExplicitTemplateArgumentList structure. 111 void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, 112 TemplateArgumentLoc *ArgsLocArray, 113 unsigned NumTemplateArgs); 114 115 /// Read and initialize a ExplicitTemplateArgumentList structure. 116 void ReadExplicitTemplateArgumentList(ASTTemplateArgumentListInfo &ArgList, 117 unsigned NumTemplateArgs); 118 119 void VisitStmt(Stmt *S); 120 #define STMT(Type, Base) \ 121 void Visit##Type(Type *); 122 #include "clang/AST/StmtNodes.inc" 123 }; 124 125 } // namespace clang 126 127 void ASTStmtReader::ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, 128 TemplateArgumentLoc *ArgsLocArray, 129 unsigned NumTemplateArgs) { 130 SourceLocation TemplateKWLoc = readSourceLocation(); 131 TemplateArgumentListInfo ArgInfo; 132 ArgInfo.setLAngleLoc(readSourceLocation()); 133 ArgInfo.setRAngleLoc(readSourceLocation()); 134 for (unsigned i = 0; i != NumTemplateArgs; ++i) 135 ArgInfo.addArgument(Record.readTemplateArgumentLoc()); 136 Args.initializeFrom(TemplateKWLoc, ArgInfo, ArgsLocArray); 137 } 138 139 void ASTStmtReader::VisitStmt(Stmt *S) { 140 S->setIsOMPStructuredBlock(Record.readInt()); 141 assert(Record.getIdx() == NumStmtFields && "Incorrect statement field count"); 142 } 143 144 void ASTStmtReader::VisitNullStmt(NullStmt *S) { 145 VisitStmt(S); 146 S->setSemiLoc(readSourceLocation()); 147 S->NullStmtBits.HasLeadingEmptyMacro = Record.readInt(); 148 } 149 150 void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) { 151 VisitStmt(S); 152 SmallVector<Stmt *, 16> Stmts; 153 unsigned NumStmts = Record.readInt(); 154 while (NumStmts--) 155 Stmts.push_back(Record.readSubStmt()); 156 S->setStmts(Stmts); 157 S->CompoundStmtBits.LBraceLoc = readSourceLocation(); 158 S->RBraceLoc = readSourceLocation(); 159 } 160 161 void ASTStmtReader::VisitSwitchCase(SwitchCase *S) { 162 VisitStmt(S); 163 Record.recordSwitchCaseID(S, Record.readInt()); 164 S->setKeywordLoc(readSourceLocation()); 165 S->setColonLoc(readSourceLocation()); 166 } 167 168 void ASTStmtReader::VisitCaseStmt(CaseStmt *S) { 169 VisitSwitchCase(S); 170 bool CaseStmtIsGNURange = Record.readInt(); 171 S->setLHS(Record.readSubExpr()); 172 S->setSubStmt(Record.readSubStmt()); 173 if (CaseStmtIsGNURange) { 174 S->setRHS(Record.readSubExpr()); 175 S->setEllipsisLoc(readSourceLocation()); 176 } 177 } 178 179 void ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) { 180 VisitSwitchCase(S); 181 S->setSubStmt(Record.readSubStmt()); 182 } 183 184 void ASTStmtReader::VisitLabelStmt(LabelStmt *S) { 185 VisitStmt(S); 186 auto *LD = readDeclAs<LabelDecl>(); 187 LD->setStmt(S); 188 S->setDecl(LD); 189 S->setSubStmt(Record.readSubStmt()); 190 S->setIdentLoc(readSourceLocation()); 191 } 192 193 void ASTStmtReader::VisitAttributedStmt(AttributedStmt *S) { 194 VisitStmt(S); 195 // NumAttrs in AttributedStmt is set when creating an empty 196 // AttributedStmt in AttributedStmt::CreateEmpty, since it is needed 197 // to allocate the right amount of space for the trailing Attr *. 198 uint64_t NumAttrs = Record.readInt(); 199 AttrVec Attrs; 200 Record.readAttributes(Attrs); 201 (void)NumAttrs; 202 assert(NumAttrs == S->AttributedStmtBits.NumAttrs); 203 assert(NumAttrs == Attrs.size()); 204 std::copy(Attrs.begin(), Attrs.end(), S->getAttrArrayPtr()); 205 S->SubStmt = Record.readSubStmt(); 206 S->AttributedStmtBits.AttrLoc = readSourceLocation(); 207 } 208 209 void ASTStmtReader::VisitIfStmt(IfStmt *S) { 210 VisitStmt(S); 211 212 S->setConstexpr(Record.readInt()); 213 bool HasElse = Record.readInt(); 214 bool HasVar = Record.readInt(); 215 bool HasInit = Record.readInt(); 216 217 S->setCond(Record.readSubExpr()); 218 S->setThen(Record.readSubStmt()); 219 if (HasElse) 220 S->setElse(Record.readSubStmt()); 221 if (HasVar) 222 S->setConditionVariable(Record.getContext(), readDeclAs<VarDecl>()); 223 if (HasInit) 224 S->setInit(Record.readSubStmt()); 225 226 S->setIfLoc(readSourceLocation()); 227 if (HasElse) 228 S->setElseLoc(readSourceLocation()); 229 } 230 231 void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) { 232 VisitStmt(S); 233 234 bool HasInit = Record.readInt(); 235 bool HasVar = Record.readInt(); 236 bool AllEnumCasesCovered = Record.readInt(); 237 if (AllEnumCasesCovered) 238 S->setAllEnumCasesCovered(); 239 240 S->setCond(Record.readSubExpr()); 241 S->setBody(Record.readSubStmt()); 242 if (HasInit) 243 S->setInit(Record.readSubStmt()); 244 if (HasVar) 245 S->setConditionVariable(Record.getContext(), readDeclAs<VarDecl>()); 246 247 S->setSwitchLoc(readSourceLocation()); 248 249 SwitchCase *PrevSC = nullptr; 250 for (auto E = Record.size(); Record.getIdx() != E; ) { 251 SwitchCase *SC = Record.getSwitchCaseWithID(Record.readInt()); 252 if (PrevSC) 253 PrevSC->setNextSwitchCase(SC); 254 else 255 S->setSwitchCaseList(SC); 256 257 PrevSC = SC; 258 } 259 } 260 261 void ASTStmtReader::VisitWhileStmt(WhileStmt *S) { 262 VisitStmt(S); 263 264 bool HasVar = Record.readInt(); 265 266 S->setCond(Record.readSubExpr()); 267 S->setBody(Record.readSubStmt()); 268 if (HasVar) 269 S->setConditionVariable(Record.getContext(), readDeclAs<VarDecl>()); 270 271 S->setWhileLoc(readSourceLocation()); 272 } 273 274 void ASTStmtReader::VisitDoStmt(DoStmt *S) { 275 VisitStmt(S); 276 S->setCond(Record.readSubExpr()); 277 S->setBody(Record.readSubStmt()); 278 S->setDoLoc(readSourceLocation()); 279 S->setWhileLoc(readSourceLocation()); 280 S->setRParenLoc(readSourceLocation()); 281 } 282 283 void ASTStmtReader::VisitForStmt(ForStmt *S) { 284 VisitStmt(S); 285 S->setInit(Record.readSubStmt()); 286 S->setCond(Record.readSubExpr()); 287 S->setConditionVariable(Record.getContext(), readDeclAs<VarDecl>()); 288 S->setInc(Record.readSubExpr()); 289 S->setBody(Record.readSubStmt()); 290 S->setForLoc(readSourceLocation()); 291 S->setLParenLoc(readSourceLocation()); 292 S->setRParenLoc(readSourceLocation()); 293 } 294 295 void ASTStmtReader::VisitGotoStmt(GotoStmt *S) { 296 VisitStmt(S); 297 S->setLabel(readDeclAs<LabelDecl>()); 298 S->setGotoLoc(readSourceLocation()); 299 S->setLabelLoc(readSourceLocation()); 300 } 301 302 void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) { 303 VisitStmt(S); 304 S->setGotoLoc(readSourceLocation()); 305 S->setStarLoc(readSourceLocation()); 306 S->setTarget(Record.readSubExpr()); 307 } 308 309 void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) { 310 VisitStmt(S); 311 S->setContinueLoc(readSourceLocation()); 312 } 313 314 void ASTStmtReader::VisitBreakStmt(BreakStmt *S) { 315 VisitStmt(S); 316 S->setBreakLoc(readSourceLocation()); 317 } 318 319 void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) { 320 VisitStmt(S); 321 322 bool HasNRVOCandidate = Record.readInt(); 323 324 S->setRetValue(Record.readSubExpr()); 325 if (HasNRVOCandidate) 326 S->setNRVOCandidate(readDeclAs<VarDecl>()); 327 328 S->setReturnLoc(readSourceLocation()); 329 } 330 331 void ASTStmtReader::VisitDeclStmt(DeclStmt *S) { 332 VisitStmt(S); 333 S->setStartLoc(readSourceLocation()); 334 S->setEndLoc(readSourceLocation()); 335 336 if (Record.size() - Record.getIdx() == 1) { 337 // Single declaration 338 S->setDeclGroup(DeclGroupRef(readDecl())); 339 } else { 340 SmallVector<Decl *, 16> Decls; 341 int N = Record.size() - Record.getIdx(); 342 Decls.reserve(N); 343 for (int I = 0; I < N; ++I) 344 Decls.push_back(readDecl()); 345 S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Record.getContext(), 346 Decls.data(), 347 Decls.size()))); 348 } 349 } 350 351 void ASTStmtReader::VisitAsmStmt(AsmStmt *S) { 352 VisitStmt(S); 353 S->NumOutputs = Record.readInt(); 354 S->NumInputs = Record.readInt(); 355 S->NumClobbers = Record.readInt(); 356 S->setAsmLoc(readSourceLocation()); 357 S->setVolatile(Record.readInt()); 358 S->setSimple(Record.readInt()); 359 } 360 361 void ASTStmtReader::VisitGCCAsmStmt(GCCAsmStmt *S) { 362 VisitAsmStmt(S); 363 S->NumLabels = Record.readInt(); 364 S->setRParenLoc(readSourceLocation()); 365 S->setAsmString(cast_or_null<StringLiteral>(Record.readSubStmt())); 366 367 unsigned NumOutputs = S->getNumOutputs(); 368 unsigned NumInputs = S->getNumInputs(); 369 unsigned NumClobbers = S->getNumClobbers(); 370 unsigned NumLabels = S->getNumLabels(); 371 372 // Outputs and inputs 373 SmallVector<IdentifierInfo *, 16> Names; 374 SmallVector<StringLiteral*, 16> Constraints; 375 SmallVector<Stmt*, 16> Exprs; 376 for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) { 377 Names.push_back(Record.readIdentifier()); 378 Constraints.push_back(cast_or_null<StringLiteral>(Record.readSubStmt())); 379 Exprs.push_back(Record.readSubStmt()); 380 } 381 382 // Constraints 383 SmallVector<StringLiteral*, 16> Clobbers; 384 for (unsigned I = 0; I != NumClobbers; ++I) 385 Clobbers.push_back(cast_or_null<StringLiteral>(Record.readSubStmt())); 386 387 // Labels 388 for (unsigned I = 0, N = NumLabels; I != N; ++I) 389 Exprs.push_back(Record.readSubStmt()); 390 391 S->setOutputsAndInputsAndClobbers(Record.getContext(), 392 Names.data(), Constraints.data(), 393 Exprs.data(), NumOutputs, NumInputs, 394 NumLabels, 395 Clobbers.data(), NumClobbers); 396 } 397 398 void ASTStmtReader::VisitMSAsmStmt(MSAsmStmt *S) { 399 VisitAsmStmt(S); 400 S->LBraceLoc = readSourceLocation(); 401 S->EndLoc = readSourceLocation(); 402 S->NumAsmToks = Record.readInt(); 403 std::string AsmStr = readString(); 404 405 // Read the tokens. 406 SmallVector<Token, 16> AsmToks; 407 AsmToks.reserve(S->NumAsmToks); 408 for (unsigned i = 0, e = S->NumAsmToks; i != e; ++i) { 409 AsmToks.push_back(Record.readToken()); 410 } 411 412 // The calls to reserve() for the FooData vectors are mandatory to 413 // prevent dead StringRefs in the Foo vectors. 414 415 // Read the clobbers. 416 SmallVector<std::string, 16> ClobbersData; 417 SmallVector<StringRef, 16> Clobbers; 418 ClobbersData.reserve(S->NumClobbers); 419 Clobbers.reserve(S->NumClobbers); 420 for (unsigned i = 0, e = S->NumClobbers; i != e; ++i) { 421 ClobbersData.push_back(readString()); 422 Clobbers.push_back(ClobbersData.back()); 423 } 424 425 // Read the operands. 426 unsigned NumOperands = S->NumOutputs + S->NumInputs; 427 SmallVector<Expr*, 16> Exprs; 428 SmallVector<std::string, 16> ConstraintsData; 429 SmallVector<StringRef, 16> Constraints; 430 Exprs.reserve(NumOperands); 431 ConstraintsData.reserve(NumOperands); 432 Constraints.reserve(NumOperands); 433 for (unsigned i = 0; i != NumOperands; ++i) { 434 Exprs.push_back(cast<Expr>(Record.readSubStmt())); 435 ConstraintsData.push_back(readString()); 436 Constraints.push_back(ConstraintsData.back()); 437 } 438 439 S->initialize(Record.getContext(), AsmStr, AsmToks, 440 Constraints, Exprs, Clobbers); 441 } 442 443 void ASTStmtReader::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) { 444 VisitStmt(S); 445 assert(Record.peekInt() == S->NumParams); 446 Record.skipInts(1); 447 auto *StoredStmts = S->getStoredStmts(); 448 for (unsigned i = 0; 449 i < CoroutineBodyStmt::SubStmt::FirstParamMove + S->NumParams; ++i) 450 StoredStmts[i] = Record.readSubStmt(); 451 } 452 453 void ASTStmtReader::VisitCoreturnStmt(CoreturnStmt *S) { 454 VisitStmt(S); 455 S->CoreturnLoc = Record.readSourceLocation(); 456 for (auto &SubStmt: S->SubStmts) 457 SubStmt = Record.readSubStmt(); 458 S->IsImplicit = Record.readInt() != 0; 459 } 460 461 void ASTStmtReader::VisitCoawaitExpr(CoawaitExpr *E) { 462 VisitExpr(E); 463 E->KeywordLoc = readSourceLocation(); 464 for (auto &SubExpr: E->SubExprs) 465 SubExpr = Record.readSubStmt(); 466 E->OpaqueValue = cast_or_null<OpaqueValueExpr>(Record.readSubStmt()); 467 E->setIsImplicit(Record.readInt() != 0); 468 } 469 470 void ASTStmtReader::VisitCoyieldExpr(CoyieldExpr *E) { 471 VisitExpr(E); 472 E->KeywordLoc = readSourceLocation(); 473 for (auto &SubExpr: E->SubExprs) 474 SubExpr = Record.readSubStmt(); 475 E->OpaqueValue = cast_or_null<OpaqueValueExpr>(Record.readSubStmt()); 476 } 477 478 void ASTStmtReader::VisitDependentCoawaitExpr(DependentCoawaitExpr *E) { 479 VisitExpr(E); 480 E->KeywordLoc = readSourceLocation(); 481 for (auto &SubExpr: E->SubExprs) 482 SubExpr = Record.readSubStmt(); 483 } 484 485 void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) { 486 VisitStmt(S); 487 Record.skipInts(1); 488 S->setCapturedDecl(readDeclAs<CapturedDecl>()); 489 S->setCapturedRegionKind(static_cast<CapturedRegionKind>(Record.readInt())); 490 S->setCapturedRecordDecl(readDeclAs<RecordDecl>()); 491 492 // Capture inits 493 for (CapturedStmt::capture_init_iterator I = S->capture_init_begin(), 494 E = S->capture_init_end(); 495 I != E; ++I) 496 *I = Record.readSubExpr(); 497 498 // Body 499 S->setCapturedStmt(Record.readSubStmt()); 500 S->getCapturedDecl()->setBody(S->getCapturedStmt()); 501 502 // Captures 503 for (auto &I : S->captures()) { 504 I.VarAndKind.setPointer(readDeclAs<VarDecl>()); 505 I.VarAndKind.setInt( 506 static_cast<CapturedStmt::VariableCaptureKind>(Record.readInt())); 507 I.Loc = readSourceLocation(); 508 } 509 } 510 511 void ASTStmtReader::VisitExpr(Expr *E) { 512 VisitStmt(E); 513 E->setType(Record.readType()); 514 E->setTypeDependent(Record.readInt()); 515 E->setValueDependent(Record.readInt()); 516 E->setInstantiationDependent(Record.readInt()); 517 E->ExprBits.ContainsUnexpandedParameterPack = Record.readInt(); 518 E->setValueKind(static_cast<ExprValueKind>(Record.readInt())); 519 E->setObjectKind(static_cast<ExprObjectKind>(Record.readInt())); 520 assert(Record.getIdx() == NumExprFields && 521 "Incorrect expression field count"); 522 } 523 524 void ASTStmtReader::VisitConstantExpr(ConstantExpr *E) { 525 VisitExpr(E); 526 E->ConstantExprBits.ResultKind = Record.readInt(); 527 switch (E->ConstantExprBits.ResultKind) { 528 case ConstantExpr::RSK_Int64: { 529 E->Int64Result() = Record.readInt(); 530 uint64_t tmp = Record.readInt(); 531 E->ConstantExprBits.IsUnsigned = tmp & 0x1; 532 E->ConstantExprBits.BitWidth = tmp >> 1; 533 break; 534 } 535 case ConstantExpr::RSK_APValue: 536 E->APValueResult() = Record.readAPValue(); 537 } 538 E->setSubExpr(Record.readSubExpr()); 539 } 540 541 void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) { 542 VisitExpr(E); 543 bool HasFunctionName = Record.readInt(); 544 E->PredefinedExprBits.HasFunctionName = HasFunctionName; 545 E->PredefinedExprBits.Kind = Record.readInt(); 546 E->setLocation(readSourceLocation()); 547 if (HasFunctionName) 548 E->setFunctionName(cast<StringLiteral>(Record.readSubExpr())); 549 } 550 551 void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) { 552 VisitExpr(E); 553 554 E->DeclRefExprBits.HasQualifier = Record.readInt(); 555 E->DeclRefExprBits.HasFoundDecl = Record.readInt(); 556 E->DeclRefExprBits.HasTemplateKWAndArgsInfo = Record.readInt(); 557 E->DeclRefExprBits.HadMultipleCandidates = Record.readInt(); 558 E->DeclRefExprBits.RefersToEnclosingVariableOrCapture = Record.readInt(); 559 E->DeclRefExprBits.NonOdrUseReason = Record.readInt(); 560 unsigned NumTemplateArgs = 0; 561 if (E->hasTemplateKWAndArgsInfo()) 562 NumTemplateArgs = Record.readInt(); 563 564 if (E->hasQualifier()) 565 new (E->getTrailingObjects<NestedNameSpecifierLoc>()) 566 NestedNameSpecifierLoc(Record.readNestedNameSpecifierLoc()); 567 568 if (E->hasFoundDecl()) 569 *E->getTrailingObjects<NamedDecl *>() = readDeclAs<NamedDecl>(); 570 571 if (E->hasTemplateKWAndArgsInfo()) 572 ReadTemplateKWAndArgsInfo( 573 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), 574 E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs); 575 576 E->setDecl(readDeclAs<ValueDecl>()); 577 E->setLocation(readSourceLocation()); 578 E->DNLoc = Record.readDeclarationNameLoc(E->getDecl()->getDeclName()); 579 } 580 581 void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) { 582 VisitExpr(E); 583 E->setLocation(readSourceLocation()); 584 E->setValue(Record.getContext(), Record.readAPInt()); 585 } 586 587 void ASTStmtReader::VisitFixedPointLiteral(FixedPointLiteral *E) { 588 VisitExpr(E); 589 E->setLocation(readSourceLocation()); 590 E->setValue(Record.getContext(), Record.readAPInt()); 591 } 592 593 void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) { 594 VisitExpr(E); 595 E->setRawSemantics( 596 static_cast<llvm::APFloatBase::Semantics>(Record.readInt())); 597 E->setExact(Record.readInt()); 598 E->setValue(Record.getContext(), Record.readAPFloat(E->getSemantics())); 599 E->setLocation(readSourceLocation()); 600 } 601 602 void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) { 603 VisitExpr(E); 604 E->setSubExpr(Record.readSubExpr()); 605 } 606 607 void ASTStmtReader::VisitStringLiteral(StringLiteral *E) { 608 VisitExpr(E); 609 610 // NumConcatenated, Length and CharByteWidth are set by the empty 611 // ctor since they are needed to allocate storage for the trailing objects. 612 unsigned NumConcatenated = Record.readInt(); 613 unsigned Length = Record.readInt(); 614 unsigned CharByteWidth = Record.readInt(); 615 assert((NumConcatenated == E->getNumConcatenated()) && 616 "Wrong number of concatenated tokens!"); 617 assert((Length == E->getLength()) && "Wrong Length!"); 618 assert((CharByteWidth == E->getCharByteWidth()) && "Wrong character width!"); 619 E->StringLiteralBits.Kind = Record.readInt(); 620 E->StringLiteralBits.IsPascal = Record.readInt(); 621 622 // The character width is originally computed via mapCharByteWidth. 623 // Check that the deserialized character width is consistant with the result 624 // of calling mapCharByteWidth. 625 assert((CharByteWidth == 626 StringLiteral::mapCharByteWidth(Record.getContext().getTargetInfo(), 627 E->getKind())) && 628 "Wrong character width!"); 629 630 // Deserialize the trailing array of SourceLocation. 631 for (unsigned I = 0; I < NumConcatenated; ++I) 632 E->setStrTokenLoc(I, readSourceLocation()); 633 634 // Deserialize the trailing array of char holding the string data. 635 char *StrData = E->getStrDataAsChar(); 636 for (unsigned I = 0; I < Length * CharByteWidth; ++I) 637 StrData[I] = Record.readInt(); 638 } 639 640 void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) { 641 VisitExpr(E); 642 E->setValue(Record.readInt()); 643 E->setLocation(readSourceLocation()); 644 E->setKind(static_cast<CharacterLiteral::CharacterKind>(Record.readInt())); 645 } 646 647 void ASTStmtReader::VisitParenExpr(ParenExpr *E) { 648 VisitExpr(E); 649 E->setLParen(readSourceLocation()); 650 E->setRParen(readSourceLocation()); 651 E->setSubExpr(Record.readSubExpr()); 652 } 653 654 void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) { 655 VisitExpr(E); 656 unsigned NumExprs = Record.readInt(); 657 assert((NumExprs == E->getNumExprs()) && "Wrong NumExprs!"); 658 for (unsigned I = 0; I != NumExprs; ++I) 659 E->getTrailingObjects<Stmt *>()[I] = Record.readSubStmt(); 660 E->LParenLoc = readSourceLocation(); 661 E->RParenLoc = readSourceLocation(); 662 } 663 664 void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) { 665 VisitExpr(E); 666 E->setSubExpr(Record.readSubExpr()); 667 E->setOpcode((UnaryOperator::Opcode)Record.readInt()); 668 E->setOperatorLoc(readSourceLocation()); 669 E->setCanOverflow(Record.readInt()); 670 } 671 672 void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) { 673 VisitExpr(E); 674 assert(E->getNumComponents() == Record.peekInt()); 675 Record.skipInts(1); 676 assert(E->getNumExpressions() == Record.peekInt()); 677 Record.skipInts(1); 678 E->setOperatorLoc(readSourceLocation()); 679 E->setRParenLoc(readSourceLocation()); 680 E->setTypeSourceInfo(readTypeSourceInfo()); 681 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 682 auto Kind = static_cast<OffsetOfNode::Kind>(Record.readInt()); 683 SourceLocation Start = readSourceLocation(); 684 SourceLocation End = readSourceLocation(); 685 switch (Kind) { 686 case OffsetOfNode::Array: 687 E->setComponent(I, OffsetOfNode(Start, Record.readInt(), End)); 688 break; 689 690 case OffsetOfNode::Field: 691 E->setComponent( 692 I, OffsetOfNode(Start, readDeclAs<FieldDecl>(), End)); 693 break; 694 695 case OffsetOfNode::Identifier: 696 E->setComponent( 697 I, 698 OffsetOfNode(Start, Record.readIdentifier(), End)); 699 break; 700 701 case OffsetOfNode::Base: { 702 auto *Base = new (Record.getContext()) CXXBaseSpecifier(); 703 *Base = Record.readCXXBaseSpecifier(); 704 E->setComponent(I, OffsetOfNode(Base)); 705 break; 706 } 707 } 708 } 709 710 for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I) 711 E->setIndexExpr(I, Record.readSubExpr()); 712 } 713 714 void ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) { 715 VisitExpr(E); 716 E->setKind(static_cast<UnaryExprOrTypeTrait>(Record.readInt())); 717 if (Record.peekInt() == 0) { 718 E->setArgument(Record.readSubExpr()); 719 Record.skipInts(1); 720 } else { 721 E->setArgument(readTypeSourceInfo()); 722 } 723 E->setOperatorLoc(readSourceLocation()); 724 E->setRParenLoc(readSourceLocation()); 725 } 726 727 void ASTStmtReader::VisitConceptSpecializationExpr( 728 ConceptSpecializationExpr *E) { 729 VisitExpr(E); 730 unsigned NumTemplateArgs = Record.readInt(); 731 E->NestedNameSpec = Record.readNestedNameSpecifierLoc(); 732 E->TemplateKWLoc = Record.readSourceLocation(); 733 E->ConceptNameLoc = Record.readSourceLocation(); 734 E->FoundDecl = readDeclAs<NamedDecl>(); 735 E->NamedConcept = readDeclAs<ConceptDecl>(); 736 const ASTTemplateArgumentListInfo *ArgsAsWritten = 737 Record.readASTTemplateArgumentListInfo(); 738 llvm::SmallVector<TemplateArgument, 4> Args; 739 for (unsigned I = 0; I < NumTemplateArgs; ++I) 740 Args.push_back(Record.readTemplateArgument()); 741 E->setTemplateArguments(ArgsAsWritten, Args); 742 ConstraintSatisfaction Satisfaction; 743 Satisfaction.IsSatisfied = Record.readInt(); 744 if (!Satisfaction.IsSatisfied) { 745 unsigned NumDetailRecords = Record.readInt(); 746 for (unsigned i = 0; i != NumDetailRecords; ++i) { 747 Expr *ConstraintExpr = Record.readExpr(); 748 bool IsDiagnostic = Record.readInt(); 749 if (IsDiagnostic) { 750 SourceLocation DiagLocation = Record.readSourceLocation(); 751 std::string DiagMessage = Record.readString(); 752 Satisfaction.Details.emplace_back( 753 ConstraintExpr, new (Record.getContext()) 754 ConstraintSatisfaction::SubstitutionDiagnostic{ 755 DiagLocation, DiagMessage}); 756 } else 757 Satisfaction.Details.emplace_back(ConstraintExpr, Record.readExpr()); 758 } 759 } 760 E->Satisfaction = ASTConstraintSatisfaction::Create(Record.getContext(), 761 Satisfaction); 762 } 763 764 void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 765 VisitExpr(E); 766 E->setLHS(Record.readSubExpr()); 767 E->setRHS(Record.readSubExpr()); 768 E->setRBracketLoc(readSourceLocation()); 769 } 770 771 void ASTStmtReader::VisitOMPArraySectionExpr(OMPArraySectionExpr *E) { 772 VisitExpr(E); 773 E->setBase(Record.readSubExpr()); 774 E->setLowerBound(Record.readSubExpr()); 775 E->setLength(Record.readSubExpr()); 776 E->setColonLoc(readSourceLocation()); 777 E->setRBracketLoc(readSourceLocation()); 778 } 779 780 void ASTStmtReader::VisitCallExpr(CallExpr *E) { 781 VisitExpr(E); 782 unsigned NumArgs = Record.readInt(); 783 assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!"); 784 E->setRParenLoc(readSourceLocation()); 785 E->setCallee(Record.readSubExpr()); 786 for (unsigned I = 0; I != NumArgs; ++I) 787 E->setArg(I, Record.readSubExpr()); 788 E->setADLCallKind(static_cast<CallExpr::ADLCallKind>(Record.readInt())); 789 } 790 791 void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { 792 VisitCallExpr(E); 793 } 794 795 void ASTStmtReader::VisitMemberExpr(MemberExpr *E) { 796 VisitExpr(E); 797 798 bool HasQualifier = Record.readInt(); 799 bool HasFoundDecl = Record.readInt(); 800 bool HasTemplateInfo = Record.readInt(); 801 unsigned NumTemplateArgs = Record.readInt(); 802 803 E->Base = Record.readSubExpr(); 804 E->MemberDecl = Record.readDeclAs<ValueDecl>(); 805 E->MemberDNLoc = Record.readDeclarationNameLoc(E->MemberDecl->getDeclName()); 806 E->MemberLoc = Record.readSourceLocation(); 807 E->MemberExprBits.IsArrow = Record.readInt(); 808 E->MemberExprBits.HasQualifierOrFoundDecl = HasQualifier || HasFoundDecl; 809 E->MemberExprBits.HasTemplateKWAndArgsInfo = HasTemplateInfo; 810 E->MemberExprBits.HadMultipleCandidates = Record.readInt(); 811 E->MemberExprBits.NonOdrUseReason = Record.readInt(); 812 E->MemberExprBits.OperatorLoc = Record.readSourceLocation(); 813 814 if (HasQualifier || HasFoundDecl) { 815 DeclAccessPair FoundDecl; 816 if (HasFoundDecl) { 817 auto *FoundD = Record.readDeclAs<NamedDecl>(); 818 auto AS = (AccessSpecifier)Record.readInt(); 819 FoundDecl = DeclAccessPair::make(FoundD, AS); 820 } else { 821 FoundDecl = DeclAccessPair::make(E->MemberDecl, 822 E->MemberDecl->getAccess()); 823 } 824 E->getTrailingObjects<MemberExprNameQualifier>()->FoundDecl = FoundDecl; 825 826 NestedNameSpecifierLoc QualifierLoc; 827 if (HasQualifier) 828 QualifierLoc = Record.readNestedNameSpecifierLoc(); 829 E->getTrailingObjects<MemberExprNameQualifier>()->QualifierLoc = 830 QualifierLoc; 831 } 832 833 if (HasTemplateInfo) 834 ReadTemplateKWAndArgsInfo( 835 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), 836 E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs); 837 } 838 839 void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) { 840 VisitExpr(E); 841 E->setBase(Record.readSubExpr()); 842 E->setIsaMemberLoc(readSourceLocation()); 843 E->setOpLoc(readSourceLocation()); 844 E->setArrow(Record.readInt()); 845 } 846 847 void ASTStmtReader:: 848 VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 849 VisitExpr(E); 850 E->Operand = Record.readSubExpr(); 851 E->setShouldCopy(Record.readInt()); 852 } 853 854 void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 855 VisitExplicitCastExpr(E); 856 E->LParenLoc = readSourceLocation(); 857 E->BridgeKeywordLoc = readSourceLocation(); 858 E->Kind = Record.readInt(); 859 } 860 861 void ASTStmtReader::VisitCastExpr(CastExpr *E) { 862 VisitExpr(E); 863 unsigned NumBaseSpecs = Record.readInt(); 864 assert(NumBaseSpecs == E->path_size()); 865 E->setSubExpr(Record.readSubExpr()); 866 E->setCastKind((CastKind)Record.readInt()); 867 CastExpr::path_iterator BaseI = E->path_begin(); 868 while (NumBaseSpecs--) { 869 auto *BaseSpec = new (Record.getContext()) CXXBaseSpecifier; 870 *BaseSpec = Record.readCXXBaseSpecifier(); 871 *BaseI++ = BaseSpec; 872 } 873 } 874 875 void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) { 876 VisitExpr(E); 877 E->setLHS(Record.readSubExpr()); 878 E->setRHS(Record.readSubExpr()); 879 E->setOpcode((BinaryOperator::Opcode)Record.readInt()); 880 E->setOperatorLoc(readSourceLocation()); 881 E->setFPFeatures(FPOptions(Record.readInt())); 882 } 883 884 void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 885 VisitBinaryOperator(E); 886 E->setComputationLHSType(Record.readType()); 887 E->setComputationResultType(Record.readType()); 888 } 889 890 void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) { 891 VisitExpr(E); 892 E->SubExprs[ConditionalOperator::COND] = Record.readSubExpr(); 893 E->SubExprs[ConditionalOperator::LHS] = Record.readSubExpr(); 894 E->SubExprs[ConditionalOperator::RHS] = Record.readSubExpr(); 895 E->QuestionLoc = readSourceLocation(); 896 E->ColonLoc = readSourceLocation(); 897 } 898 899 void 900 ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) { 901 VisitExpr(E); 902 E->OpaqueValue = cast<OpaqueValueExpr>(Record.readSubExpr()); 903 E->SubExprs[BinaryConditionalOperator::COMMON] = Record.readSubExpr(); 904 E->SubExprs[BinaryConditionalOperator::COND] = Record.readSubExpr(); 905 E->SubExprs[BinaryConditionalOperator::LHS] = Record.readSubExpr(); 906 E->SubExprs[BinaryConditionalOperator::RHS] = Record.readSubExpr(); 907 E->QuestionLoc = readSourceLocation(); 908 E->ColonLoc = readSourceLocation(); 909 } 910 911 void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) { 912 VisitCastExpr(E); 913 E->setIsPartOfExplicitCast(Record.readInt()); 914 } 915 916 void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) { 917 VisitCastExpr(E); 918 E->setTypeInfoAsWritten(readTypeSourceInfo()); 919 } 920 921 void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) { 922 VisitExplicitCastExpr(E); 923 E->setLParenLoc(readSourceLocation()); 924 E->setRParenLoc(readSourceLocation()); 925 } 926 927 void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 928 VisitExpr(E); 929 E->setLParenLoc(readSourceLocation()); 930 E->setTypeSourceInfo(readTypeSourceInfo()); 931 E->setInitializer(Record.readSubExpr()); 932 E->setFileScope(Record.readInt()); 933 } 934 935 void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) { 936 VisitExpr(E); 937 E->setBase(Record.readSubExpr()); 938 E->setAccessor(Record.readIdentifier()); 939 E->setAccessorLoc(readSourceLocation()); 940 } 941 942 void ASTStmtReader::VisitInitListExpr(InitListExpr *E) { 943 VisitExpr(E); 944 if (auto *SyntForm = cast_or_null<InitListExpr>(Record.readSubStmt())) 945 E->setSyntacticForm(SyntForm); 946 E->setLBraceLoc(readSourceLocation()); 947 E->setRBraceLoc(readSourceLocation()); 948 bool isArrayFiller = Record.readInt(); 949 Expr *filler = nullptr; 950 if (isArrayFiller) { 951 filler = Record.readSubExpr(); 952 E->ArrayFillerOrUnionFieldInit = filler; 953 } else 954 E->ArrayFillerOrUnionFieldInit = readDeclAs<FieldDecl>(); 955 E->sawArrayRangeDesignator(Record.readInt()); 956 unsigned NumInits = Record.readInt(); 957 E->reserveInits(Record.getContext(), NumInits); 958 if (isArrayFiller) { 959 for (unsigned I = 0; I != NumInits; ++I) { 960 Expr *init = Record.readSubExpr(); 961 E->updateInit(Record.getContext(), I, init ? init : filler); 962 } 963 } else { 964 for (unsigned I = 0; I != NumInits; ++I) 965 E->updateInit(Record.getContext(), I, Record.readSubExpr()); 966 } 967 } 968 969 void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) { 970 using Designator = DesignatedInitExpr::Designator; 971 972 VisitExpr(E); 973 unsigned NumSubExprs = Record.readInt(); 974 assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs"); 975 for (unsigned I = 0; I != NumSubExprs; ++I) 976 E->setSubExpr(I, Record.readSubExpr()); 977 E->setEqualOrColonLoc(readSourceLocation()); 978 E->setGNUSyntax(Record.readInt()); 979 980 SmallVector<Designator, 4> Designators; 981 while (Record.getIdx() < Record.size()) { 982 switch ((DesignatorTypes)Record.readInt()) { 983 case DESIG_FIELD_DECL: { 984 auto *Field = readDeclAs<FieldDecl>(); 985 SourceLocation DotLoc = readSourceLocation(); 986 SourceLocation FieldLoc = readSourceLocation(); 987 Designators.push_back(Designator(Field->getIdentifier(), DotLoc, 988 FieldLoc)); 989 Designators.back().setField(Field); 990 break; 991 } 992 993 case DESIG_FIELD_NAME: { 994 const IdentifierInfo *Name = Record.readIdentifier(); 995 SourceLocation DotLoc = readSourceLocation(); 996 SourceLocation FieldLoc = readSourceLocation(); 997 Designators.push_back(Designator(Name, DotLoc, FieldLoc)); 998 break; 999 } 1000 1001 case DESIG_ARRAY: { 1002 unsigned Index = Record.readInt(); 1003 SourceLocation LBracketLoc = readSourceLocation(); 1004 SourceLocation RBracketLoc = readSourceLocation(); 1005 Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc)); 1006 break; 1007 } 1008 1009 case DESIG_ARRAY_RANGE: { 1010 unsigned Index = Record.readInt(); 1011 SourceLocation LBracketLoc = readSourceLocation(); 1012 SourceLocation EllipsisLoc = readSourceLocation(); 1013 SourceLocation RBracketLoc = readSourceLocation(); 1014 Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc, 1015 RBracketLoc)); 1016 break; 1017 } 1018 } 1019 } 1020 E->setDesignators(Record.getContext(), 1021 Designators.data(), Designators.size()); 1022 } 1023 1024 void ASTStmtReader::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) { 1025 VisitExpr(E); 1026 E->setBase(Record.readSubExpr()); 1027 E->setUpdater(Record.readSubExpr()); 1028 } 1029 1030 void ASTStmtReader::VisitNoInitExpr(NoInitExpr *E) { 1031 VisitExpr(E); 1032 } 1033 1034 void ASTStmtReader::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) { 1035 VisitExpr(E); 1036 E->SubExprs[0] = Record.readSubExpr(); 1037 E->SubExprs[1] = Record.readSubExpr(); 1038 } 1039 1040 void ASTStmtReader::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) { 1041 VisitExpr(E); 1042 } 1043 1044 void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { 1045 VisitExpr(E); 1046 } 1047 1048 void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) { 1049 VisitExpr(E); 1050 E->setSubExpr(Record.readSubExpr()); 1051 E->setWrittenTypeInfo(readTypeSourceInfo()); 1052 E->setBuiltinLoc(readSourceLocation()); 1053 E->setRParenLoc(readSourceLocation()); 1054 E->setIsMicrosoftABI(Record.readInt()); 1055 } 1056 1057 void ASTStmtReader::VisitSourceLocExpr(SourceLocExpr *E) { 1058 VisitExpr(E); 1059 E->ParentContext = readDeclAs<DeclContext>(); 1060 E->BuiltinLoc = readSourceLocation(); 1061 E->RParenLoc = readSourceLocation(); 1062 E->SourceLocExprBits.Kind = 1063 static_cast<SourceLocExpr::IdentKind>(Record.readInt()); 1064 } 1065 1066 void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) { 1067 VisitExpr(E); 1068 E->setAmpAmpLoc(readSourceLocation()); 1069 E->setLabelLoc(readSourceLocation()); 1070 E->setLabel(readDeclAs<LabelDecl>()); 1071 } 1072 1073 void ASTStmtReader::VisitStmtExpr(StmtExpr *E) { 1074 VisitExpr(E); 1075 E->setLParenLoc(readSourceLocation()); 1076 E->setRParenLoc(readSourceLocation()); 1077 E->setSubStmt(cast_or_null<CompoundStmt>(Record.readSubStmt())); 1078 } 1079 1080 void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) { 1081 VisitExpr(E); 1082 E->setCond(Record.readSubExpr()); 1083 E->setLHS(Record.readSubExpr()); 1084 E->setRHS(Record.readSubExpr()); 1085 E->setBuiltinLoc(readSourceLocation()); 1086 E->setRParenLoc(readSourceLocation()); 1087 E->setIsConditionTrue(Record.readInt()); 1088 } 1089 1090 void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) { 1091 VisitExpr(E); 1092 E->setTokenLocation(readSourceLocation()); 1093 } 1094 1095 void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) { 1096 VisitExpr(E); 1097 SmallVector<Expr *, 16> Exprs; 1098 unsigned NumExprs = Record.readInt(); 1099 while (NumExprs--) 1100 Exprs.push_back(Record.readSubExpr()); 1101 E->setExprs(Record.getContext(), Exprs); 1102 E->setBuiltinLoc(readSourceLocation()); 1103 E->setRParenLoc(readSourceLocation()); 1104 } 1105 1106 void ASTStmtReader::VisitConvertVectorExpr(ConvertVectorExpr *E) { 1107 VisitExpr(E); 1108 E->BuiltinLoc = readSourceLocation(); 1109 E->RParenLoc = readSourceLocation(); 1110 E->TInfo = readTypeSourceInfo(); 1111 E->SrcExpr = Record.readSubExpr(); 1112 } 1113 1114 void ASTStmtReader::VisitBlockExpr(BlockExpr *E) { 1115 VisitExpr(E); 1116 E->setBlockDecl(readDeclAs<BlockDecl>()); 1117 } 1118 1119 void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) { 1120 VisitExpr(E); 1121 1122 unsigned NumAssocs = Record.readInt(); 1123 assert(NumAssocs == E->getNumAssocs() && "Wrong NumAssocs!"); 1124 E->ResultIndex = Record.readInt(); 1125 E->GenericSelectionExprBits.GenericLoc = readSourceLocation(); 1126 E->DefaultLoc = readSourceLocation(); 1127 E->RParenLoc = readSourceLocation(); 1128 1129 Stmt **Stmts = E->getTrailingObjects<Stmt *>(); 1130 // Add 1 to account for the controlling expression which is the first 1131 // expression in the trailing array of Stmt *. This is not needed for 1132 // the trailing array of TypeSourceInfo *. 1133 for (unsigned I = 0, N = NumAssocs + 1; I < N; ++I) 1134 Stmts[I] = Record.readSubExpr(); 1135 1136 TypeSourceInfo **TSIs = E->getTrailingObjects<TypeSourceInfo *>(); 1137 for (unsigned I = 0, N = NumAssocs; I < N; ++I) 1138 TSIs[I] = readTypeSourceInfo(); 1139 } 1140 1141 void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) { 1142 VisitExpr(E); 1143 unsigned numSemanticExprs = Record.readInt(); 1144 assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs); 1145 E->PseudoObjectExprBits.ResultIndex = Record.readInt(); 1146 1147 // Read the syntactic expression. 1148 E->getSubExprsBuffer()[0] = Record.readSubExpr(); 1149 1150 // Read all the semantic expressions. 1151 for (unsigned i = 0; i != numSemanticExprs; ++i) { 1152 Expr *subExpr = Record.readSubExpr(); 1153 E->getSubExprsBuffer()[i+1] = subExpr; 1154 } 1155 } 1156 1157 void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) { 1158 VisitExpr(E); 1159 E->Op = AtomicExpr::AtomicOp(Record.readInt()); 1160 E->NumSubExprs = AtomicExpr::getNumSubExprs(E->Op); 1161 for (unsigned I = 0; I != E->NumSubExprs; ++I) 1162 E->SubExprs[I] = Record.readSubExpr(); 1163 E->BuiltinLoc = readSourceLocation(); 1164 E->RParenLoc = readSourceLocation(); 1165 } 1166 1167 //===----------------------------------------------------------------------===// 1168 // Objective-C Expressions and Statements 1169 1170 void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) { 1171 VisitExpr(E); 1172 E->setString(cast<StringLiteral>(Record.readSubStmt())); 1173 E->setAtLoc(readSourceLocation()); 1174 } 1175 1176 void ASTStmtReader::VisitObjCBoxedExpr(ObjCBoxedExpr *E) { 1177 VisitExpr(E); 1178 // could be one of several IntegerLiteral, FloatLiteral, etc. 1179 E->SubExpr = Record.readSubStmt(); 1180 E->BoxingMethod = readDeclAs<ObjCMethodDecl>(); 1181 E->Range = readSourceRange(); 1182 } 1183 1184 void ASTStmtReader::VisitObjCArrayLiteral(ObjCArrayLiteral *E) { 1185 VisitExpr(E); 1186 unsigned NumElements = Record.readInt(); 1187 assert(NumElements == E->getNumElements() && "Wrong number of elements"); 1188 Expr **Elements = E->getElements(); 1189 for (unsigned I = 0, N = NumElements; I != N; ++I) 1190 Elements[I] = Record.readSubExpr(); 1191 E->ArrayWithObjectsMethod = readDeclAs<ObjCMethodDecl>(); 1192 E->Range = readSourceRange(); 1193 } 1194 1195 void ASTStmtReader::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) { 1196 VisitExpr(E); 1197 unsigned NumElements = Record.readInt(); 1198 assert(NumElements == E->getNumElements() && "Wrong number of elements"); 1199 bool HasPackExpansions = Record.readInt(); 1200 assert(HasPackExpansions == E->HasPackExpansions &&"Pack expansion mismatch"); 1201 auto *KeyValues = 1202 E->getTrailingObjects<ObjCDictionaryLiteral::KeyValuePair>(); 1203 auto *Expansions = 1204 E->getTrailingObjects<ObjCDictionaryLiteral::ExpansionData>(); 1205 for (unsigned I = 0; I != NumElements; ++I) { 1206 KeyValues[I].Key = Record.readSubExpr(); 1207 KeyValues[I].Value = Record.readSubExpr(); 1208 if (HasPackExpansions) { 1209 Expansions[I].EllipsisLoc = readSourceLocation(); 1210 Expansions[I].NumExpansionsPlusOne = Record.readInt(); 1211 } 1212 } 1213 E->DictWithObjectsMethod = readDeclAs<ObjCMethodDecl>(); 1214 E->Range = readSourceRange(); 1215 } 1216 1217 void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) { 1218 VisitExpr(E); 1219 E->setEncodedTypeSourceInfo(readTypeSourceInfo()); 1220 E->setAtLoc(readSourceLocation()); 1221 E->setRParenLoc(readSourceLocation()); 1222 } 1223 1224 void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) { 1225 VisitExpr(E); 1226 E->setSelector(Record.readSelector()); 1227 E->setAtLoc(readSourceLocation()); 1228 E->setRParenLoc(readSourceLocation()); 1229 } 1230 1231 void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { 1232 VisitExpr(E); 1233 E->setProtocol(readDeclAs<ObjCProtocolDecl>()); 1234 E->setAtLoc(readSourceLocation()); 1235 E->ProtoLoc = readSourceLocation(); 1236 E->setRParenLoc(readSourceLocation()); 1237 } 1238 1239 void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { 1240 VisitExpr(E); 1241 E->setDecl(readDeclAs<ObjCIvarDecl>()); 1242 E->setLocation(readSourceLocation()); 1243 E->setOpLoc(readSourceLocation()); 1244 E->setBase(Record.readSubExpr()); 1245 E->setIsArrow(Record.readInt()); 1246 E->setIsFreeIvar(Record.readInt()); 1247 } 1248 1249 void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 1250 VisitExpr(E); 1251 unsigned MethodRefFlags = Record.readInt(); 1252 bool Implicit = Record.readInt() != 0; 1253 if (Implicit) { 1254 auto *Getter = readDeclAs<ObjCMethodDecl>(); 1255 auto *Setter = readDeclAs<ObjCMethodDecl>(); 1256 E->setImplicitProperty(Getter, Setter, MethodRefFlags); 1257 } else { 1258 E->setExplicitProperty(readDeclAs<ObjCPropertyDecl>(), MethodRefFlags); 1259 } 1260 E->setLocation(readSourceLocation()); 1261 E->setReceiverLocation(readSourceLocation()); 1262 switch (Record.readInt()) { 1263 case 0: 1264 E->setBase(Record.readSubExpr()); 1265 break; 1266 case 1: 1267 E->setSuperReceiver(Record.readType()); 1268 break; 1269 case 2: 1270 E->setClassReceiver(readDeclAs<ObjCInterfaceDecl>()); 1271 break; 1272 } 1273 } 1274 1275 void ASTStmtReader::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 1276 VisitExpr(E); 1277 E->setRBracket(readSourceLocation()); 1278 E->setBaseExpr(Record.readSubExpr()); 1279 E->setKeyExpr(Record.readSubExpr()); 1280 E->GetAtIndexMethodDecl = readDeclAs<ObjCMethodDecl>(); 1281 E->SetAtIndexMethodDecl = readDeclAs<ObjCMethodDecl>(); 1282 } 1283 1284 void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) { 1285 VisitExpr(E); 1286 assert(Record.peekInt() == E->getNumArgs()); 1287 Record.skipInts(1); 1288 unsigned NumStoredSelLocs = Record.readInt(); 1289 E->SelLocsKind = Record.readInt(); 1290 E->setDelegateInitCall(Record.readInt()); 1291 E->IsImplicit = Record.readInt(); 1292 auto Kind = static_cast<ObjCMessageExpr::ReceiverKind>(Record.readInt()); 1293 switch (Kind) { 1294 case ObjCMessageExpr::Instance: 1295 E->setInstanceReceiver(Record.readSubExpr()); 1296 break; 1297 1298 case ObjCMessageExpr::Class: 1299 E->setClassReceiver(readTypeSourceInfo()); 1300 break; 1301 1302 case ObjCMessageExpr::SuperClass: 1303 case ObjCMessageExpr::SuperInstance: { 1304 QualType T = Record.readType(); 1305 SourceLocation SuperLoc = readSourceLocation(); 1306 E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance); 1307 break; 1308 } 1309 } 1310 1311 assert(Kind == E->getReceiverKind()); 1312 1313 if (Record.readInt()) 1314 E->setMethodDecl(readDeclAs<ObjCMethodDecl>()); 1315 else 1316 E->setSelector(Record.readSelector()); 1317 1318 E->LBracLoc = readSourceLocation(); 1319 E->RBracLoc = readSourceLocation(); 1320 1321 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 1322 E->setArg(I, Record.readSubExpr()); 1323 1324 SourceLocation *Locs = E->getStoredSelLocs(); 1325 for (unsigned I = 0; I != NumStoredSelLocs; ++I) 1326 Locs[I] = readSourceLocation(); 1327 } 1328 1329 void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { 1330 VisitStmt(S); 1331 S->setElement(Record.readSubStmt()); 1332 S->setCollection(Record.readSubExpr()); 1333 S->setBody(Record.readSubStmt()); 1334 S->setForLoc(readSourceLocation()); 1335 S->setRParenLoc(readSourceLocation()); 1336 } 1337 1338 void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { 1339 VisitStmt(S); 1340 S->setCatchBody(Record.readSubStmt()); 1341 S->setCatchParamDecl(readDeclAs<VarDecl>()); 1342 S->setAtCatchLoc(readSourceLocation()); 1343 S->setRParenLoc(readSourceLocation()); 1344 } 1345 1346 void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 1347 VisitStmt(S); 1348 S->setFinallyBody(Record.readSubStmt()); 1349 S->setAtFinallyLoc(readSourceLocation()); 1350 } 1351 1352 void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) { 1353 VisitStmt(S); // FIXME: no test coverage. 1354 S->setSubStmt(Record.readSubStmt()); 1355 S->setAtLoc(readSourceLocation()); 1356 } 1357 1358 void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { 1359 VisitStmt(S); 1360 assert(Record.peekInt() == S->getNumCatchStmts()); 1361 Record.skipInts(1); 1362 bool HasFinally = Record.readInt(); 1363 S->setTryBody(Record.readSubStmt()); 1364 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) 1365 S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Record.readSubStmt())); 1366 1367 if (HasFinally) 1368 S->setFinallyStmt(Record.readSubStmt()); 1369 S->setAtTryLoc(readSourceLocation()); 1370 } 1371 1372 void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) { 1373 VisitStmt(S); // FIXME: no test coverage. 1374 S->setSynchExpr(Record.readSubStmt()); 1375 S->setSynchBody(Record.readSubStmt()); 1376 S->setAtSynchronizedLoc(readSourceLocation()); 1377 } 1378 1379 void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { 1380 VisitStmt(S); // FIXME: no test coverage. 1381 S->setThrowExpr(Record.readSubStmt()); 1382 S->setThrowLoc(readSourceLocation()); 1383 } 1384 1385 void ASTStmtReader::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 1386 VisitExpr(E); 1387 E->setValue(Record.readInt()); 1388 E->setLocation(readSourceLocation()); 1389 } 1390 1391 void ASTStmtReader::VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr *E) { 1392 VisitExpr(E); 1393 SourceRange R = Record.readSourceRange(); 1394 E->AtLoc = R.getBegin(); 1395 E->RParen = R.getEnd(); 1396 E->VersionToCheck = Record.readVersionTuple(); 1397 } 1398 1399 //===----------------------------------------------------------------------===// 1400 // C++ Expressions and Statements 1401 //===----------------------------------------------------------------------===// 1402 1403 void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) { 1404 VisitStmt(S); 1405 S->CatchLoc = readSourceLocation(); 1406 S->ExceptionDecl = readDeclAs<VarDecl>(); 1407 S->HandlerBlock = Record.readSubStmt(); 1408 } 1409 1410 void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) { 1411 VisitStmt(S); 1412 assert(Record.peekInt() == S->getNumHandlers() && "NumStmtFields is wrong ?"); 1413 Record.skipInts(1); 1414 S->TryLoc = readSourceLocation(); 1415 S->getStmts()[0] = Record.readSubStmt(); 1416 for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i) 1417 S->getStmts()[i + 1] = Record.readSubStmt(); 1418 } 1419 1420 void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) { 1421 VisitStmt(S); 1422 S->ForLoc = readSourceLocation(); 1423 S->CoawaitLoc = readSourceLocation(); 1424 S->ColonLoc = readSourceLocation(); 1425 S->RParenLoc = readSourceLocation(); 1426 S->setInit(Record.readSubStmt()); 1427 S->setRangeStmt(Record.readSubStmt()); 1428 S->setBeginStmt(Record.readSubStmt()); 1429 S->setEndStmt(Record.readSubStmt()); 1430 S->setCond(Record.readSubExpr()); 1431 S->setInc(Record.readSubExpr()); 1432 S->setLoopVarStmt(Record.readSubStmt()); 1433 S->setBody(Record.readSubStmt()); 1434 } 1435 1436 void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) { 1437 VisitStmt(S); 1438 S->KeywordLoc = readSourceLocation(); 1439 S->IsIfExists = Record.readInt(); 1440 S->QualifierLoc = Record.readNestedNameSpecifierLoc(); 1441 S->NameInfo = Record.readDeclarationNameInfo(); 1442 S->SubStmt = Record.readSubStmt(); 1443 } 1444 1445 void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 1446 VisitCallExpr(E); 1447 E->CXXOperatorCallExprBits.OperatorKind = Record.readInt(); 1448 E->CXXOperatorCallExprBits.FPFeatures = Record.readInt(); 1449 E->Range = Record.readSourceRange(); 1450 } 1451 1452 void ASTStmtReader::VisitCXXRewrittenBinaryOperator( 1453 CXXRewrittenBinaryOperator *E) { 1454 VisitExpr(E); 1455 E->CXXRewrittenBinaryOperatorBits.IsReversed = Record.readInt(); 1456 E->SemanticForm = Record.readSubExpr(); 1457 } 1458 1459 void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) { 1460 VisitExpr(E); 1461 1462 unsigned NumArgs = Record.readInt(); 1463 assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!"); 1464 1465 E->CXXConstructExprBits.Elidable = Record.readInt(); 1466 E->CXXConstructExprBits.HadMultipleCandidates = Record.readInt(); 1467 E->CXXConstructExprBits.ListInitialization = Record.readInt(); 1468 E->CXXConstructExprBits.StdInitListInitialization = Record.readInt(); 1469 E->CXXConstructExprBits.ZeroInitialization = Record.readInt(); 1470 E->CXXConstructExprBits.ConstructionKind = Record.readInt(); 1471 E->CXXConstructExprBits.Loc = readSourceLocation(); 1472 E->Constructor = readDeclAs<CXXConstructorDecl>(); 1473 E->ParenOrBraceRange = readSourceRange(); 1474 1475 for (unsigned I = 0; I != NumArgs; ++I) 1476 E->setArg(I, Record.readSubExpr()); 1477 } 1478 1479 void ASTStmtReader::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) { 1480 VisitExpr(E); 1481 E->Constructor = readDeclAs<CXXConstructorDecl>(); 1482 E->Loc = readSourceLocation(); 1483 E->ConstructsVirtualBase = Record.readInt(); 1484 E->InheritedFromVirtualBase = Record.readInt(); 1485 } 1486 1487 void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) { 1488 VisitCXXConstructExpr(E); 1489 E->TSI = readTypeSourceInfo(); 1490 } 1491 1492 void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) { 1493 VisitExpr(E); 1494 unsigned NumCaptures = Record.readInt(); 1495 assert(NumCaptures == E->NumCaptures);(void)NumCaptures; 1496 E->IntroducerRange = readSourceRange(); 1497 E->CaptureDefault = static_cast<LambdaCaptureDefault>(Record.readInt()); 1498 E->CaptureDefaultLoc = readSourceLocation(); 1499 E->ExplicitParams = Record.readInt(); 1500 E->ExplicitResultType = Record.readInt(); 1501 E->ClosingBrace = readSourceLocation(); 1502 1503 // Read capture initializers. 1504 for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(), 1505 CEnd = E->capture_init_end(); 1506 C != CEnd; ++C) 1507 *C = Record.readSubExpr(); 1508 } 1509 1510 void 1511 ASTStmtReader::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) { 1512 VisitExpr(E); 1513 E->SubExpr = Record.readSubExpr(); 1514 } 1515 1516 void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) { 1517 VisitExplicitCastExpr(E); 1518 SourceRange R = readSourceRange(); 1519 E->Loc = R.getBegin(); 1520 E->RParenLoc = R.getEnd(); 1521 R = readSourceRange(); 1522 E->AngleBrackets = R; 1523 } 1524 1525 void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) { 1526 return VisitCXXNamedCastExpr(E); 1527 } 1528 1529 void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 1530 return VisitCXXNamedCastExpr(E); 1531 } 1532 1533 void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) { 1534 return VisitCXXNamedCastExpr(E); 1535 } 1536 1537 void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) { 1538 return VisitCXXNamedCastExpr(E); 1539 } 1540 1541 void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) { 1542 VisitExplicitCastExpr(E); 1543 E->setLParenLoc(readSourceLocation()); 1544 E->setRParenLoc(readSourceLocation()); 1545 } 1546 1547 void ASTStmtReader::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *E) { 1548 VisitExplicitCastExpr(E); 1549 E->KWLoc = readSourceLocation(); 1550 E->RParenLoc = readSourceLocation(); 1551 } 1552 1553 void ASTStmtReader::VisitUserDefinedLiteral(UserDefinedLiteral *E) { 1554 VisitCallExpr(E); 1555 E->UDSuffixLoc = readSourceLocation(); 1556 } 1557 1558 void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 1559 VisitExpr(E); 1560 E->setValue(Record.readInt()); 1561 E->setLocation(readSourceLocation()); 1562 } 1563 1564 void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) { 1565 VisitExpr(E); 1566 E->setLocation(readSourceLocation()); 1567 } 1568 1569 void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) { 1570 VisitExpr(E); 1571 E->setSourceRange(readSourceRange()); 1572 if (E->isTypeOperand()) { // typeid(int) 1573 E->setTypeOperandSourceInfo( 1574 readTypeSourceInfo()); 1575 return; 1576 } 1577 1578 // typeid(42+2) 1579 E->setExprOperand(Record.readSubExpr()); 1580 } 1581 1582 void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) { 1583 VisitExpr(E); 1584 E->setLocation(readSourceLocation()); 1585 E->setImplicit(Record.readInt()); 1586 } 1587 1588 void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) { 1589 VisitExpr(E); 1590 E->CXXThrowExprBits.ThrowLoc = readSourceLocation(); 1591 E->Operand = Record.readSubExpr(); 1592 E->CXXThrowExprBits.IsThrownVariableInScope = Record.readInt(); 1593 } 1594 1595 void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 1596 VisitExpr(E); 1597 E->Param = readDeclAs<ParmVarDecl>(); 1598 E->UsedContext = readDeclAs<DeclContext>(); 1599 E->CXXDefaultArgExprBits.Loc = readSourceLocation(); 1600 } 1601 1602 void ASTStmtReader::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 1603 VisitExpr(E); 1604 E->Field = readDeclAs<FieldDecl>(); 1605 E->UsedContext = readDeclAs<DeclContext>(); 1606 E->CXXDefaultInitExprBits.Loc = readSourceLocation(); 1607 } 1608 1609 void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 1610 VisitExpr(E); 1611 E->setTemporary(Record.readCXXTemporary()); 1612 E->setSubExpr(Record.readSubExpr()); 1613 } 1614 1615 void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { 1616 VisitExpr(E); 1617 E->TypeInfo = readTypeSourceInfo(); 1618 E->CXXScalarValueInitExprBits.RParenLoc = readSourceLocation(); 1619 } 1620 1621 void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) { 1622 VisitExpr(E); 1623 1624 bool IsArray = Record.readInt(); 1625 bool HasInit = Record.readInt(); 1626 unsigned NumPlacementArgs = Record.readInt(); 1627 bool IsParenTypeId = Record.readInt(); 1628 1629 E->CXXNewExprBits.IsGlobalNew = Record.readInt(); 1630 E->CXXNewExprBits.ShouldPassAlignment = Record.readInt(); 1631 E->CXXNewExprBits.UsualArrayDeleteWantsSize = Record.readInt(); 1632 E->CXXNewExprBits.StoredInitializationStyle = Record.readInt(); 1633 1634 assert((IsArray == E->isArray()) && "Wrong IsArray!"); 1635 assert((HasInit == E->hasInitializer()) && "Wrong HasInit!"); 1636 assert((NumPlacementArgs == E->getNumPlacementArgs()) && 1637 "Wrong NumPlacementArgs!"); 1638 assert((IsParenTypeId == E->isParenTypeId()) && "Wrong IsParenTypeId!"); 1639 (void)IsArray; 1640 (void)HasInit; 1641 (void)NumPlacementArgs; 1642 1643 E->setOperatorNew(readDeclAs<FunctionDecl>()); 1644 E->setOperatorDelete(readDeclAs<FunctionDecl>()); 1645 E->AllocatedTypeInfo = readTypeSourceInfo(); 1646 if (IsParenTypeId) 1647 E->getTrailingObjects<SourceRange>()[0] = readSourceRange(); 1648 E->Range = readSourceRange(); 1649 E->DirectInitRange = readSourceRange(); 1650 1651 // Install all the subexpressions. 1652 for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(), 1653 N = E->raw_arg_end(); 1654 I != N; ++I) 1655 *I = Record.readSubStmt(); 1656 } 1657 1658 void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 1659 VisitExpr(E); 1660 E->CXXDeleteExprBits.GlobalDelete = Record.readInt(); 1661 E->CXXDeleteExprBits.ArrayForm = Record.readInt(); 1662 E->CXXDeleteExprBits.ArrayFormAsWritten = Record.readInt(); 1663 E->CXXDeleteExprBits.UsualArrayDeleteWantsSize = Record.readInt(); 1664 E->OperatorDelete = readDeclAs<FunctionDecl>(); 1665 E->Argument = Record.readSubExpr(); 1666 E->CXXDeleteExprBits.Loc = readSourceLocation(); 1667 } 1668 1669 void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 1670 VisitExpr(E); 1671 1672 E->Base = Record.readSubExpr(); 1673 E->IsArrow = Record.readInt(); 1674 E->OperatorLoc = readSourceLocation(); 1675 E->QualifierLoc = Record.readNestedNameSpecifierLoc(); 1676 E->ScopeType = readTypeSourceInfo(); 1677 E->ColonColonLoc = readSourceLocation(); 1678 E->TildeLoc = readSourceLocation(); 1679 1680 IdentifierInfo *II = Record.readIdentifier(); 1681 if (II) 1682 E->setDestroyedType(II, readSourceLocation()); 1683 else 1684 E->setDestroyedType(readTypeSourceInfo()); 1685 } 1686 1687 void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) { 1688 VisitExpr(E); 1689 1690 unsigned NumObjects = Record.readInt(); 1691 assert(NumObjects == E->getNumObjects()); 1692 for (unsigned i = 0; i != NumObjects; ++i) 1693 E->getTrailingObjects<BlockDecl *>()[i] = 1694 readDeclAs<BlockDecl>(); 1695 1696 E->ExprWithCleanupsBits.CleanupsHaveSideEffects = Record.readInt(); 1697 E->SubExpr = Record.readSubExpr(); 1698 } 1699 1700 void ASTStmtReader::VisitCXXDependentScopeMemberExpr( 1701 CXXDependentScopeMemberExpr *E) { 1702 VisitExpr(E); 1703 1704 bool HasTemplateKWAndArgsInfo = Record.readInt(); 1705 unsigned NumTemplateArgs = Record.readInt(); 1706 bool HasFirstQualifierFoundInScope = Record.readInt(); 1707 1708 assert((HasTemplateKWAndArgsInfo == E->hasTemplateKWAndArgsInfo()) && 1709 "Wrong HasTemplateKWAndArgsInfo!"); 1710 assert( 1711 (HasFirstQualifierFoundInScope == E->hasFirstQualifierFoundInScope()) && 1712 "Wrong HasFirstQualifierFoundInScope!"); 1713 1714 if (HasTemplateKWAndArgsInfo) 1715 ReadTemplateKWAndArgsInfo( 1716 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), 1717 E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs); 1718 1719 assert((NumTemplateArgs == E->getNumTemplateArgs()) && 1720 "Wrong NumTemplateArgs!"); 1721 1722 E->CXXDependentScopeMemberExprBits.IsArrow = Record.readInt(); 1723 E->CXXDependentScopeMemberExprBits.OperatorLoc = readSourceLocation(); 1724 E->BaseType = Record.readType(); 1725 E->QualifierLoc = Record.readNestedNameSpecifierLoc(); 1726 E->Base = Record.readSubExpr(); 1727 1728 if (HasFirstQualifierFoundInScope) 1729 *E->getTrailingObjects<NamedDecl *>() = readDeclAs<NamedDecl>(); 1730 1731 E->MemberNameInfo = Record.readDeclarationNameInfo(); 1732 } 1733 1734 void 1735 ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { 1736 VisitExpr(E); 1737 1738 if (Record.readInt()) // HasTemplateKWAndArgsInfo 1739 ReadTemplateKWAndArgsInfo( 1740 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), 1741 E->getTrailingObjects<TemplateArgumentLoc>(), 1742 /*NumTemplateArgs=*/Record.readInt()); 1743 1744 E->QualifierLoc = Record.readNestedNameSpecifierLoc(); 1745 E->NameInfo = Record.readDeclarationNameInfo(); 1746 } 1747 1748 void 1749 ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) { 1750 VisitExpr(E); 1751 assert(Record.peekInt() == E->arg_size() && 1752 "Read wrong record during creation ?"); 1753 Record.skipInts(1); 1754 for (unsigned I = 0, N = E->arg_size(); I != N; ++I) 1755 E->setArg(I, Record.readSubExpr()); 1756 E->TSI = readTypeSourceInfo(); 1757 E->setLParenLoc(readSourceLocation()); 1758 E->setRParenLoc(readSourceLocation()); 1759 } 1760 1761 void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) { 1762 VisitExpr(E); 1763 1764 unsigned NumResults = Record.readInt(); 1765 bool HasTemplateKWAndArgsInfo = Record.readInt(); 1766 assert((E->getNumDecls() == NumResults) && "Wrong NumResults!"); 1767 assert((E->hasTemplateKWAndArgsInfo() == HasTemplateKWAndArgsInfo) && 1768 "Wrong HasTemplateKWAndArgsInfo!"); 1769 1770 if (HasTemplateKWAndArgsInfo) { 1771 unsigned NumTemplateArgs = Record.readInt(); 1772 ReadTemplateKWAndArgsInfo(*E->getTrailingASTTemplateKWAndArgsInfo(), 1773 E->getTrailingTemplateArgumentLoc(), 1774 NumTemplateArgs); 1775 assert((E->getNumTemplateArgs() == NumTemplateArgs) && 1776 "Wrong NumTemplateArgs!"); 1777 } 1778 1779 UnresolvedSet<8> Decls; 1780 for (unsigned I = 0; I != NumResults; ++I) { 1781 auto *D = readDeclAs<NamedDecl>(); 1782 auto AS = (AccessSpecifier)Record.readInt(); 1783 Decls.addDecl(D, AS); 1784 } 1785 1786 DeclAccessPair *Results = E->getTrailingResults(); 1787 UnresolvedSetIterator Iter = Decls.begin(); 1788 for (unsigned I = 0; I != NumResults; ++I) { 1789 Results[I] = (Iter + I).getPair(); 1790 } 1791 1792 E->NameInfo = Record.readDeclarationNameInfo(); 1793 E->QualifierLoc = Record.readNestedNameSpecifierLoc(); 1794 } 1795 1796 void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) { 1797 VisitOverloadExpr(E); 1798 E->UnresolvedMemberExprBits.IsArrow = Record.readInt(); 1799 E->UnresolvedMemberExprBits.HasUnresolvedUsing = Record.readInt(); 1800 E->Base = Record.readSubExpr(); 1801 E->BaseType = Record.readType(); 1802 E->OperatorLoc = readSourceLocation(); 1803 } 1804 1805 void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { 1806 VisitOverloadExpr(E); 1807 E->UnresolvedLookupExprBits.RequiresADL = Record.readInt(); 1808 E->UnresolvedLookupExprBits.Overloaded = Record.readInt(); 1809 E->NamingClass = readDeclAs<CXXRecordDecl>(); 1810 } 1811 1812 void ASTStmtReader::VisitTypeTraitExpr(TypeTraitExpr *E) { 1813 VisitExpr(E); 1814 E->TypeTraitExprBits.NumArgs = Record.readInt(); 1815 E->TypeTraitExprBits.Kind = Record.readInt(); 1816 E->TypeTraitExprBits.Value = Record.readInt(); 1817 SourceRange Range = readSourceRange(); 1818 E->Loc = Range.getBegin(); 1819 E->RParenLoc = Range.getEnd(); 1820 1821 auto **Args = E->getTrailingObjects<TypeSourceInfo *>(); 1822 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 1823 Args[I] = readTypeSourceInfo(); 1824 } 1825 1826 void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 1827 VisitExpr(E); 1828 E->ATT = (ArrayTypeTrait)Record.readInt(); 1829 E->Value = (unsigned int)Record.readInt(); 1830 SourceRange Range = readSourceRange(); 1831 E->Loc = Range.getBegin(); 1832 E->RParen = Range.getEnd(); 1833 E->QueriedType = readTypeSourceInfo(); 1834 E->Dimension = Record.readSubExpr(); 1835 } 1836 1837 void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 1838 VisitExpr(E); 1839 E->ET = (ExpressionTrait)Record.readInt(); 1840 E->Value = (bool)Record.readInt(); 1841 SourceRange Range = readSourceRange(); 1842 E->QueriedExpression = Record.readSubExpr(); 1843 E->Loc = Range.getBegin(); 1844 E->RParen = Range.getEnd(); 1845 } 1846 1847 void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 1848 VisitExpr(E); 1849 E->CXXNoexceptExprBits.Value = Record.readInt(); 1850 E->Range = readSourceRange(); 1851 E->Operand = Record.readSubExpr(); 1852 } 1853 1854 void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) { 1855 VisitExpr(E); 1856 E->EllipsisLoc = readSourceLocation(); 1857 E->NumExpansions = Record.readInt(); 1858 E->Pattern = Record.readSubExpr(); 1859 } 1860 1861 void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) { 1862 VisitExpr(E); 1863 unsigned NumPartialArgs = Record.readInt(); 1864 E->OperatorLoc = readSourceLocation(); 1865 E->PackLoc = readSourceLocation(); 1866 E->RParenLoc = readSourceLocation(); 1867 E->Pack = Record.readDeclAs<NamedDecl>(); 1868 if (E->isPartiallySubstituted()) { 1869 assert(E->Length == NumPartialArgs); 1870 for (auto *I = E->getTrailingObjects<TemplateArgument>(), 1871 *E = I + NumPartialArgs; 1872 I != E; ++I) 1873 new (I) TemplateArgument(Record.readTemplateArgument()); 1874 } else if (!E->isValueDependent()) { 1875 E->Length = Record.readInt(); 1876 } 1877 } 1878 1879 void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( 1880 SubstNonTypeTemplateParmExpr *E) { 1881 VisitExpr(E); 1882 E->Param = readDeclAs<NonTypeTemplateParmDecl>(); 1883 E->SubstNonTypeTemplateParmExprBits.NameLoc = readSourceLocation(); 1884 E->Replacement = Record.readSubExpr(); 1885 } 1886 1887 void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr( 1888 SubstNonTypeTemplateParmPackExpr *E) { 1889 VisitExpr(E); 1890 E->Param = readDeclAs<NonTypeTemplateParmDecl>(); 1891 TemplateArgument ArgPack = Record.readTemplateArgument(); 1892 if (ArgPack.getKind() != TemplateArgument::Pack) 1893 return; 1894 1895 E->Arguments = ArgPack.pack_begin(); 1896 E->NumArguments = ArgPack.pack_size(); 1897 E->NameLoc = readSourceLocation(); 1898 } 1899 1900 void ASTStmtReader::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) { 1901 VisitExpr(E); 1902 E->NumParameters = Record.readInt(); 1903 E->ParamPack = readDeclAs<ParmVarDecl>(); 1904 E->NameLoc = readSourceLocation(); 1905 auto **Parms = E->getTrailingObjects<VarDecl *>(); 1906 for (unsigned i = 0, n = E->NumParameters; i != n; ++i) 1907 Parms[i] = readDeclAs<VarDecl>(); 1908 } 1909 1910 void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) { 1911 VisitExpr(E); 1912 bool HasMaterialzedDecl = Record.readInt(); 1913 if (HasMaterialzedDecl) 1914 E->State = cast<LifetimeExtendedTemporaryDecl>(Record.readDecl()); 1915 else 1916 E->State = Record.readSubExpr(); 1917 } 1918 1919 void ASTStmtReader::VisitCXXFoldExpr(CXXFoldExpr *E) { 1920 VisitExpr(E); 1921 E->LParenLoc = readSourceLocation(); 1922 E->EllipsisLoc = readSourceLocation(); 1923 E->RParenLoc = readSourceLocation(); 1924 E->NumExpansions = Record.readInt(); 1925 E->SubExprs[0] = Record.readSubExpr(); 1926 E->SubExprs[1] = Record.readSubExpr(); 1927 E->Opcode = (BinaryOperatorKind)Record.readInt(); 1928 } 1929 1930 void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) { 1931 VisitExpr(E); 1932 E->SourceExpr = Record.readSubExpr(); 1933 E->OpaqueValueExprBits.Loc = readSourceLocation(); 1934 E->setIsUnique(Record.readInt()); 1935 } 1936 1937 void ASTStmtReader::VisitTypoExpr(TypoExpr *E) { 1938 llvm_unreachable("Cannot read TypoExpr nodes"); 1939 } 1940 1941 //===----------------------------------------------------------------------===// 1942 // Microsoft Expressions and Statements 1943 //===----------------------------------------------------------------------===// 1944 void ASTStmtReader::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) { 1945 VisitExpr(E); 1946 E->IsArrow = (Record.readInt() != 0); 1947 E->BaseExpr = Record.readSubExpr(); 1948 E->QualifierLoc = Record.readNestedNameSpecifierLoc(); 1949 E->MemberLoc = readSourceLocation(); 1950 E->TheDecl = readDeclAs<MSPropertyDecl>(); 1951 } 1952 1953 void ASTStmtReader::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) { 1954 VisitExpr(E); 1955 E->setBase(Record.readSubExpr()); 1956 E->setIdx(Record.readSubExpr()); 1957 E->setRBracketLoc(readSourceLocation()); 1958 } 1959 1960 void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) { 1961 VisitExpr(E); 1962 E->setSourceRange(readSourceRange()); 1963 std::string UuidStr = readString(); 1964 E->setUuidStr(StringRef(UuidStr).copy(Record.getContext())); 1965 if (E->isTypeOperand()) { // __uuidof(ComType) 1966 E->setTypeOperandSourceInfo( 1967 readTypeSourceInfo()); 1968 return; 1969 } 1970 1971 // __uuidof(expr) 1972 E->setExprOperand(Record.readSubExpr()); 1973 } 1974 1975 void ASTStmtReader::VisitSEHLeaveStmt(SEHLeaveStmt *S) { 1976 VisitStmt(S); 1977 S->setLeaveLoc(readSourceLocation()); 1978 } 1979 1980 void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) { 1981 VisitStmt(S); 1982 S->Loc = readSourceLocation(); 1983 S->Children[SEHExceptStmt::FILTER_EXPR] = Record.readSubStmt(); 1984 S->Children[SEHExceptStmt::BLOCK] = Record.readSubStmt(); 1985 } 1986 1987 void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) { 1988 VisitStmt(S); 1989 S->Loc = readSourceLocation(); 1990 S->Block = Record.readSubStmt(); 1991 } 1992 1993 void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) { 1994 VisitStmt(S); 1995 S->IsCXXTry = Record.readInt(); 1996 S->TryLoc = readSourceLocation(); 1997 S->Children[SEHTryStmt::TRY] = Record.readSubStmt(); 1998 S->Children[SEHTryStmt::HANDLER] = Record.readSubStmt(); 1999 } 2000 2001 //===----------------------------------------------------------------------===// 2002 // CUDA Expressions and Statements 2003 //===----------------------------------------------------------------------===// 2004 2005 void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 2006 VisitCallExpr(E); 2007 E->setPreArg(CUDAKernelCallExpr::CONFIG, Record.readSubExpr()); 2008 } 2009 2010 //===----------------------------------------------------------------------===// 2011 // OpenCL Expressions and Statements. 2012 //===----------------------------------------------------------------------===// 2013 void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) { 2014 VisitExpr(E); 2015 E->BuiltinLoc = readSourceLocation(); 2016 E->RParenLoc = readSourceLocation(); 2017 E->SrcExpr = Record.readSubExpr(); 2018 } 2019 2020 //===----------------------------------------------------------------------===// 2021 // OpenMP Directives. 2022 //===----------------------------------------------------------------------===// 2023 2024 void ASTStmtReader::VisitOMPExecutableDirective(OMPExecutableDirective *E) { 2025 E->setLocStart(readSourceLocation()); 2026 E->setLocEnd(readSourceLocation()); 2027 SmallVector<OMPClause *, 5> Clauses; 2028 for (unsigned i = 0; i < E->getNumClauses(); ++i) 2029 Clauses.push_back(Record.readOMPClause()); 2030 E->setClauses(Clauses); 2031 if (E->hasAssociatedStmt()) 2032 E->setAssociatedStmt(Record.readSubStmt()); 2033 } 2034 2035 void ASTStmtReader::VisitOMPLoopDirective(OMPLoopDirective *D) { 2036 VisitStmt(D); 2037 // Two fields (NumClauses and CollapsedNum) were read in ReadStmtFromStream. 2038 Record.skipInts(2); 2039 VisitOMPExecutableDirective(D); 2040 D->setIterationVariable(Record.readSubExpr()); 2041 D->setLastIteration(Record.readSubExpr()); 2042 D->setCalcLastIteration(Record.readSubExpr()); 2043 D->setPreCond(Record.readSubExpr()); 2044 D->setCond(Record.readSubExpr()); 2045 D->setInit(Record.readSubExpr()); 2046 D->setInc(Record.readSubExpr()); 2047 D->setPreInits(Record.readSubStmt()); 2048 if (isOpenMPWorksharingDirective(D->getDirectiveKind()) || 2049 isOpenMPTaskLoopDirective(D->getDirectiveKind()) || 2050 isOpenMPDistributeDirective(D->getDirectiveKind())) { 2051 D->setIsLastIterVariable(Record.readSubExpr()); 2052 D->setLowerBoundVariable(Record.readSubExpr()); 2053 D->setUpperBoundVariable(Record.readSubExpr()); 2054 D->setStrideVariable(Record.readSubExpr()); 2055 D->setEnsureUpperBound(Record.readSubExpr()); 2056 D->setNextLowerBound(Record.readSubExpr()); 2057 D->setNextUpperBound(Record.readSubExpr()); 2058 D->setNumIterations(Record.readSubExpr()); 2059 } 2060 if (isOpenMPLoopBoundSharingDirective(D->getDirectiveKind())) { 2061 D->setPrevLowerBoundVariable(Record.readSubExpr()); 2062 D->setPrevUpperBoundVariable(Record.readSubExpr()); 2063 D->setDistInc(Record.readSubExpr()); 2064 D->setPrevEnsureUpperBound(Record.readSubExpr()); 2065 D->setCombinedLowerBoundVariable(Record.readSubExpr()); 2066 D->setCombinedUpperBoundVariable(Record.readSubExpr()); 2067 D->setCombinedEnsureUpperBound(Record.readSubExpr()); 2068 D->setCombinedInit(Record.readSubExpr()); 2069 D->setCombinedCond(Record.readSubExpr()); 2070 D->setCombinedNextLowerBound(Record.readSubExpr()); 2071 D->setCombinedNextUpperBound(Record.readSubExpr()); 2072 D->setCombinedDistCond(Record.readSubExpr()); 2073 D->setCombinedParForInDistCond(Record.readSubExpr()); 2074 } 2075 SmallVector<Expr *, 4> Sub; 2076 unsigned CollapsedNum = D->getCollapsedNumber(); 2077 Sub.reserve(CollapsedNum); 2078 for (unsigned i = 0; i < CollapsedNum; ++i) 2079 Sub.push_back(Record.readSubExpr()); 2080 D->setCounters(Sub); 2081 Sub.clear(); 2082 for (unsigned i = 0; i < CollapsedNum; ++i) 2083 Sub.push_back(Record.readSubExpr()); 2084 D->setPrivateCounters(Sub); 2085 Sub.clear(); 2086 for (unsigned i = 0; i < CollapsedNum; ++i) 2087 Sub.push_back(Record.readSubExpr()); 2088 D->setInits(Sub); 2089 Sub.clear(); 2090 for (unsigned i = 0; i < CollapsedNum; ++i) 2091 Sub.push_back(Record.readSubExpr()); 2092 D->setUpdates(Sub); 2093 Sub.clear(); 2094 for (unsigned i = 0; i < CollapsedNum; ++i) 2095 Sub.push_back(Record.readSubExpr()); 2096 D->setFinals(Sub); 2097 Sub.clear(); 2098 for (unsigned i = 0; i < CollapsedNum; ++i) 2099 Sub.push_back(Record.readSubExpr()); 2100 D->setDependentCounters(Sub); 2101 Sub.clear(); 2102 for (unsigned i = 0; i < CollapsedNum; ++i) 2103 Sub.push_back(Record.readSubExpr()); 2104 D->setDependentInits(Sub); 2105 Sub.clear(); 2106 for (unsigned i = 0; i < CollapsedNum; ++i) 2107 Sub.push_back(Record.readSubExpr()); 2108 D->setFinalsConditions(Sub); 2109 } 2110 2111 void ASTStmtReader::VisitOMPParallelDirective(OMPParallelDirective *D) { 2112 VisitStmt(D); 2113 // The NumClauses field was read in ReadStmtFromStream. 2114 Record.skipInts(1); 2115 VisitOMPExecutableDirective(D); 2116 D->setHasCancel(Record.readInt()); 2117 } 2118 2119 void ASTStmtReader::VisitOMPSimdDirective(OMPSimdDirective *D) { 2120 VisitOMPLoopDirective(D); 2121 } 2122 2123 void ASTStmtReader::VisitOMPForDirective(OMPForDirective *D) { 2124 VisitOMPLoopDirective(D); 2125 D->setHasCancel(Record.readInt()); 2126 } 2127 2128 void ASTStmtReader::VisitOMPForSimdDirective(OMPForSimdDirective *D) { 2129 VisitOMPLoopDirective(D); 2130 } 2131 2132 void ASTStmtReader::VisitOMPSectionsDirective(OMPSectionsDirective *D) { 2133 VisitStmt(D); 2134 // The NumClauses field was read in ReadStmtFromStream. 2135 Record.skipInts(1); 2136 VisitOMPExecutableDirective(D); 2137 D->setHasCancel(Record.readInt()); 2138 } 2139 2140 void ASTStmtReader::VisitOMPSectionDirective(OMPSectionDirective *D) { 2141 VisitStmt(D); 2142 VisitOMPExecutableDirective(D); 2143 D->setHasCancel(Record.readInt()); 2144 } 2145 2146 void ASTStmtReader::VisitOMPSingleDirective(OMPSingleDirective *D) { 2147 VisitStmt(D); 2148 // The NumClauses field was read in ReadStmtFromStream. 2149 Record.skipInts(1); 2150 VisitOMPExecutableDirective(D); 2151 } 2152 2153 void ASTStmtReader::VisitOMPMasterDirective(OMPMasterDirective *D) { 2154 VisitStmt(D); 2155 VisitOMPExecutableDirective(D); 2156 } 2157 2158 void ASTStmtReader::VisitOMPCriticalDirective(OMPCriticalDirective *D) { 2159 VisitStmt(D); 2160 // The NumClauses field was read in ReadStmtFromStream. 2161 Record.skipInts(1); 2162 VisitOMPExecutableDirective(D); 2163 D->DirName = Record.readDeclarationNameInfo(); 2164 } 2165 2166 void ASTStmtReader::VisitOMPParallelForDirective(OMPParallelForDirective *D) { 2167 VisitOMPLoopDirective(D); 2168 D->setHasCancel(Record.readInt()); 2169 } 2170 2171 void ASTStmtReader::VisitOMPParallelForSimdDirective( 2172 OMPParallelForSimdDirective *D) { 2173 VisitOMPLoopDirective(D); 2174 } 2175 2176 void ASTStmtReader::VisitOMPParallelMasterDirective( 2177 OMPParallelMasterDirective *D) { 2178 VisitStmt(D); 2179 // The NumClauses field was read in ReadStmtFromStream. 2180 Record.skipInts(1); 2181 VisitOMPExecutableDirective(D); 2182 } 2183 2184 void ASTStmtReader::VisitOMPParallelSectionsDirective( 2185 OMPParallelSectionsDirective *D) { 2186 VisitStmt(D); 2187 // The NumClauses field was read in ReadStmtFromStream. 2188 Record.skipInts(1); 2189 VisitOMPExecutableDirective(D); 2190 D->setHasCancel(Record.readInt()); 2191 } 2192 2193 void ASTStmtReader::VisitOMPTaskDirective(OMPTaskDirective *D) { 2194 VisitStmt(D); 2195 // The NumClauses field was read in ReadStmtFromStream. 2196 Record.skipInts(1); 2197 VisitOMPExecutableDirective(D); 2198 D->setHasCancel(Record.readInt()); 2199 } 2200 2201 void ASTStmtReader::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) { 2202 VisitStmt(D); 2203 VisitOMPExecutableDirective(D); 2204 } 2205 2206 void ASTStmtReader::VisitOMPBarrierDirective(OMPBarrierDirective *D) { 2207 VisitStmt(D); 2208 VisitOMPExecutableDirective(D); 2209 } 2210 2211 void ASTStmtReader::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 2212 VisitStmt(D); 2213 VisitOMPExecutableDirective(D); 2214 } 2215 2216 void ASTStmtReader::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) { 2217 VisitStmt(D); 2218 // The NumClauses field was read in ReadStmtFromStream. 2219 Record.skipInts(1); 2220 VisitOMPExecutableDirective(D); 2221 D->setReductionRef(Record.readSubExpr()); 2222 } 2223 2224 void ASTStmtReader::VisitOMPFlushDirective(OMPFlushDirective *D) { 2225 VisitStmt(D); 2226 // The NumClauses field was read in ReadStmtFromStream. 2227 Record.skipInts(1); 2228 VisitOMPExecutableDirective(D); 2229 } 2230 2231 void ASTStmtReader::VisitOMPOrderedDirective(OMPOrderedDirective *D) { 2232 VisitStmt(D); 2233 // The NumClauses field was read in ReadStmtFromStream. 2234 Record.skipInts(1); 2235 VisitOMPExecutableDirective(D); 2236 } 2237 2238 void ASTStmtReader::VisitOMPAtomicDirective(OMPAtomicDirective *D) { 2239 VisitStmt(D); 2240 // The NumClauses field was read in ReadStmtFromStream. 2241 Record.skipInts(1); 2242 VisitOMPExecutableDirective(D); 2243 D->setX(Record.readSubExpr()); 2244 D->setV(Record.readSubExpr()); 2245 D->setExpr(Record.readSubExpr()); 2246 D->setUpdateExpr(Record.readSubExpr()); 2247 D->IsXLHSInRHSPart = Record.readInt() != 0; 2248 D->IsPostfixUpdate = Record.readInt() != 0; 2249 } 2250 2251 void ASTStmtReader::VisitOMPTargetDirective(OMPTargetDirective *D) { 2252 VisitStmt(D); 2253 // The NumClauses field was read in ReadStmtFromStream. 2254 Record.skipInts(1); 2255 VisitOMPExecutableDirective(D); 2256 } 2257 2258 void ASTStmtReader::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) { 2259 VisitStmt(D); 2260 Record.skipInts(1); 2261 VisitOMPExecutableDirective(D); 2262 } 2263 2264 void ASTStmtReader::VisitOMPTargetEnterDataDirective( 2265 OMPTargetEnterDataDirective *D) { 2266 VisitStmt(D); 2267 Record.skipInts(1); 2268 VisitOMPExecutableDirective(D); 2269 } 2270 2271 void ASTStmtReader::VisitOMPTargetExitDataDirective( 2272 OMPTargetExitDataDirective *D) { 2273 VisitStmt(D); 2274 Record.skipInts(1); 2275 VisitOMPExecutableDirective(D); 2276 } 2277 2278 void ASTStmtReader::VisitOMPTargetParallelDirective( 2279 OMPTargetParallelDirective *D) { 2280 VisitStmt(D); 2281 Record.skipInts(1); 2282 VisitOMPExecutableDirective(D); 2283 } 2284 2285 void ASTStmtReader::VisitOMPTargetParallelForDirective( 2286 OMPTargetParallelForDirective *D) { 2287 VisitOMPLoopDirective(D); 2288 D->setHasCancel(Record.readInt()); 2289 } 2290 2291 void ASTStmtReader::VisitOMPTeamsDirective(OMPTeamsDirective *D) { 2292 VisitStmt(D); 2293 // The NumClauses field was read in ReadStmtFromStream. 2294 Record.skipInts(1); 2295 VisitOMPExecutableDirective(D); 2296 } 2297 2298 void ASTStmtReader::VisitOMPCancellationPointDirective( 2299 OMPCancellationPointDirective *D) { 2300 VisitStmt(D); 2301 VisitOMPExecutableDirective(D); 2302 D->setCancelRegion(static_cast<OpenMPDirectiveKind>(Record.readInt())); 2303 } 2304 2305 void ASTStmtReader::VisitOMPCancelDirective(OMPCancelDirective *D) { 2306 VisitStmt(D); 2307 // The NumClauses field was read in ReadStmtFromStream. 2308 Record.skipInts(1); 2309 VisitOMPExecutableDirective(D); 2310 D->setCancelRegion(static_cast<OpenMPDirectiveKind>(Record.readInt())); 2311 } 2312 2313 void ASTStmtReader::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 2314 VisitOMPLoopDirective(D); 2315 } 2316 2317 void ASTStmtReader::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) { 2318 VisitOMPLoopDirective(D); 2319 } 2320 2321 void ASTStmtReader::VisitOMPMasterTaskLoopDirective( 2322 OMPMasterTaskLoopDirective *D) { 2323 VisitOMPLoopDirective(D); 2324 } 2325 2326 void ASTStmtReader::VisitOMPMasterTaskLoopSimdDirective( 2327 OMPMasterTaskLoopSimdDirective *D) { 2328 VisitOMPLoopDirective(D); 2329 } 2330 2331 void ASTStmtReader::VisitOMPParallelMasterTaskLoopDirective( 2332 OMPParallelMasterTaskLoopDirective *D) { 2333 VisitOMPLoopDirective(D); 2334 } 2335 2336 void ASTStmtReader::VisitOMPParallelMasterTaskLoopSimdDirective( 2337 OMPParallelMasterTaskLoopSimdDirective *D) { 2338 VisitOMPLoopDirective(D); 2339 } 2340 2341 void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective *D) { 2342 VisitOMPLoopDirective(D); 2343 } 2344 2345 void ASTStmtReader::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) { 2346 VisitStmt(D); 2347 Record.skipInts(1); 2348 VisitOMPExecutableDirective(D); 2349 } 2350 2351 void ASTStmtReader::VisitOMPDistributeParallelForDirective( 2352 OMPDistributeParallelForDirective *D) { 2353 VisitOMPLoopDirective(D); 2354 D->setHasCancel(Record.readInt()); 2355 } 2356 2357 void ASTStmtReader::VisitOMPDistributeParallelForSimdDirective( 2358 OMPDistributeParallelForSimdDirective *D) { 2359 VisitOMPLoopDirective(D); 2360 } 2361 2362 void ASTStmtReader::VisitOMPDistributeSimdDirective( 2363 OMPDistributeSimdDirective *D) { 2364 VisitOMPLoopDirective(D); 2365 } 2366 2367 void ASTStmtReader::VisitOMPTargetParallelForSimdDirective( 2368 OMPTargetParallelForSimdDirective *D) { 2369 VisitOMPLoopDirective(D); 2370 } 2371 2372 void ASTStmtReader::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *D) { 2373 VisitOMPLoopDirective(D); 2374 } 2375 2376 void ASTStmtReader::VisitOMPTeamsDistributeDirective( 2377 OMPTeamsDistributeDirective *D) { 2378 VisitOMPLoopDirective(D); 2379 } 2380 2381 void ASTStmtReader::VisitOMPTeamsDistributeSimdDirective( 2382 OMPTeamsDistributeSimdDirective *D) { 2383 VisitOMPLoopDirective(D); 2384 } 2385 2386 void ASTStmtReader::VisitOMPTeamsDistributeParallelForSimdDirective( 2387 OMPTeamsDistributeParallelForSimdDirective *D) { 2388 VisitOMPLoopDirective(D); 2389 } 2390 2391 void ASTStmtReader::VisitOMPTeamsDistributeParallelForDirective( 2392 OMPTeamsDistributeParallelForDirective *D) { 2393 VisitOMPLoopDirective(D); 2394 D->setHasCancel(Record.readInt()); 2395 } 2396 2397 void ASTStmtReader::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *D) { 2398 VisitStmt(D); 2399 // The NumClauses field was read in ReadStmtFromStream. 2400 Record.skipInts(1); 2401 VisitOMPExecutableDirective(D); 2402 } 2403 2404 void ASTStmtReader::VisitOMPTargetTeamsDistributeDirective( 2405 OMPTargetTeamsDistributeDirective *D) { 2406 VisitOMPLoopDirective(D); 2407 } 2408 2409 void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForDirective( 2410 OMPTargetTeamsDistributeParallelForDirective *D) { 2411 VisitOMPLoopDirective(D); 2412 D->setHasCancel(Record.readInt()); 2413 } 2414 2415 void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForSimdDirective( 2416 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 2417 VisitOMPLoopDirective(D); 2418 } 2419 2420 void ASTStmtReader::VisitOMPTargetTeamsDistributeSimdDirective( 2421 OMPTargetTeamsDistributeSimdDirective *D) { 2422 VisitOMPLoopDirective(D); 2423 } 2424 2425 //===----------------------------------------------------------------------===// 2426 // ASTReader Implementation 2427 //===----------------------------------------------------------------------===// 2428 2429 Stmt *ASTReader::ReadStmt(ModuleFile &F) { 2430 switch (ReadingKind) { 2431 case Read_None: 2432 llvm_unreachable("should not call this when not reading anything"); 2433 case Read_Decl: 2434 case Read_Type: 2435 return ReadStmtFromStream(F); 2436 case Read_Stmt: 2437 return ReadSubStmt(); 2438 } 2439 2440 llvm_unreachable("ReadingKind not set ?"); 2441 } 2442 2443 Expr *ASTReader::ReadExpr(ModuleFile &F) { 2444 return cast_or_null<Expr>(ReadStmt(F)); 2445 } 2446 2447 Expr *ASTReader::ReadSubExpr() { 2448 return cast_or_null<Expr>(ReadSubStmt()); 2449 } 2450 2451 // Within the bitstream, expressions are stored in Reverse Polish 2452 // Notation, with each of the subexpressions preceding the 2453 // expression they are stored in. Subexpressions are stored from last to first. 2454 // To evaluate expressions, we continue reading expressions and placing them on 2455 // the stack, with expressions having operands removing those operands from the 2456 // stack. Evaluation terminates when we see a STMT_STOP record, and 2457 // the single remaining expression on the stack is our result. 2458 Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) { 2459 ReadingKindTracker ReadingKind(Read_Stmt, *this); 2460 llvm::BitstreamCursor &Cursor = F.DeclsCursor; 2461 2462 // Map of offset to previously deserialized stmt. The offset points 2463 // just after the stmt record. 2464 llvm::DenseMap<uint64_t, Stmt *> StmtEntries; 2465 2466 #ifndef NDEBUG 2467 unsigned PrevNumStmts = StmtStack.size(); 2468 #endif 2469 2470 ASTRecordReader Record(*this, F); 2471 ASTStmtReader Reader(Record, Cursor); 2472 Stmt::EmptyShell Empty; 2473 2474 while (true) { 2475 llvm::Expected<llvm::BitstreamEntry> MaybeEntry = 2476 Cursor.advanceSkippingSubblocks(); 2477 if (!MaybeEntry) { 2478 Error(toString(MaybeEntry.takeError())); 2479 return nullptr; 2480 } 2481 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2482 2483 switch (Entry.Kind) { 2484 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 2485 case llvm::BitstreamEntry::Error: 2486 Error("malformed block record in AST file"); 2487 return nullptr; 2488 case llvm::BitstreamEntry::EndBlock: 2489 goto Done; 2490 case llvm::BitstreamEntry::Record: 2491 // The interesting case. 2492 break; 2493 } 2494 2495 ASTContext &Context = getContext(); 2496 Stmt *S = nullptr; 2497 bool Finished = false; 2498 bool IsStmtReference = false; 2499 Expected<unsigned> MaybeStmtCode = Record.readRecord(Cursor, Entry.ID); 2500 if (!MaybeStmtCode) { 2501 Error(toString(MaybeStmtCode.takeError())); 2502 return nullptr; 2503 } 2504 switch ((StmtCode)MaybeStmtCode.get()) { 2505 case STMT_STOP: 2506 Finished = true; 2507 break; 2508 2509 case STMT_REF_PTR: 2510 IsStmtReference = true; 2511 assert(StmtEntries.find(Record[0]) != StmtEntries.end() && 2512 "No stmt was recorded for this offset reference!"); 2513 S = StmtEntries[Record.readInt()]; 2514 break; 2515 2516 case STMT_NULL_PTR: 2517 S = nullptr; 2518 break; 2519 2520 case STMT_NULL: 2521 S = new (Context) NullStmt(Empty); 2522 break; 2523 2524 case STMT_COMPOUND: 2525 S = CompoundStmt::CreateEmpty( 2526 Context, /*NumStmts=*/Record[ASTStmtReader::NumStmtFields]); 2527 break; 2528 2529 case STMT_CASE: 2530 S = CaseStmt::CreateEmpty( 2531 Context, 2532 /*CaseStmtIsGNURange*/ Record[ASTStmtReader::NumStmtFields + 3]); 2533 break; 2534 2535 case STMT_DEFAULT: 2536 S = new (Context) DefaultStmt(Empty); 2537 break; 2538 2539 case STMT_LABEL: 2540 S = new (Context) LabelStmt(Empty); 2541 break; 2542 2543 case STMT_ATTRIBUTED: 2544 S = AttributedStmt::CreateEmpty( 2545 Context, 2546 /*NumAttrs*/Record[ASTStmtReader::NumStmtFields]); 2547 break; 2548 2549 case STMT_IF: 2550 S = IfStmt::CreateEmpty( 2551 Context, 2552 /* HasElse=*/Record[ASTStmtReader::NumStmtFields + 1], 2553 /* HasVar=*/Record[ASTStmtReader::NumStmtFields + 2], 2554 /* HasInit=*/Record[ASTStmtReader::NumStmtFields + 3]); 2555 break; 2556 2557 case STMT_SWITCH: 2558 S = SwitchStmt::CreateEmpty( 2559 Context, 2560 /* HasInit=*/Record[ASTStmtReader::NumStmtFields], 2561 /* HasVar=*/Record[ASTStmtReader::NumStmtFields + 1]); 2562 break; 2563 2564 case STMT_WHILE: 2565 S = WhileStmt::CreateEmpty( 2566 Context, 2567 /* HasVar=*/Record[ASTStmtReader::NumStmtFields]); 2568 break; 2569 2570 case STMT_DO: 2571 S = new (Context) DoStmt(Empty); 2572 break; 2573 2574 case STMT_FOR: 2575 S = new (Context) ForStmt(Empty); 2576 break; 2577 2578 case STMT_GOTO: 2579 S = new (Context) GotoStmt(Empty); 2580 break; 2581 2582 case STMT_INDIRECT_GOTO: 2583 S = new (Context) IndirectGotoStmt(Empty); 2584 break; 2585 2586 case STMT_CONTINUE: 2587 S = new (Context) ContinueStmt(Empty); 2588 break; 2589 2590 case STMT_BREAK: 2591 S = new (Context) BreakStmt(Empty); 2592 break; 2593 2594 case STMT_RETURN: 2595 S = ReturnStmt::CreateEmpty( 2596 Context, /* HasNRVOCandidate=*/Record[ASTStmtReader::NumStmtFields]); 2597 break; 2598 2599 case STMT_DECL: 2600 S = new (Context) DeclStmt(Empty); 2601 break; 2602 2603 case STMT_GCCASM: 2604 S = new (Context) GCCAsmStmt(Empty); 2605 break; 2606 2607 case STMT_MSASM: 2608 S = new (Context) MSAsmStmt(Empty); 2609 break; 2610 2611 case STMT_CAPTURED: 2612 S = CapturedStmt::CreateDeserialized( 2613 Context, Record[ASTStmtReader::NumStmtFields]); 2614 break; 2615 2616 case EXPR_CONSTANT: 2617 S = ConstantExpr::CreateEmpty( 2618 Context, 2619 static_cast<ConstantExpr::ResultStorageKind>( 2620 Record[ASTStmtReader::NumExprFields]), 2621 Empty); 2622 break; 2623 2624 case EXPR_PREDEFINED: 2625 S = PredefinedExpr::CreateEmpty( 2626 Context, 2627 /*HasFunctionName*/ Record[ASTStmtReader::NumExprFields]); 2628 break; 2629 2630 case EXPR_DECL_REF: 2631 S = DeclRefExpr::CreateEmpty( 2632 Context, 2633 /*HasQualifier=*/Record[ASTStmtReader::NumExprFields], 2634 /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1], 2635 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 2], 2636 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ? 2637 Record[ASTStmtReader::NumExprFields + 6] : 0); 2638 break; 2639 2640 case EXPR_INTEGER_LITERAL: 2641 S = IntegerLiteral::Create(Context, Empty); 2642 break; 2643 2644 case EXPR_FLOATING_LITERAL: 2645 S = FloatingLiteral::Create(Context, Empty); 2646 break; 2647 2648 case EXPR_IMAGINARY_LITERAL: 2649 S = new (Context) ImaginaryLiteral(Empty); 2650 break; 2651 2652 case EXPR_STRING_LITERAL: 2653 S = StringLiteral::CreateEmpty( 2654 Context, 2655 /* NumConcatenated=*/Record[ASTStmtReader::NumExprFields], 2656 /* Length=*/Record[ASTStmtReader::NumExprFields + 1], 2657 /* CharByteWidth=*/Record[ASTStmtReader::NumExprFields + 2]); 2658 break; 2659 2660 case EXPR_CHARACTER_LITERAL: 2661 S = new (Context) CharacterLiteral(Empty); 2662 break; 2663 2664 case EXPR_PAREN: 2665 S = new (Context) ParenExpr(Empty); 2666 break; 2667 2668 case EXPR_PAREN_LIST: 2669 S = ParenListExpr::CreateEmpty( 2670 Context, 2671 /* NumExprs=*/Record[ASTStmtReader::NumExprFields]); 2672 break; 2673 2674 case EXPR_UNARY_OPERATOR: 2675 S = new (Context) UnaryOperator(Empty); 2676 break; 2677 2678 case EXPR_OFFSETOF: 2679 S = OffsetOfExpr::CreateEmpty(Context, 2680 Record[ASTStmtReader::NumExprFields], 2681 Record[ASTStmtReader::NumExprFields + 1]); 2682 break; 2683 2684 case EXPR_SIZEOF_ALIGN_OF: 2685 S = new (Context) UnaryExprOrTypeTraitExpr(Empty); 2686 break; 2687 2688 case EXPR_ARRAY_SUBSCRIPT: 2689 S = new (Context) ArraySubscriptExpr(Empty); 2690 break; 2691 2692 case EXPR_OMP_ARRAY_SECTION: 2693 S = new (Context) OMPArraySectionExpr(Empty); 2694 break; 2695 2696 case EXPR_CALL: 2697 S = CallExpr::CreateEmpty( 2698 Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty); 2699 break; 2700 2701 case EXPR_MEMBER: 2702 S = MemberExpr::CreateEmpty(Context, Record[ASTStmtReader::NumExprFields], 2703 Record[ASTStmtReader::NumExprFields + 1], 2704 Record[ASTStmtReader::NumExprFields + 2], 2705 Record[ASTStmtReader::NumExprFields + 3]); 2706 break; 2707 2708 case EXPR_BINARY_OPERATOR: 2709 S = new (Context) BinaryOperator(Empty); 2710 break; 2711 2712 case EXPR_COMPOUND_ASSIGN_OPERATOR: 2713 S = new (Context) CompoundAssignOperator(Empty); 2714 break; 2715 2716 case EXPR_CONDITIONAL_OPERATOR: 2717 S = new (Context) ConditionalOperator(Empty); 2718 break; 2719 2720 case EXPR_BINARY_CONDITIONAL_OPERATOR: 2721 S = new (Context) BinaryConditionalOperator(Empty); 2722 break; 2723 2724 case EXPR_IMPLICIT_CAST: 2725 S = ImplicitCastExpr::CreateEmpty(Context, 2726 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 2727 break; 2728 2729 case EXPR_CSTYLE_CAST: 2730 S = CStyleCastExpr::CreateEmpty(Context, 2731 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 2732 break; 2733 2734 case EXPR_COMPOUND_LITERAL: 2735 S = new (Context) CompoundLiteralExpr(Empty); 2736 break; 2737 2738 case EXPR_EXT_VECTOR_ELEMENT: 2739 S = new (Context) ExtVectorElementExpr(Empty); 2740 break; 2741 2742 case EXPR_INIT_LIST: 2743 S = new (Context) InitListExpr(Empty); 2744 break; 2745 2746 case EXPR_DESIGNATED_INIT: 2747 S = DesignatedInitExpr::CreateEmpty(Context, 2748 Record[ASTStmtReader::NumExprFields] - 1); 2749 2750 break; 2751 2752 case EXPR_DESIGNATED_INIT_UPDATE: 2753 S = new (Context) DesignatedInitUpdateExpr(Empty); 2754 break; 2755 2756 case EXPR_IMPLICIT_VALUE_INIT: 2757 S = new (Context) ImplicitValueInitExpr(Empty); 2758 break; 2759 2760 case EXPR_NO_INIT: 2761 S = new (Context) NoInitExpr(Empty); 2762 break; 2763 2764 case EXPR_ARRAY_INIT_LOOP: 2765 S = new (Context) ArrayInitLoopExpr(Empty); 2766 break; 2767 2768 case EXPR_ARRAY_INIT_INDEX: 2769 S = new (Context) ArrayInitIndexExpr(Empty); 2770 break; 2771 2772 case EXPR_VA_ARG: 2773 S = new (Context) VAArgExpr(Empty); 2774 break; 2775 2776 case EXPR_SOURCE_LOC: 2777 S = new (Context) SourceLocExpr(Empty); 2778 break; 2779 2780 case EXPR_ADDR_LABEL: 2781 S = new (Context) AddrLabelExpr(Empty); 2782 break; 2783 2784 case EXPR_STMT: 2785 S = new (Context) StmtExpr(Empty); 2786 break; 2787 2788 case EXPR_CHOOSE: 2789 S = new (Context) ChooseExpr(Empty); 2790 break; 2791 2792 case EXPR_GNU_NULL: 2793 S = new (Context) GNUNullExpr(Empty); 2794 break; 2795 2796 case EXPR_SHUFFLE_VECTOR: 2797 S = new (Context) ShuffleVectorExpr(Empty); 2798 break; 2799 2800 case EXPR_CONVERT_VECTOR: 2801 S = new (Context) ConvertVectorExpr(Empty); 2802 break; 2803 2804 case EXPR_BLOCK: 2805 S = new (Context) BlockExpr(Empty); 2806 break; 2807 2808 case EXPR_GENERIC_SELECTION: 2809 S = GenericSelectionExpr::CreateEmpty( 2810 Context, 2811 /*NumAssocs=*/Record[ASTStmtReader::NumExprFields]); 2812 break; 2813 2814 case EXPR_OBJC_STRING_LITERAL: 2815 S = new (Context) ObjCStringLiteral(Empty); 2816 break; 2817 2818 case EXPR_OBJC_BOXED_EXPRESSION: 2819 S = new (Context) ObjCBoxedExpr(Empty); 2820 break; 2821 2822 case EXPR_OBJC_ARRAY_LITERAL: 2823 S = ObjCArrayLiteral::CreateEmpty(Context, 2824 Record[ASTStmtReader::NumExprFields]); 2825 break; 2826 2827 case EXPR_OBJC_DICTIONARY_LITERAL: 2828 S = ObjCDictionaryLiteral::CreateEmpty(Context, 2829 Record[ASTStmtReader::NumExprFields], 2830 Record[ASTStmtReader::NumExprFields + 1]); 2831 break; 2832 2833 case EXPR_OBJC_ENCODE: 2834 S = new (Context) ObjCEncodeExpr(Empty); 2835 break; 2836 2837 case EXPR_OBJC_SELECTOR_EXPR: 2838 S = new (Context) ObjCSelectorExpr(Empty); 2839 break; 2840 2841 case EXPR_OBJC_PROTOCOL_EXPR: 2842 S = new (Context) ObjCProtocolExpr(Empty); 2843 break; 2844 2845 case EXPR_OBJC_IVAR_REF_EXPR: 2846 S = new (Context) ObjCIvarRefExpr(Empty); 2847 break; 2848 2849 case EXPR_OBJC_PROPERTY_REF_EXPR: 2850 S = new (Context) ObjCPropertyRefExpr(Empty); 2851 break; 2852 2853 case EXPR_OBJC_SUBSCRIPT_REF_EXPR: 2854 S = new (Context) ObjCSubscriptRefExpr(Empty); 2855 break; 2856 2857 case EXPR_OBJC_KVC_REF_EXPR: 2858 llvm_unreachable("mismatching AST file"); 2859 2860 case EXPR_OBJC_MESSAGE_EXPR: 2861 S = ObjCMessageExpr::CreateEmpty(Context, 2862 Record[ASTStmtReader::NumExprFields], 2863 Record[ASTStmtReader::NumExprFields + 1]); 2864 break; 2865 2866 case EXPR_OBJC_ISA: 2867 S = new (Context) ObjCIsaExpr(Empty); 2868 break; 2869 2870 case EXPR_OBJC_INDIRECT_COPY_RESTORE: 2871 S = new (Context) ObjCIndirectCopyRestoreExpr(Empty); 2872 break; 2873 2874 case EXPR_OBJC_BRIDGED_CAST: 2875 S = new (Context) ObjCBridgedCastExpr(Empty); 2876 break; 2877 2878 case STMT_OBJC_FOR_COLLECTION: 2879 S = new (Context) ObjCForCollectionStmt(Empty); 2880 break; 2881 2882 case STMT_OBJC_CATCH: 2883 S = new (Context) ObjCAtCatchStmt(Empty); 2884 break; 2885 2886 case STMT_OBJC_FINALLY: 2887 S = new (Context) ObjCAtFinallyStmt(Empty); 2888 break; 2889 2890 case STMT_OBJC_AT_TRY: 2891 S = ObjCAtTryStmt::CreateEmpty(Context, 2892 Record[ASTStmtReader::NumStmtFields], 2893 Record[ASTStmtReader::NumStmtFields + 1]); 2894 break; 2895 2896 case STMT_OBJC_AT_SYNCHRONIZED: 2897 S = new (Context) ObjCAtSynchronizedStmt(Empty); 2898 break; 2899 2900 case STMT_OBJC_AT_THROW: 2901 S = new (Context) ObjCAtThrowStmt(Empty); 2902 break; 2903 2904 case STMT_OBJC_AUTORELEASE_POOL: 2905 S = new (Context) ObjCAutoreleasePoolStmt(Empty); 2906 break; 2907 2908 case EXPR_OBJC_BOOL_LITERAL: 2909 S = new (Context) ObjCBoolLiteralExpr(Empty); 2910 break; 2911 2912 case EXPR_OBJC_AVAILABILITY_CHECK: 2913 S = new (Context) ObjCAvailabilityCheckExpr(Empty); 2914 break; 2915 2916 case STMT_SEH_LEAVE: 2917 S = new (Context) SEHLeaveStmt(Empty); 2918 break; 2919 2920 case STMT_SEH_EXCEPT: 2921 S = new (Context) SEHExceptStmt(Empty); 2922 break; 2923 2924 case STMT_SEH_FINALLY: 2925 S = new (Context) SEHFinallyStmt(Empty); 2926 break; 2927 2928 case STMT_SEH_TRY: 2929 S = new (Context) SEHTryStmt(Empty); 2930 break; 2931 2932 case STMT_CXX_CATCH: 2933 S = new (Context) CXXCatchStmt(Empty); 2934 break; 2935 2936 case STMT_CXX_TRY: 2937 S = CXXTryStmt::Create(Context, Empty, 2938 /*numHandlers=*/Record[ASTStmtReader::NumStmtFields]); 2939 break; 2940 2941 case STMT_CXX_FOR_RANGE: 2942 S = new (Context) CXXForRangeStmt(Empty); 2943 break; 2944 2945 case STMT_MS_DEPENDENT_EXISTS: 2946 S = new (Context) MSDependentExistsStmt(SourceLocation(), true, 2947 NestedNameSpecifierLoc(), 2948 DeclarationNameInfo(), 2949 nullptr); 2950 break; 2951 2952 case STMT_OMP_PARALLEL_DIRECTIVE: 2953 S = 2954 OMPParallelDirective::CreateEmpty(Context, 2955 Record[ASTStmtReader::NumStmtFields], 2956 Empty); 2957 break; 2958 2959 case STMT_OMP_SIMD_DIRECTIVE: { 2960 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 2961 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 2962 S = OMPSimdDirective::CreateEmpty(Context, NumClauses, 2963 CollapsedNum, Empty); 2964 break; 2965 } 2966 2967 case STMT_OMP_FOR_DIRECTIVE: { 2968 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 2969 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 2970 S = OMPForDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 2971 Empty); 2972 break; 2973 } 2974 2975 case STMT_OMP_FOR_SIMD_DIRECTIVE: { 2976 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 2977 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 2978 S = OMPForSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 2979 Empty); 2980 break; 2981 } 2982 2983 case STMT_OMP_SECTIONS_DIRECTIVE: 2984 S = OMPSectionsDirective::CreateEmpty( 2985 Context, Record[ASTStmtReader::NumStmtFields], Empty); 2986 break; 2987 2988 case STMT_OMP_SECTION_DIRECTIVE: 2989 S = OMPSectionDirective::CreateEmpty(Context, Empty); 2990 break; 2991 2992 case STMT_OMP_SINGLE_DIRECTIVE: 2993 S = OMPSingleDirective::CreateEmpty( 2994 Context, Record[ASTStmtReader::NumStmtFields], Empty); 2995 break; 2996 2997 case STMT_OMP_MASTER_DIRECTIVE: 2998 S = OMPMasterDirective::CreateEmpty(Context, Empty); 2999 break; 3000 3001 case STMT_OMP_CRITICAL_DIRECTIVE: 3002 S = OMPCriticalDirective::CreateEmpty( 3003 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3004 break; 3005 3006 case STMT_OMP_PARALLEL_FOR_DIRECTIVE: { 3007 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3008 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3009 S = OMPParallelForDirective::CreateEmpty(Context, NumClauses, 3010 CollapsedNum, Empty); 3011 break; 3012 } 3013 3014 case STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE: { 3015 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3016 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3017 S = OMPParallelForSimdDirective::CreateEmpty(Context, NumClauses, 3018 CollapsedNum, Empty); 3019 break; 3020 } 3021 3022 case STMT_OMP_PARALLEL_MASTER_DIRECTIVE: 3023 S = OMPParallelMasterDirective::CreateEmpty( 3024 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3025 break; 3026 3027 case STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE: 3028 S = OMPParallelSectionsDirective::CreateEmpty( 3029 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3030 break; 3031 3032 case STMT_OMP_TASK_DIRECTIVE: 3033 S = OMPTaskDirective::CreateEmpty( 3034 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3035 break; 3036 3037 case STMT_OMP_TASKYIELD_DIRECTIVE: 3038 S = OMPTaskyieldDirective::CreateEmpty(Context, Empty); 3039 break; 3040 3041 case STMT_OMP_BARRIER_DIRECTIVE: 3042 S = OMPBarrierDirective::CreateEmpty(Context, Empty); 3043 break; 3044 3045 case STMT_OMP_TASKWAIT_DIRECTIVE: 3046 S = OMPTaskwaitDirective::CreateEmpty(Context, Empty); 3047 break; 3048 3049 case STMT_OMP_TASKGROUP_DIRECTIVE: 3050 S = OMPTaskgroupDirective::CreateEmpty( 3051 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3052 break; 3053 3054 case STMT_OMP_FLUSH_DIRECTIVE: 3055 S = OMPFlushDirective::CreateEmpty( 3056 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3057 break; 3058 3059 case STMT_OMP_ORDERED_DIRECTIVE: 3060 S = OMPOrderedDirective::CreateEmpty( 3061 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3062 break; 3063 3064 case STMT_OMP_ATOMIC_DIRECTIVE: 3065 S = OMPAtomicDirective::CreateEmpty( 3066 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3067 break; 3068 3069 case STMT_OMP_TARGET_DIRECTIVE: 3070 S = OMPTargetDirective::CreateEmpty( 3071 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3072 break; 3073 3074 case STMT_OMP_TARGET_DATA_DIRECTIVE: 3075 S = OMPTargetDataDirective::CreateEmpty( 3076 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3077 break; 3078 3079 case STMT_OMP_TARGET_ENTER_DATA_DIRECTIVE: 3080 S = OMPTargetEnterDataDirective::CreateEmpty( 3081 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3082 break; 3083 3084 case STMT_OMP_TARGET_EXIT_DATA_DIRECTIVE: 3085 S = OMPTargetExitDataDirective::CreateEmpty( 3086 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3087 break; 3088 3089 case STMT_OMP_TARGET_PARALLEL_DIRECTIVE: 3090 S = OMPTargetParallelDirective::CreateEmpty( 3091 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3092 break; 3093 3094 case STMT_OMP_TARGET_PARALLEL_FOR_DIRECTIVE: { 3095 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3096 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3097 S = OMPTargetParallelForDirective::CreateEmpty(Context, NumClauses, 3098 CollapsedNum, Empty); 3099 break; 3100 } 3101 3102 case STMT_OMP_TARGET_UPDATE_DIRECTIVE: 3103 S = OMPTargetUpdateDirective::CreateEmpty( 3104 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3105 break; 3106 3107 case STMT_OMP_TEAMS_DIRECTIVE: 3108 S = OMPTeamsDirective::CreateEmpty( 3109 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3110 break; 3111 3112 case STMT_OMP_CANCELLATION_POINT_DIRECTIVE: 3113 S = OMPCancellationPointDirective::CreateEmpty(Context, Empty); 3114 break; 3115 3116 case STMT_OMP_CANCEL_DIRECTIVE: 3117 S = OMPCancelDirective::CreateEmpty( 3118 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3119 break; 3120 3121 case STMT_OMP_TASKLOOP_DIRECTIVE: { 3122 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3123 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3124 S = OMPTaskLoopDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3125 Empty); 3126 break; 3127 } 3128 3129 case STMT_OMP_TASKLOOP_SIMD_DIRECTIVE: { 3130 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3131 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3132 S = OMPTaskLoopSimdDirective::CreateEmpty(Context, NumClauses, 3133 CollapsedNum, Empty); 3134 break; 3135 } 3136 3137 case STMT_OMP_MASTER_TASKLOOP_DIRECTIVE: { 3138 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3139 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3140 S = OMPMasterTaskLoopDirective::CreateEmpty(Context, NumClauses, 3141 CollapsedNum, Empty); 3142 break; 3143 } 3144 3145 case STMT_OMP_MASTER_TASKLOOP_SIMD_DIRECTIVE: { 3146 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3147 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3148 S = OMPMasterTaskLoopSimdDirective::CreateEmpty(Context, NumClauses, 3149 CollapsedNum, Empty); 3150 break; 3151 } 3152 3153 case STMT_OMP_PARALLEL_MASTER_TASKLOOP_DIRECTIVE: { 3154 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3155 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3156 S = OMPParallelMasterTaskLoopDirective::CreateEmpty(Context, NumClauses, 3157 CollapsedNum, Empty); 3158 break; 3159 } 3160 3161 case STMT_OMP_PARALLEL_MASTER_TASKLOOP_SIMD_DIRECTIVE: { 3162 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3163 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3164 S = OMPParallelMasterTaskLoopSimdDirective::CreateEmpty( 3165 Context, NumClauses, CollapsedNum, Empty); 3166 break; 3167 } 3168 3169 case STMT_OMP_DISTRIBUTE_DIRECTIVE: { 3170 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3171 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3172 S = OMPDistributeDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3173 Empty); 3174 break; 3175 } 3176 3177 case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: { 3178 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3179 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3180 S = OMPDistributeParallelForDirective::CreateEmpty(Context, NumClauses, 3181 CollapsedNum, Empty); 3182 break; 3183 } 3184 3185 case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: { 3186 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3187 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3188 S = OMPDistributeParallelForSimdDirective::CreateEmpty(Context, NumClauses, 3189 CollapsedNum, 3190 Empty); 3191 break; 3192 } 3193 3194 case STMT_OMP_DISTRIBUTE_SIMD_DIRECTIVE: { 3195 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3196 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3197 S = OMPDistributeSimdDirective::CreateEmpty(Context, NumClauses, 3198 CollapsedNum, Empty); 3199 break; 3200 } 3201 3202 case STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE: { 3203 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3204 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3205 S = OMPTargetParallelForSimdDirective::CreateEmpty(Context, NumClauses, 3206 CollapsedNum, Empty); 3207 break; 3208 } 3209 3210 case STMT_OMP_TARGET_SIMD_DIRECTIVE: { 3211 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3212 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3213 S = OMPTargetSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3214 Empty); 3215 break; 3216 } 3217 3218 case STMT_OMP_TEAMS_DISTRIBUTE_DIRECTIVE: { 3219 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3220 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3221 S = OMPTeamsDistributeDirective::CreateEmpty(Context, NumClauses, 3222 CollapsedNum, Empty); 3223 break; 3224 } 3225 3226 case STMT_OMP_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE: { 3227 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3228 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3229 S = OMPTeamsDistributeSimdDirective::CreateEmpty(Context, NumClauses, 3230 CollapsedNum, Empty); 3231 break; 3232 } 3233 3234 case STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: { 3235 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3236 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3237 S = OMPTeamsDistributeParallelForSimdDirective::CreateEmpty( 3238 Context, NumClauses, CollapsedNum, Empty); 3239 break; 3240 } 3241 3242 case STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: { 3243 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3244 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3245 S = OMPTeamsDistributeParallelForDirective::CreateEmpty( 3246 Context, NumClauses, CollapsedNum, Empty); 3247 break; 3248 } 3249 3250 case STMT_OMP_TARGET_TEAMS_DIRECTIVE: 3251 S = OMPTargetTeamsDirective::CreateEmpty( 3252 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3253 break; 3254 3255 case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_DIRECTIVE: { 3256 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3257 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3258 S = OMPTargetTeamsDistributeDirective::CreateEmpty(Context, NumClauses, 3259 CollapsedNum, Empty); 3260 break; 3261 } 3262 3263 case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: { 3264 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3265 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3266 S = OMPTargetTeamsDistributeParallelForDirective::CreateEmpty( 3267 Context, NumClauses, CollapsedNum, Empty); 3268 break; 3269 } 3270 3271 case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: { 3272 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3273 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3274 S = OMPTargetTeamsDistributeParallelForSimdDirective::CreateEmpty( 3275 Context, NumClauses, CollapsedNum, Empty); 3276 break; 3277 } 3278 3279 case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE: { 3280 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3281 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3282 S = OMPTargetTeamsDistributeSimdDirective::CreateEmpty( 3283 Context, NumClauses, CollapsedNum, Empty); 3284 break; 3285 } 3286 3287 case EXPR_CXX_OPERATOR_CALL: 3288 S = CXXOperatorCallExpr::CreateEmpty( 3289 Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty); 3290 break; 3291 3292 case EXPR_CXX_MEMBER_CALL: 3293 S = CXXMemberCallExpr::CreateEmpty( 3294 Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty); 3295 break; 3296 3297 case EXPR_CXX_REWRITTEN_BINARY_OPERATOR: 3298 S = new (Context) CXXRewrittenBinaryOperator(Empty); 3299 break; 3300 3301 case EXPR_CXX_CONSTRUCT: 3302 S = CXXConstructExpr::CreateEmpty( 3303 Context, 3304 /* NumArgs=*/Record[ASTStmtReader::NumExprFields]); 3305 break; 3306 3307 case EXPR_CXX_INHERITED_CTOR_INIT: 3308 S = new (Context) CXXInheritedCtorInitExpr(Empty); 3309 break; 3310 3311 case EXPR_CXX_TEMPORARY_OBJECT: 3312 S = CXXTemporaryObjectExpr::CreateEmpty( 3313 Context, 3314 /* NumArgs=*/Record[ASTStmtReader::NumExprFields]); 3315 break; 3316 3317 case EXPR_CXX_STATIC_CAST: 3318 S = CXXStaticCastExpr::CreateEmpty(Context, 3319 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3320 break; 3321 3322 case EXPR_CXX_DYNAMIC_CAST: 3323 S = CXXDynamicCastExpr::CreateEmpty(Context, 3324 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3325 break; 3326 3327 case EXPR_CXX_REINTERPRET_CAST: 3328 S = CXXReinterpretCastExpr::CreateEmpty(Context, 3329 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3330 break; 3331 3332 case EXPR_CXX_CONST_CAST: 3333 S = CXXConstCastExpr::CreateEmpty(Context); 3334 break; 3335 3336 case EXPR_CXX_FUNCTIONAL_CAST: 3337 S = CXXFunctionalCastExpr::CreateEmpty(Context, 3338 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3339 break; 3340 3341 case EXPR_USER_DEFINED_LITERAL: 3342 S = UserDefinedLiteral::CreateEmpty( 3343 Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty); 3344 break; 3345 3346 case EXPR_CXX_STD_INITIALIZER_LIST: 3347 S = new (Context) CXXStdInitializerListExpr(Empty); 3348 break; 3349 3350 case EXPR_CXX_BOOL_LITERAL: 3351 S = new (Context) CXXBoolLiteralExpr(Empty); 3352 break; 3353 3354 case EXPR_CXX_NULL_PTR_LITERAL: 3355 S = new (Context) CXXNullPtrLiteralExpr(Empty); 3356 break; 3357 3358 case EXPR_CXX_TYPEID_EXPR: 3359 S = new (Context) CXXTypeidExpr(Empty, true); 3360 break; 3361 3362 case EXPR_CXX_TYPEID_TYPE: 3363 S = new (Context) CXXTypeidExpr(Empty, false); 3364 break; 3365 3366 case EXPR_CXX_UUIDOF_EXPR: 3367 S = new (Context) CXXUuidofExpr(Empty, true); 3368 break; 3369 3370 case EXPR_CXX_PROPERTY_REF_EXPR: 3371 S = new (Context) MSPropertyRefExpr(Empty); 3372 break; 3373 3374 case EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR: 3375 S = new (Context) MSPropertySubscriptExpr(Empty); 3376 break; 3377 3378 case EXPR_CXX_UUIDOF_TYPE: 3379 S = new (Context) CXXUuidofExpr(Empty, false); 3380 break; 3381 3382 case EXPR_CXX_THIS: 3383 S = new (Context) CXXThisExpr(Empty); 3384 break; 3385 3386 case EXPR_CXX_THROW: 3387 S = new (Context) CXXThrowExpr(Empty); 3388 break; 3389 3390 case EXPR_CXX_DEFAULT_ARG: 3391 S = new (Context) CXXDefaultArgExpr(Empty); 3392 break; 3393 3394 case EXPR_CXX_DEFAULT_INIT: 3395 S = new (Context) CXXDefaultInitExpr(Empty); 3396 break; 3397 3398 case EXPR_CXX_BIND_TEMPORARY: 3399 S = new (Context) CXXBindTemporaryExpr(Empty); 3400 break; 3401 3402 case EXPR_CXX_SCALAR_VALUE_INIT: 3403 S = new (Context) CXXScalarValueInitExpr(Empty); 3404 break; 3405 3406 case EXPR_CXX_NEW: 3407 S = CXXNewExpr::CreateEmpty( 3408 Context, 3409 /*IsArray=*/Record[ASTStmtReader::NumExprFields], 3410 /*HasInit=*/Record[ASTStmtReader::NumExprFields + 1], 3411 /*NumPlacementArgs=*/Record[ASTStmtReader::NumExprFields + 2], 3412 /*IsParenTypeId=*/Record[ASTStmtReader::NumExprFields + 3]); 3413 break; 3414 3415 case EXPR_CXX_DELETE: 3416 S = new (Context) CXXDeleteExpr(Empty); 3417 break; 3418 3419 case EXPR_CXX_PSEUDO_DESTRUCTOR: 3420 S = new (Context) CXXPseudoDestructorExpr(Empty); 3421 break; 3422 3423 case EXPR_EXPR_WITH_CLEANUPS: 3424 S = ExprWithCleanups::Create(Context, Empty, 3425 Record[ASTStmtReader::NumExprFields]); 3426 break; 3427 3428 case EXPR_CXX_DEPENDENT_SCOPE_MEMBER: 3429 S = CXXDependentScopeMemberExpr::CreateEmpty( 3430 Context, 3431 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 3432 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 1], 3433 /*HasFirstQualifierFoundInScope=*/ 3434 Record[ASTStmtReader::NumExprFields + 2]); 3435 break; 3436 3437 case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF: 3438 S = DependentScopeDeclRefExpr::CreateEmpty(Context, 3439 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 3440 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 3441 ? Record[ASTStmtReader::NumExprFields + 1] 3442 : 0); 3443 break; 3444 3445 case EXPR_CXX_UNRESOLVED_CONSTRUCT: 3446 S = CXXUnresolvedConstructExpr::CreateEmpty(Context, 3447 /*NumArgs=*/Record[ASTStmtReader::NumExprFields]); 3448 break; 3449 3450 case EXPR_CXX_UNRESOLVED_MEMBER: 3451 S = UnresolvedMemberExpr::CreateEmpty( 3452 Context, 3453 /*NumResults=*/Record[ASTStmtReader::NumExprFields], 3454 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 1], 3455 /*NumTemplateArgs=*/ 3456 Record[ASTStmtReader::NumExprFields + 1] 3457 ? Record[ASTStmtReader::NumExprFields + 2] 3458 : 0); 3459 break; 3460 3461 case EXPR_CXX_UNRESOLVED_LOOKUP: 3462 S = UnresolvedLookupExpr::CreateEmpty( 3463 Context, 3464 /*NumResults=*/Record[ASTStmtReader::NumExprFields], 3465 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 1], 3466 /*NumTemplateArgs=*/ 3467 Record[ASTStmtReader::NumExprFields + 1] 3468 ? Record[ASTStmtReader::NumExprFields + 2] 3469 : 0); 3470 break; 3471 3472 case EXPR_TYPE_TRAIT: 3473 S = TypeTraitExpr::CreateDeserialized(Context, 3474 Record[ASTStmtReader::NumExprFields]); 3475 break; 3476 3477 case EXPR_ARRAY_TYPE_TRAIT: 3478 S = new (Context) ArrayTypeTraitExpr(Empty); 3479 break; 3480 3481 case EXPR_CXX_EXPRESSION_TRAIT: 3482 S = new (Context) ExpressionTraitExpr(Empty); 3483 break; 3484 3485 case EXPR_CXX_NOEXCEPT: 3486 S = new (Context) CXXNoexceptExpr(Empty); 3487 break; 3488 3489 case EXPR_PACK_EXPANSION: 3490 S = new (Context) PackExpansionExpr(Empty); 3491 break; 3492 3493 case EXPR_SIZEOF_PACK: 3494 S = SizeOfPackExpr::CreateDeserialized( 3495 Context, 3496 /*NumPartialArgs=*/Record[ASTStmtReader::NumExprFields]); 3497 break; 3498 3499 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM: 3500 S = new (Context) SubstNonTypeTemplateParmExpr(Empty); 3501 break; 3502 3503 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK: 3504 S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty); 3505 break; 3506 3507 case EXPR_FUNCTION_PARM_PACK: 3508 S = FunctionParmPackExpr::CreateEmpty(Context, 3509 Record[ASTStmtReader::NumExprFields]); 3510 break; 3511 3512 case EXPR_MATERIALIZE_TEMPORARY: 3513 S = new (Context) MaterializeTemporaryExpr(Empty); 3514 break; 3515 3516 case EXPR_CXX_FOLD: 3517 S = new (Context) CXXFoldExpr(Empty); 3518 break; 3519 3520 case EXPR_OPAQUE_VALUE: 3521 S = new (Context) OpaqueValueExpr(Empty); 3522 break; 3523 3524 case EXPR_CUDA_KERNEL_CALL: 3525 S = CUDAKernelCallExpr::CreateEmpty( 3526 Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty); 3527 break; 3528 3529 case EXPR_ASTYPE: 3530 S = new (Context) AsTypeExpr(Empty); 3531 break; 3532 3533 case EXPR_PSEUDO_OBJECT: { 3534 unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields]; 3535 S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs); 3536 break; 3537 } 3538 3539 case EXPR_ATOMIC: 3540 S = new (Context) AtomicExpr(Empty); 3541 break; 3542 3543 case EXPR_LAMBDA: { 3544 unsigned NumCaptures = Record[ASTStmtReader::NumExprFields]; 3545 S = LambdaExpr::CreateDeserialized(Context, NumCaptures); 3546 break; 3547 } 3548 3549 case STMT_COROUTINE_BODY: { 3550 unsigned NumParams = Record[ASTStmtReader::NumStmtFields]; 3551 S = CoroutineBodyStmt::Create(Context, Empty, NumParams); 3552 break; 3553 } 3554 3555 case STMT_CORETURN: 3556 S = new (Context) CoreturnStmt(Empty); 3557 break; 3558 3559 case EXPR_COAWAIT: 3560 S = new (Context) CoawaitExpr(Empty); 3561 break; 3562 3563 case EXPR_COYIELD: 3564 S = new (Context) CoyieldExpr(Empty); 3565 break; 3566 3567 case EXPR_DEPENDENT_COAWAIT: 3568 S = new (Context) DependentCoawaitExpr(Empty); 3569 break; 3570 3571 case EXPR_CONCEPT_SPECIALIZATION: 3572 unsigned numTemplateArgs = Record[ASTStmtReader::NumExprFields]; 3573 S = ConceptSpecializationExpr::Create(Context, Empty, numTemplateArgs); 3574 break; 3575 3576 } 3577 3578 // We hit a STMT_STOP, so we're done with this expression. 3579 if (Finished) 3580 break; 3581 3582 ++NumStatementsRead; 3583 3584 if (S && !IsStmtReference) { 3585 Reader.Visit(S); 3586 StmtEntries[Cursor.GetCurrentBitNo()] = S; 3587 } 3588 3589 assert(Record.getIdx() == Record.size() && 3590 "Invalid deserialization of statement"); 3591 StmtStack.push_back(S); 3592 } 3593 Done: 3594 assert(StmtStack.size() > PrevNumStmts && "Read too many sub-stmts!"); 3595 assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!"); 3596 return StmtStack.pop_back_val(); 3597 } 3598