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