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