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 "llvm/ADT/SmallString.h" 21 using namespace clang; 22 using namespace clang::serialization; 23 24 namespace clang { 25 26 class ASTStmtReader : public StmtVisitor<ASTStmtReader> { 27 typedef ASTReader::RecordData RecordData; 28 29 ASTReader &Reader; 30 ModuleFile &F; 31 llvm::BitstreamCursor &DeclsCursor; 32 const ASTReader::RecordData &Record; 33 unsigned &Idx; 34 35 SourceLocation ReadSourceLocation(const RecordData &R, unsigned &I) { 36 return Reader.ReadSourceLocation(F, R, I); 37 } 38 39 SourceRange ReadSourceRange(const RecordData &R, unsigned &I) { 40 return Reader.ReadSourceRange(F, R, I); 41 } 42 43 TypeSourceInfo *GetTypeSourceInfo(const RecordData &R, unsigned &I) { 44 return Reader.GetTypeSourceInfo(F, R, I); 45 } 46 47 serialization::DeclID ReadDeclID(const RecordData &R, unsigned &I) { 48 return Reader.ReadDeclID(F, R, I); 49 } 50 51 Decl *ReadDecl(const RecordData &R, unsigned &I) { 52 return Reader.ReadDecl(F, R, I); 53 } 54 55 template<typename T> 56 T *ReadDeclAs(const RecordData &R, unsigned &I) { 57 return Reader.ReadDeclAs<T>(F, R, I); 58 } 59 60 void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name, 61 const ASTReader::RecordData &R, unsigned &I) { 62 Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I); 63 } 64 65 void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo, 66 const ASTReader::RecordData &R, unsigned &I) { 67 Reader.ReadDeclarationNameInfo(F, NameInfo, R, I); 68 } 69 70 public: 71 ASTStmtReader(ASTReader &Reader, ModuleFile &F, 72 llvm::BitstreamCursor &Cursor, 73 const ASTReader::RecordData &Record, unsigned &Idx) 74 : Reader(Reader), F(F), DeclsCursor(Cursor), Record(Record), Idx(Idx) { } 75 76 /// \brief The number of record fields required for the Stmt class 77 /// itself. 78 static const unsigned NumStmtFields = 0; 79 80 /// \brief The number of record fields required for the Expr class 81 /// itself. 82 static const unsigned NumExprFields = NumStmtFields + 7; 83 84 /// \brief Read and initialize a ExplicitTemplateArgumentList structure. 85 void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, 86 unsigned NumTemplateArgs); 87 /// \brief Read and initialize a ExplicitTemplateArgumentList structure. 88 void ReadExplicitTemplateArgumentList(ASTTemplateArgumentListInfo &ArgList, 89 unsigned NumTemplateArgs); 90 91 void VisitStmt(Stmt *S); 92 #define STMT(Type, Base) \ 93 void Visit##Type(Type *); 94 #include "clang/AST/StmtNodes.inc" 95 }; 96 } 97 98 void ASTStmtReader:: 99 ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, 100 unsigned NumTemplateArgs) { 101 SourceLocation TemplateKWLoc = ReadSourceLocation(Record, Idx); 102 TemplateArgumentListInfo ArgInfo; 103 ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx)); 104 ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx)); 105 for (unsigned i = 0; i != NumTemplateArgs; ++i) 106 ArgInfo.addArgument( 107 Reader.ReadTemplateArgumentLoc(F, Record, Idx)); 108 Args.initializeFrom(TemplateKWLoc, ArgInfo); 109 } 110 111 void ASTStmtReader::VisitStmt(Stmt *S) { 112 assert(Idx == NumStmtFields && "Incorrect statement field count"); 113 } 114 115 void ASTStmtReader::VisitNullStmt(NullStmt *S) { 116 VisitStmt(S); 117 S->setSemiLoc(ReadSourceLocation(Record, Idx)); 118 S->HasLeadingEmptyMacro = Record[Idx++]; 119 } 120 121 void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) { 122 VisitStmt(S); 123 SmallVector<Stmt *, 16> Stmts; 124 unsigned NumStmts = Record[Idx++]; 125 while (NumStmts--) 126 Stmts.push_back(Reader.ReadSubStmt()); 127 S->setStmts(Reader.getContext(), Stmts.data(), Stmts.size()); 128 S->setLBracLoc(ReadSourceLocation(Record, Idx)); 129 S->setRBracLoc(ReadSourceLocation(Record, Idx)); 130 } 131 132 void ASTStmtReader::VisitSwitchCase(SwitchCase *S) { 133 VisitStmt(S); 134 Reader.RecordSwitchCaseID(S, Record[Idx++]); 135 S->setKeywordLoc(ReadSourceLocation(Record, Idx)); 136 S->setColonLoc(ReadSourceLocation(Record, Idx)); 137 } 138 139 void ASTStmtReader::VisitCaseStmt(CaseStmt *S) { 140 VisitSwitchCase(S); 141 S->setLHS(Reader.ReadSubExpr()); 142 S->setRHS(Reader.ReadSubExpr()); 143 S->setSubStmt(Reader.ReadSubStmt()); 144 S->setEllipsisLoc(ReadSourceLocation(Record, Idx)); 145 } 146 147 void ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) { 148 VisitSwitchCase(S); 149 S->setSubStmt(Reader.ReadSubStmt()); 150 } 151 152 void ASTStmtReader::VisitLabelStmt(LabelStmt *S) { 153 VisitStmt(S); 154 LabelDecl *LD = ReadDeclAs<LabelDecl>(Record, Idx); 155 LD->setStmt(S); 156 S->setDecl(LD); 157 S->setSubStmt(Reader.ReadSubStmt()); 158 S->setIdentLoc(ReadSourceLocation(Record, Idx)); 159 } 160 161 void ASTStmtReader::VisitAttributedStmt(AttributedStmt *S) { 162 VisitStmt(S); 163 uint64_t NumAttrs = Record[Idx++]; 164 AttrVec Attrs; 165 Reader.ReadAttributes(F, Attrs, Record, Idx); 166 (void)NumAttrs; 167 assert(NumAttrs == S->NumAttrs); 168 assert(NumAttrs == Attrs.size()); 169 std::copy(Attrs.begin(), Attrs.end(), S->Attrs); 170 S->SubStmt = Reader.ReadSubStmt(); 171 S->AttrLoc = ReadSourceLocation(Record, Idx); 172 } 173 174 void ASTStmtReader::VisitIfStmt(IfStmt *S) { 175 VisitStmt(S); 176 S->setConditionVariable(Reader.getContext(), 177 ReadDeclAs<VarDecl>(Record, Idx)); 178 S->setCond(Reader.ReadSubExpr()); 179 S->setThen(Reader.ReadSubStmt()); 180 S->setElse(Reader.ReadSubStmt()); 181 S->setIfLoc(ReadSourceLocation(Record, Idx)); 182 S->setElseLoc(ReadSourceLocation(Record, Idx)); 183 } 184 185 void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) { 186 VisitStmt(S); 187 S->setConditionVariable(Reader.getContext(), 188 ReadDeclAs<VarDecl>(Record, Idx)); 189 S->setCond(Reader.ReadSubExpr()); 190 S->setBody(Reader.ReadSubStmt()); 191 S->setSwitchLoc(ReadSourceLocation(Record, Idx)); 192 if (Record[Idx++]) 193 S->setAllEnumCasesCovered(); 194 195 SwitchCase *PrevSC = 0; 196 for (unsigned N = Record.size(); Idx != N; ++Idx) { 197 SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]); 198 if (PrevSC) 199 PrevSC->setNextSwitchCase(SC); 200 else 201 S->setSwitchCaseList(SC); 202 203 PrevSC = SC; 204 } 205 } 206 207 void ASTStmtReader::VisitWhileStmt(WhileStmt *S) { 208 VisitStmt(S); 209 S->setConditionVariable(Reader.getContext(), 210 ReadDeclAs<VarDecl>(Record, Idx)); 211 212 S->setCond(Reader.ReadSubExpr()); 213 S->setBody(Reader.ReadSubStmt()); 214 S->setWhileLoc(ReadSourceLocation(Record, Idx)); 215 } 216 217 void ASTStmtReader::VisitDoStmt(DoStmt *S) { 218 VisitStmt(S); 219 S->setCond(Reader.ReadSubExpr()); 220 S->setBody(Reader.ReadSubStmt()); 221 S->setDoLoc(ReadSourceLocation(Record, Idx)); 222 S->setWhileLoc(ReadSourceLocation(Record, Idx)); 223 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 224 } 225 226 void ASTStmtReader::VisitForStmt(ForStmt *S) { 227 VisitStmt(S); 228 S->setInit(Reader.ReadSubStmt()); 229 S->setCond(Reader.ReadSubExpr()); 230 S->setConditionVariable(Reader.getContext(), 231 ReadDeclAs<VarDecl>(Record, Idx)); 232 S->setInc(Reader.ReadSubExpr()); 233 S->setBody(Reader.ReadSubStmt()); 234 S->setForLoc(ReadSourceLocation(Record, Idx)); 235 S->setLParenLoc(ReadSourceLocation(Record, Idx)); 236 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 237 } 238 239 void ASTStmtReader::VisitGotoStmt(GotoStmt *S) { 240 VisitStmt(S); 241 S->setLabel(ReadDeclAs<LabelDecl>(Record, Idx)); 242 S->setGotoLoc(ReadSourceLocation(Record, Idx)); 243 S->setLabelLoc(ReadSourceLocation(Record, Idx)); 244 } 245 246 void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) { 247 VisitStmt(S); 248 S->setGotoLoc(ReadSourceLocation(Record, Idx)); 249 S->setStarLoc(ReadSourceLocation(Record, Idx)); 250 S->setTarget(Reader.ReadSubExpr()); 251 } 252 253 void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) { 254 VisitStmt(S); 255 S->setContinueLoc(ReadSourceLocation(Record, Idx)); 256 } 257 258 void ASTStmtReader::VisitBreakStmt(BreakStmt *S) { 259 VisitStmt(S); 260 S->setBreakLoc(ReadSourceLocation(Record, Idx)); 261 } 262 263 void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) { 264 VisitStmt(S); 265 S->setRetValue(Reader.ReadSubExpr()); 266 S->setReturnLoc(ReadSourceLocation(Record, Idx)); 267 S->setNRVOCandidate(ReadDeclAs<VarDecl>(Record, Idx)); 268 } 269 270 void ASTStmtReader::VisitDeclStmt(DeclStmt *S) { 271 VisitStmt(S); 272 S->setStartLoc(ReadSourceLocation(Record, Idx)); 273 S->setEndLoc(ReadSourceLocation(Record, Idx)); 274 275 if (Idx + 1 == Record.size()) { 276 // Single declaration 277 S->setDeclGroup(DeclGroupRef(ReadDecl(Record, Idx))); 278 } else { 279 SmallVector<Decl *, 16> Decls; 280 Decls.reserve(Record.size() - Idx); 281 for (unsigned N = Record.size(); Idx != N; ) 282 Decls.push_back(ReadDecl(Record, Idx)); 283 S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Reader.getContext(), 284 Decls.data(), 285 Decls.size()))); 286 } 287 } 288 289 void ASTStmtReader::VisitGCCAsmStmt(GCCAsmStmt *S) { 290 VisitStmt(S); 291 unsigned NumOutputs = Record[Idx++]; 292 unsigned NumInputs = Record[Idx++]; 293 unsigned NumClobbers = Record[Idx++]; 294 S->setAsmLoc(ReadSourceLocation(Record, Idx)); 295 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 296 S->setVolatile(Record[Idx++]); 297 S->setSimple(Record[Idx++]); 298 299 S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 300 301 // Outputs and inputs 302 SmallVector<IdentifierInfo *, 16> Names; 303 SmallVector<StringLiteral*, 16> Constraints; 304 SmallVector<Stmt*, 16> Exprs; 305 for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) { 306 Names.push_back(Reader.GetIdentifierInfo(F, Record, Idx)); 307 Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 308 Exprs.push_back(Reader.ReadSubStmt()); 309 } 310 311 // Constraints 312 SmallVector<StringLiteral*, 16> Clobbers; 313 for (unsigned I = 0; I != NumClobbers; ++I) 314 Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 315 316 S->setOutputsAndInputsAndClobbers(Reader.getContext(), 317 Names.data(), Constraints.data(), 318 Exprs.data(), NumOutputs, NumInputs, 319 Clobbers.data(), NumClobbers); 320 } 321 322 void ASTStmtReader::VisitMSAsmStmt(MSAsmStmt *S) { 323 // FIXME: Statement reader not yet implemented for MS style inline asm. 324 VisitStmt(S); 325 } 326 327 void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) { 328 llvm_unreachable("not implemented yet"); 329 } 330 331 void ASTStmtReader::VisitExpr(Expr *E) { 332 VisitStmt(E); 333 E->setType(Reader.readType(F, Record, Idx)); 334 E->setTypeDependent(Record[Idx++]); 335 E->setValueDependent(Record[Idx++]); 336 E->setInstantiationDependent(Record[Idx++]); 337 E->ExprBits.ContainsUnexpandedParameterPack = Record[Idx++]; 338 E->setValueKind(static_cast<ExprValueKind>(Record[Idx++])); 339 E->setObjectKind(static_cast<ExprObjectKind>(Record[Idx++])); 340 assert(Idx == NumExprFields && "Incorrect expression field count"); 341 } 342 343 void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) { 344 VisitExpr(E); 345 E->setLocation(ReadSourceLocation(Record, Idx)); 346 E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]); 347 } 348 349 void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) { 350 VisitExpr(E); 351 352 E->DeclRefExprBits.HasQualifier = Record[Idx++]; 353 E->DeclRefExprBits.HasFoundDecl = Record[Idx++]; 354 E->DeclRefExprBits.HasTemplateKWAndArgsInfo = Record[Idx++]; 355 E->DeclRefExprBits.HadMultipleCandidates = Record[Idx++]; 356 E->DeclRefExprBits.RefersToEnclosingLocal = Record[Idx++]; 357 unsigned NumTemplateArgs = 0; 358 if (E->hasTemplateKWAndArgsInfo()) 359 NumTemplateArgs = Record[Idx++]; 360 361 if (E->hasQualifier()) 362 E->getInternalQualifierLoc() 363 = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 364 365 if (E->hasFoundDecl()) 366 E->getInternalFoundDecl() = ReadDeclAs<NamedDecl>(Record, Idx); 367 368 if (E->hasTemplateKWAndArgsInfo()) 369 ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), 370 NumTemplateArgs); 371 372 E->setDecl(ReadDeclAs<ValueDecl>(Record, Idx)); 373 E->setLocation(ReadSourceLocation(Record, Idx)); 374 ReadDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record, Idx); 375 } 376 377 void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) { 378 VisitExpr(E); 379 E->setLocation(ReadSourceLocation(Record, Idx)); 380 E->setValue(Reader.getContext(), Reader.ReadAPInt(Record, Idx)); 381 } 382 383 void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) { 384 VisitExpr(E); 385 E->setRawSemantics(static_cast<Stmt::APFloatSemantics>(Record[Idx++])); 386 E->setExact(Record[Idx++]); 387 E->setValue(Reader.getContext(), 388 Reader.ReadAPFloat(Record, E->getSemantics(), Idx)); 389 E->setLocation(ReadSourceLocation(Record, Idx)); 390 } 391 392 void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) { 393 VisitExpr(E); 394 E->setSubExpr(Reader.ReadSubExpr()); 395 } 396 397 void ASTStmtReader::VisitStringLiteral(StringLiteral *E) { 398 VisitExpr(E); 399 unsigned Len = Record[Idx++]; 400 assert(Record[Idx] == E->getNumConcatenated() && 401 "Wrong number of concatenated tokens!"); 402 ++Idx; 403 StringLiteral::StringKind kind = 404 static_cast<StringLiteral::StringKind>(Record[Idx++]); 405 bool isPascal = Record[Idx++]; 406 407 // Read string data 408 SmallString<16> Str(&Record[Idx], &Record[Idx] + Len); 409 E->setString(Reader.getContext(), Str.str(), kind, isPascal); 410 Idx += Len; 411 412 // Read source locations 413 for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I) 414 E->setStrTokenLoc(I, ReadSourceLocation(Record, Idx)); 415 } 416 417 void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) { 418 VisitExpr(E); 419 E->setValue(Record[Idx++]); 420 E->setLocation(ReadSourceLocation(Record, Idx)); 421 E->setKind(static_cast<CharacterLiteral::CharacterKind>(Record[Idx++])); 422 } 423 424 void ASTStmtReader::VisitParenExpr(ParenExpr *E) { 425 VisitExpr(E); 426 E->setLParen(ReadSourceLocation(Record, Idx)); 427 E->setRParen(ReadSourceLocation(Record, Idx)); 428 E->setSubExpr(Reader.ReadSubExpr()); 429 } 430 431 void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) { 432 VisitExpr(E); 433 unsigned NumExprs = Record[Idx++]; 434 E->Exprs = new (Reader.getContext()) Stmt*[NumExprs]; 435 for (unsigned i = 0; i != NumExprs; ++i) 436 E->Exprs[i] = Reader.ReadSubStmt(); 437 E->NumExprs = NumExprs; 438 E->LParenLoc = ReadSourceLocation(Record, Idx); 439 E->RParenLoc = ReadSourceLocation(Record, Idx); 440 } 441 442 void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) { 443 VisitExpr(E); 444 E->setSubExpr(Reader.ReadSubExpr()); 445 E->setOpcode((UnaryOperator::Opcode)Record[Idx++]); 446 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 447 } 448 449 void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) { 450 typedef OffsetOfExpr::OffsetOfNode Node; 451 VisitExpr(E); 452 assert(E->getNumComponents() == Record[Idx]); 453 ++Idx; 454 assert(E->getNumExpressions() == Record[Idx]); 455 ++Idx; 456 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 457 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 458 E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 459 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 460 Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]); 461 SourceLocation Start = ReadSourceLocation(Record, Idx); 462 SourceLocation End = ReadSourceLocation(Record, Idx); 463 switch (Kind) { 464 case Node::Array: 465 E->setComponent(I, Node(Start, Record[Idx++], End)); 466 break; 467 468 case Node::Field: 469 E->setComponent(I, Node(Start, ReadDeclAs<FieldDecl>(Record, Idx), End)); 470 break; 471 472 case Node::Identifier: 473 E->setComponent(I, 474 Node(Start, 475 Reader.GetIdentifierInfo(F, Record, Idx), 476 End)); 477 break; 478 479 case Node::Base: { 480 CXXBaseSpecifier *Base = new (Reader.getContext()) CXXBaseSpecifier(); 481 *Base = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 482 E->setComponent(I, Node(Base)); 483 break; 484 } 485 } 486 } 487 488 for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I) 489 E->setIndexExpr(I, Reader.ReadSubExpr()); 490 } 491 492 void ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) { 493 VisitExpr(E); 494 E->setKind(static_cast<UnaryExprOrTypeTrait>(Record[Idx++])); 495 if (Record[Idx] == 0) { 496 E->setArgument(Reader.ReadSubExpr()); 497 ++Idx; 498 } else { 499 E->setArgument(GetTypeSourceInfo(Record, Idx)); 500 } 501 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 502 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 503 } 504 505 void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 506 VisitExpr(E); 507 E->setLHS(Reader.ReadSubExpr()); 508 E->setRHS(Reader.ReadSubExpr()); 509 E->setRBracketLoc(ReadSourceLocation(Record, Idx)); 510 } 511 512 void ASTStmtReader::VisitCallExpr(CallExpr *E) { 513 VisitExpr(E); 514 E->setNumArgs(Reader.getContext(), Record[Idx++]); 515 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 516 E->setCallee(Reader.ReadSubExpr()); 517 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 518 E->setArg(I, Reader.ReadSubExpr()); 519 } 520 521 void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { 522 VisitCallExpr(E); 523 } 524 525 void ASTStmtReader::VisitMemberExpr(MemberExpr *E) { 526 // Don't call VisitExpr, this is fully initialized at creation. 527 assert(E->getStmtClass() == Stmt::MemberExprClass && 528 "It's a subclass, we must advance Idx!"); 529 } 530 531 void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) { 532 VisitExpr(E); 533 E->setBase(Reader.ReadSubExpr()); 534 E->setIsaMemberLoc(ReadSourceLocation(Record, Idx)); 535 E->setOpLoc(ReadSourceLocation(Record, Idx)); 536 E->setArrow(Record[Idx++]); 537 } 538 539 void ASTStmtReader:: 540 VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 541 VisitExpr(E); 542 E->Operand = Reader.ReadSubExpr(); 543 E->setShouldCopy(Record[Idx++]); 544 } 545 546 void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 547 VisitExplicitCastExpr(E); 548 E->LParenLoc = ReadSourceLocation(Record, Idx); 549 E->BridgeKeywordLoc = ReadSourceLocation(Record, Idx); 550 E->Kind = Record[Idx++]; 551 } 552 553 void ASTStmtReader::VisitCastExpr(CastExpr *E) { 554 VisitExpr(E); 555 unsigned NumBaseSpecs = Record[Idx++]; 556 assert(NumBaseSpecs == E->path_size()); 557 E->setSubExpr(Reader.ReadSubExpr()); 558 E->setCastKind((CastExpr::CastKind)Record[Idx++]); 559 CastExpr::path_iterator BaseI = E->path_begin(); 560 while (NumBaseSpecs--) { 561 CXXBaseSpecifier *BaseSpec = new (Reader.getContext()) CXXBaseSpecifier; 562 *BaseSpec = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 563 *BaseI++ = BaseSpec; 564 } 565 } 566 567 void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) { 568 VisitExpr(E); 569 E->setLHS(Reader.ReadSubExpr()); 570 E->setRHS(Reader.ReadSubExpr()); 571 E->setOpcode((BinaryOperator::Opcode)Record[Idx++]); 572 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 573 E->setFPContractable((bool)Record[Idx++]); 574 } 575 576 void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 577 VisitBinaryOperator(E); 578 E->setComputationLHSType(Reader.readType(F, Record, Idx)); 579 E->setComputationResultType(Reader.readType(F, Record, Idx)); 580 } 581 582 void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) { 583 VisitExpr(E); 584 E->SubExprs[ConditionalOperator::COND] = Reader.ReadSubExpr(); 585 E->SubExprs[ConditionalOperator::LHS] = Reader.ReadSubExpr(); 586 E->SubExprs[ConditionalOperator::RHS] = Reader.ReadSubExpr(); 587 E->QuestionLoc = ReadSourceLocation(Record, Idx); 588 E->ColonLoc = ReadSourceLocation(Record, Idx); 589 } 590 591 void 592 ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) { 593 VisitExpr(E); 594 E->OpaqueValue = cast<OpaqueValueExpr>(Reader.ReadSubExpr()); 595 E->SubExprs[BinaryConditionalOperator::COMMON] = Reader.ReadSubExpr(); 596 E->SubExprs[BinaryConditionalOperator::COND] = Reader.ReadSubExpr(); 597 E->SubExprs[BinaryConditionalOperator::LHS] = Reader.ReadSubExpr(); 598 E->SubExprs[BinaryConditionalOperator::RHS] = Reader.ReadSubExpr(); 599 E->QuestionLoc = ReadSourceLocation(Record, Idx); 600 E->ColonLoc = ReadSourceLocation(Record, Idx); 601 } 602 603 void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) { 604 VisitCastExpr(E); 605 } 606 607 void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) { 608 VisitCastExpr(E); 609 E->setTypeInfoAsWritten(GetTypeSourceInfo(Record, Idx)); 610 } 611 612 void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) { 613 VisitExplicitCastExpr(E); 614 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 615 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 616 } 617 618 void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 619 VisitExpr(E); 620 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 621 E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 622 E->setInitializer(Reader.ReadSubExpr()); 623 E->setFileScope(Record[Idx++]); 624 } 625 626 void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) { 627 VisitExpr(E); 628 E->setBase(Reader.ReadSubExpr()); 629 E->setAccessor(Reader.GetIdentifierInfo(F, Record, Idx)); 630 E->setAccessorLoc(ReadSourceLocation(Record, Idx)); 631 } 632 633 void ASTStmtReader::VisitInitListExpr(InitListExpr *E) { 634 VisitExpr(E); 635 if (InitListExpr *SyntForm = cast_or_null<InitListExpr>(Reader.ReadSubStmt())) 636 E->setSyntacticForm(SyntForm); 637 E->setLBraceLoc(ReadSourceLocation(Record, Idx)); 638 E->setRBraceLoc(ReadSourceLocation(Record, Idx)); 639 bool isArrayFiller = Record[Idx++]; 640 Expr *filler = 0; 641 if (isArrayFiller) { 642 filler = Reader.ReadSubExpr(); 643 E->ArrayFillerOrUnionFieldInit = filler; 644 } else 645 E->ArrayFillerOrUnionFieldInit = ReadDeclAs<FieldDecl>(Record, Idx); 646 E->sawArrayRangeDesignator(Record[Idx++]); 647 E->setInitializesStdInitializerList(Record[Idx++]); 648 unsigned NumInits = Record[Idx++]; 649 E->reserveInits(Reader.getContext(), NumInits); 650 if (isArrayFiller) { 651 for (unsigned I = 0; I != NumInits; ++I) { 652 Expr *init = Reader.ReadSubExpr(); 653 E->updateInit(Reader.getContext(), I, init ? init : filler); 654 } 655 } else { 656 for (unsigned I = 0; I != NumInits; ++I) 657 E->updateInit(Reader.getContext(), I, Reader.ReadSubExpr()); 658 } 659 } 660 661 void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) { 662 typedef DesignatedInitExpr::Designator Designator; 663 664 VisitExpr(E); 665 unsigned NumSubExprs = Record[Idx++]; 666 assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs"); 667 for (unsigned I = 0; I != NumSubExprs; ++I) 668 E->setSubExpr(I, Reader.ReadSubExpr()); 669 E->setEqualOrColonLoc(ReadSourceLocation(Record, Idx)); 670 E->setGNUSyntax(Record[Idx++]); 671 672 SmallVector<Designator, 4> Designators; 673 while (Idx < Record.size()) { 674 switch ((DesignatorTypes)Record[Idx++]) { 675 case DESIG_FIELD_DECL: { 676 FieldDecl *Field = ReadDeclAs<FieldDecl>(Record, Idx); 677 SourceLocation DotLoc 678 = ReadSourceLocation(Record, Idx); 679 SourceLocation FieldLoc 680 = ReadSourceLocation(Record, Idx); 681 Designators.push_back(Designator(Field->getIdentifier(), DotLoc, 682 FieldLoc)); 683 Designators.back().setField(Field); 684 break; 685 } 686 687 case DESIG_FIELD_NAME: { 688 const IdentifierInfo *Name = Reader.GetIdentifierInfo(F, Record, Idx); 689 SourceLocation DotLoc 690 = ReadSourceLocation(Record, Idx); 691 SourceLocation FieldLoc 692 = ReadSourceLocation(Record, Idx); 693 Designators.push_back(Designator(Name, DotLoc, FieldLoc)); 694 break; 695 } 696 697 case DESIG_ARRAY: { 698 unsigned Index = Record[Idx++]; 699 SourceLocation LBracketLoc 700 = ReadSourceLocation(Record, Idx); 701 SourceLocation RBracketLoc 702 = ReadSourceLocation(Record, Idx); 703 Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc)); 704 break; 705 } 706 707 case DESIG_ARRAY_RANGE: { 708 unsigned Index = Record[Idx++]; 709 SourceLocation LBracketLoc 710 = ReadSourceLocation(Record, Idx); 711 SourceLocation EllipsisLoc 712 = ReadSourceLocation(Record, Idx); 713 SourceLocation RBracketLoc 714 = ReadSourceLocation(Record, Idx); 715 Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc, 716 RBracketLoc)); 717 break; 718 } 719 } 720 } 721 E->setDesignators(Reader.getContext(), 722 Designators.data(), Designators.size()); 723 } 724 725 void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { 726 VisitExpr(E); 727 } 728 729 void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) { 730 VisitExpr(E); 731 E->setSubExpr(Reader.ReadSubExpr()); 732 E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx)); 733 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 734 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 735 } 736 737 void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) { 738 VisitExpr(E); 739 E->setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 740 E->setLabelLoc(ReadSourceLocation(Record, Idx)); 741 E->setLabel(ReadDeclAs<LabelDecl>(Record, Idx)); 742 } 743 744 void ASTStmtReader::VisitStmtExpr(StmtExpr *E) { 745 VisitExpr(E); 746 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 747 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 748 E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt())); 749 } 750 751 void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) { 752 VisitExpr(E); 753 E->setCond(Reader.ReadSubExpr()); 754 E->setLHS(Reader.ReadSubExpr()); 755 E->setRHS(Reader.ReadSubExpr()); 756 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 757 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 758 } 759 760 void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) { 761 VisitExpr(E); 762 E->setTokenLocation(ReadSourceLocation(Record, Idx)); 763 } 764 765 void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) { 766 VisitExpr(E); 767 SmallVector<Expr *, 16> Exprs; 768 unsigned NumExprs = Record[Idx++]; 769 while (NumExprs--) 770 Exprs.push_back(Reader.ReadSubExpr()); 771 E->setExprs(Reader.getContext(), Exprs.data(), Exprs.size()); 772 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 773 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 774 } 775 776 void ASTStmtReader::VisitBlockExpr(BlockExpr *E) { 777 VisitExpr(E); 778 E->setBlockDecl(ReadDeclAs<BlockDecl>(Record, Idx)); 779 } 780 781 void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) { 782 VisitExpr(E); 783 E->NumAssocs = Record[Idx++]; 784 E->AssocTypes = new (Reader.getContext()) TypeSourceInfo*[E->NumAssocs]; 785 E->SubExprs = 786 new(Reader.getContext()) Stmt*[GenericSelectionExpr::END_EXPR+E->NumAssocs]; 787 788 E->SubExprs[GenericSelectionExpr::CONTROLLING] = Reader.ReadSubExpr(); 789 for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) { 790 E->AssocTypes[I] = GetTypeSourceInfo(Record, Idx); 791 E->SubExprs[GenericSelectionExpr::END_EXPR+I] = Reader.ReadSubExpr(); 792 } 793 E->ResultIndex = Record[Idx++]; 794 795 E->GenericLoc = ReadSourceLocation(Record, Idx); 796 E->DefaultLoc = ReadSourceLocation(Record, Idx); 797 E->RParenLoc = ReadSourceLocation(Record, Idx); 798 } 799 800 void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) { 801 VisitExpr(E); 802 unsigned numSemanticExprs = Record[Idx++]; 803 assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs); 804 E->PseudoObjectExprBits.ResultIndex = Record[Idx++]; 805 806 // Read the syntactic expression. 807 E->getSubExprsBuffer()[0] = Reader.ReadSubExpr(); 808 809 // Read all the semantic expressions. 810 for (unsigned i = 0; i != numSemanticExprs; ++i) { 811 Expr *subExpr = Reader.ReadSubExpr(); 812 E->getSubExprsBuffer()[i+1] = subExpr; 813 } 814 } 815 816 void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) { 817 VisitExpr(E); 818 E->Op = AtomicExpr::AtomicOp(Record[Idx++]); 819 E->NumSubExprs = AtomicExpr::getNumSubExprs(E->Op); 820 for (unsigned I = 0; I != E->NumSubExprs; ++I) 821 E->SubExprs[I] = Reader.ReadSubExpr(); 822 E->BuiltinLoc = ReadSourceLocation(Record, Idx); 823 E->RParenLoc = ReadSourceLocation(Record, Idx); 824 } 825 826 //===----------------------------------------------------------------------===// 827 // Objective-C Expressions and Statements 828 829 void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) { 830 VisitExpr(E); 831 E->setString(cast<StringLiteral>(Reader.ReadSubStmt())); 832 E->setAtLoc(ReadSourceLocation(Record, Idx)); 833 } 834 835 void ASTStmtReader::VisitObjCBoxedExpr(ObjCBoxedExpr *E) { 836 VisitExpr(E); 837 // could be one of several IntegerLiteral, FloatLiteral, etc. 838 E->SubExpr = Reader.ReadSubStmt(); 839 E->BoxingMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 840 E->Range = ReadSourceRange(Record, Idx); 841 } 842 843 void ASTStmtReader::VisitObjCArrayLiteral(ObjCArrayLiteral *E) { 844 VisitExpr(E); 845 unsigned NumElements = Record[Idx++]; 846 assert(NumElements == E->getNumElements() && "Wrong number of elements"); 847 Expr **Elements = E->getElements(); 848 for (unsigned I = 0, N = NumElements; I != N; ++I) 849 Elements[I] = Reader.ReadSubExpr(); 850 E->ArrayWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 851 E->Range = ReadSourceRange(Record, Idx); 852 } 853 854 void ASTStmtReader::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) { 855 VisitExpr(E); 856 unsigned NumElements = Record[Idx++]; 857 assert(NumElements == E->getNumElements() && "Wrong number of elements"); 858 bool HasPackExpansions = Record[Idx++]; 859 assert(HasPackExpansions == E->HasPackExpansions &&"Pack expansion mismatch"); 860 ObjCDictionaryLiteral::KeyValuePair *KeyValues = E->getKeyValues(); 861 ObjCDictionaryLiteral::ExpansionData *Expansions = E->getExpansionData(); 862 for (unsigned I = 0; I != NumElements; ++I) { 863 KeyValues[I].Key = Reader.ReadSubExpr(); 864 KeyValues[I].Value = Reader.ReadSubExpr(); 865 if (HasPackExpansions) { 866 Expansions[I].EllipsisLoc = ReadSourceLocation(Record, Idx); 867 Expansions[I].NumExpansionsPlusOne = Record[Idx++]; 868 } 869 } 870 E->DictWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 871 E->Range = ReadSourceRange(Record, Idx); 872 } 873 874 void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) { 875 VisitExpr(E); 876 E->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 877 E->setAtLoc(ReadSourceLocation(Record, Idx)); 878 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 879 } 880 881 void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) { 882 VisitExpr(E); 883 E->setSelector(Reader.ReadSelector(F, Record, Idx)); 884 E->setAtLoc(ReadSourceLocation(Record, Idx)); 885 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 886 } 887 888 void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { 889 VisitExpr(E); 890 E->setProtocol(ReadDeclAs<ObjCProtocolDecl>(Record, Idx)); 891 E->setAtLoc(ReadSourceLocation(Record, Idx)); 892 E->ProtoLoc = ReadSourceLocation(Record, Idx); 893 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 894 } 895 896 void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { 897 VisitExpr(E); 898 E->setDecl(ReadDeclAs<ObjCIvarDecl>(Record, Idx)); 899 E->setLocation(ReadSourceLocation(Record, Idx)); 900 E->setOpLoc(ReadSourceLocation(Record, Idx)); 901 E->setBase(Reader.ReadSubExpr()); 902 E->setIsArrow(Record[Idx++]); 903 E->setIsFreeIvar(Record[Idx++]); 904 } 905 906 void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 907 VisitExpr(E); 908 unsigned MethodRefFlags = Record[Idx++]; 909 bool Implicit = Record[Idx++] != 0; 910 if (Implicit) { 911 ObjCMethodDecl *Getter = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 912 ObjCMethodDecl *Setter = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 913 E->setImplicitProperty(Getter, Setter, MethodRefFlags); 914 } else { 915 E->setExplicitProperty(ReadDeclAs<ObjCPropertyDecl>(Record, Idx), 916 MethodRefFlags); 917 } 918 E->setLocation(ReadSourceLocation(Record, Idx)); 919 E->setReceiverLocation(ReadSourceLocation(Record, Idx)); 920 switch (Record[Idx++]) { 921 case 0: 922 E->setBase(Reader.ReadSubExpr()); 923 break; 924 case 1: 925 E->setSuperReceiver(Reader.readType(F, Record, Idx)); 926 break; 927 case 2: 928 E->setClassReceiver(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx)); 929 break; 930 } 931 } 932 933 void ASTStmtReader::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 934 VisitExpr(E); 935 E->setRBracket(ReadSourceLocation(Record, Idx)); 936 E->setBaseExpr(Reader.ReadSubExpr()); 937 E->setKeyExpr(Reader.ReadSubExpr()); 938 E->GetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 939 E->SetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 940 } 941 942 void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) { 943 VisitExpr(E); 944 assert(Record[Idx] == E->getNumArgs()); 945 ++Idx; 946 unsigned NumStoredSelLocs = Record[Idx++]; 947 E->SelLocsKind = Record[Idx++]; 948 E->setDelegateInitCall(Record[Idx++]); 949 E->IsImplicit = Record[Idx++]; 950 ObjCMessageExpr::ReceiverKind Kind 951 = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]); 952 switch (Kind) { 953 case ObjCMessageExpr::Instance: 954 E->setInstanceReceiver(Reader.ReadSubExpr()); 955 break; 956 957 case ObjCMessageExpr::Class: 958 E->setClassReceiver(GetTypeSourceInfo(Record, Idx)); 959 break; 960 961 case ObjCMessageExpr::SuperClass: 962 case ObjCMessageExpr::SuperInstance: { 963 QualType T = Reader.readType(F, Record, Idx); 964 SourceLocation SuperLoc = ReadSourceLocation(Record, Idx); 965 E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance); 966 break; 967 } 968 } 969 970 assert(Kind == E->getReceiverKind()); 971 972 if (Record[Idx++]) 973 E->setMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx)); 974 else 975 E->setSelector(Reader.ReadSelector(F, Record, Idx)); 976 977 E->LBracLoc = ReadSourceLocation(Record, Idx); 978 E->RBracLoc = ReadSourceLocation(Record, Idx); 979 980 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 981 E->setArg(I, Reader.ReadSubExpr()); 982 983 SourceLocation *Locs = E->getStoredSelLocs(); 984 for (unsigned I = 0; I != NumStoredSelLocs; ++I) 985 Locs[I] = ReadSourceLocation(Record, Idx); 986 } 987 988 void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { 989 VisitStmt(S); 990 S->setElement(Reader.ReadSubStmt()); 991 S->setCollection(Reader.ReadSubExpr()); 992 S->setBody(Reader.ReadSubStmt()); 993 S->setForLoc(ReadSourceLocation(Record, Idx)); 994 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 995 } 996 997 void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { 998 VisitStmt(S); 999 S->setCatchBody(Reader.ReadSubStmt()); 1000 S->setCatchParamDecl(ReadDeclAs<VarDecl>(Record, Idx)); 1001 S->setAtCatchLoc(ReadSourceLocation(Record, Idx)); 1002 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 1003 } 1004 1005 void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 1006 VisitStmt(S); 1007 S->setFinallyBody(Reader.ReadSubStmt()); 1008 S->setAtFinallyLoc(ReadSourceLocation(Record, Idx)); 1009 } 1010 1011 void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) { 1012 VisitStmt(S); 1013 S->setSubStmt(Reader.ReadSubStmt()); 1014 S->setAtLoc(ReadSourceLocation(Record, Idx)); 1015 } 1016 1017 void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { 1018 VisitStmt(S); 1019 assert(Record[Idx] == S->getNumCatchStmts()); 1020 ++Idx; 1021 bool HasFinally = Record[Idx++]; 1022 S->setTryBody(Reader.ReadSubStmt()); 1023 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) 1024 S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt())); 1025 1026 if (HasFinally) 1027 S->setFinallyStmt(Reader.ReadSubStmt()); 1028 S->setAtTryLoc(ReadSourceLocation(Record, Idx)); 1029 } 1030 1031 void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) { 1032 VisitStmt(S); 1033 S->setSynchExpr(Reader.ReadSubStmt()); 1034 S->setSynchBody(Reader.ReadSubStmt()); 1035 S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx)); 1036 } 1037 1038 void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { 1039 VisitStmt(S); 1040 S->setThrowExpr(Reader.ReadSubStmt()); 1041 S->setThrowLoc(ReadSourceLocation(Record, Idx)); 1042 } 1043 1044 void ASTStmtReader::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 1045 VisitExpr(E); 1046 E->setValue(Record[Idx++]); 1047 E->setLocation(ReadSourceLocation(Record, Idx)); 1048 } 1049 1050 //===----------------------------------------------------------------------===// 1051 // C++ Expressions and Statements 1052 //===----------------------------------------------------------------------===// 1053 1054 void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) { 1055 VisitStmt(S); 1056 S->CatchLoc = ReadSourceLocation(Record, Idx); 1057 S->ExceptionDecl = ReadDeclAs<VarDecl>(Record, Idx); 1058 S->HandlerBlock = Reader.ReadSubStmt(); 1059 } 1060 1061 void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) { 1062 VisitStmt(S); 1063 assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?"); 1064 ++Idx; 1065 S->TryLoc = ReadSourceLocation(Record, Idx); 1066 S->getStmts()[0] = Reader.ReadSubStmt(); 1067 for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i) 1068 S->getStmts()[i + 1] = Reader.ReadSubStmt(); 1069 } 1070 1071 void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) { 1072 VisitStmt(S); 1073 S->setForLoc(ReadSourceLocation(Record, Idx)); 1074 S->setColonLoc(ReadSourceLocation(Record, Idx)); 1075 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 1076 S->setRangeStmt(Reader.ReadSubStmt()); 1077 S->setBeginEndStmt(Reader.ReadSubStmt()); 1078 S->setCond(Reader.ReadSubExpr()); 1079 S->setInc(Reader.ReadSubExpr()); 1080 S->setLoopVarStmt(Reader.ReadSubStmt()); 1081 S->setBody(Reader.ReadSubStmt()); 1082 } 1083 1084 void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) { 1085 VisitStmt(S); 1086 S->KeywordLoc = ReadSourceLocation(Record, Idx); 1087 S->IsIfExists = Record[Idx++]; 1088 S->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1089 ReadDeclarationNameInfo(S->NameInfo, Record, Idx); 1090 S->SubStmt = Reader.ReadSubStmt(); 1091 } 1092 1093 void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 1094 VisitCallExpr(E); 1095 E->Operator = (OverloadedOperatorKind)Record[Idx++]; 1096 E->Range = Reader.ReadSourceRange(F, Record, Idx); 1097 E->setFPContractable((bool)Record[Idx++]); 1098 } 1099 1100 void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) { 1101 VisitExpr(E); 1102 E->NumArgs = Record[Idx++]; 1103 if (E->NumArgs) 1104 E->Args = new (Reader.getContext()) Stmt*[E->NumArgs]; 1105 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 1106 E->setArg(I, Reader.ReadSubExpr()); 1107 E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx)); 1108 E->setLocation(ReadSourceLocation(Record, Idx)); 1109 E->setElidable(Record[Idx++]); 1110 E->setHadMultipleCandidates(Record[Idx++]); 1111 E->setListInitialization(Record[Idx++]); 1112 E->setRequiresZeroInitialization(Record[Idx++]); 1113 E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]); 1114 E->ParenRange = ReadSourceRange(Record, Idx); 1115 } 1116 1117 void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) { 1118 VisitCXXConstructExpr(E); 1119 E->Type = GetTypeSourceInfo(Record, Idx); 1120 } 1121 1122 void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) { 1123 VisitExpr(E); 1124 unsigned NumCaptures = Record[Idx++]; 1125 assert(NumCaptures == E->NumCaptures);(void)NumCaptures; 1126 unsigned NumArrayIndexVars = Record[Idx++]; 1127 E->IntroducerRange = ReadSourceRange(Record, Idx); 1128 E->CaptureDefault = static_cast<LambdaCaptureDefault>(Record[Idx++]); 1129 E->ExplicitParams = Record[Idx++]; 1130 E->ExplicitResultType = Record[Idx++]; 1131 E->ClosingBrace = ReadSourceLocation(Record, Idx); 1132 1133 // Read capture initializers. 1134 for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(), 1135 CEnd = E->capture_init_end(); 1136 C != CEnd; ++C) 1137 *C = Reader.ReadSubExpr(); 1138 1139 // Read array capture index variables. 1140 if (NumArrayIndexVars > 0) { 1141 unsigned *ArrayIndexStarts = E->getArrayIndexStarts(); 1142 for (unsigned I = 0; I != NumCaptures + 1; ++I) 1143 ArrayIndexStarts[I] = Record[Idx++]; 1144 1145 VarDecl **ArrayIndexVars = E->getArrayIndexVars(); 1146 for (unsigned I = 0; I != NumArrayIndexVars; ++I) 1147 ArrayIndexVars[I] = ReadDeclAs<VarDecl>(Record, Idx); 1148 } 1149 } 1150 1151 void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) { 1152 VisitExplicitCastExpr(E); 1153 SourceRange R = ReadSourceRange(Record, Idx); 1154 E->Loc = R.getBegin(); 1155 E->RParenLoc = R.getEnd(); 1156 R = ReadSourceRange(Record, Idx); 1157 E->AngleBrackets = R; 1158 } 1159 1160 void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) { 1161 return VisitCXXNamedCastExpr(E); 1162 } 1163 1164 void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 1165 return VisitCXXNamedCastExpr(E); 1166 } 1167 1168 void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) { 1169 return VisitCXXNamedCastExpr(E); 1170 } 1171 1172 void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) { 1173 return VisitCXXNamedCastExpr(E); 1174 } 1175 1176 void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) { 1177 VisitExplicitCastExpr(E); 1178 E->setTypeBeginLoc(ReadSourceLocation(Record, Idx)); 1179 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1180 } 1181 1182 void ASTStmtReader::VisitUserDefinedLiteral(UserDefinedLiteral *E) { 1183 VisitCallExpr(E); 1184 E->UDSuffixLoc = ReadSourceLocation(Record, Idx); 1185 } 1186 1187 void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 1188 VisitExpr(E); 1189 E->setValue(Record[Idx++]); 1190 E->setLocation(ReadSourceLocation(Record, Idx)); 1191 } 1192 1193 void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) { 1194 VisitExpr(E); 1195 E->setLocation(ReadSourceLocation(Record, Idx)); 1196 } 1197 1198 void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) { 1199 VisitExpr(E); 1200 E->setSourceRange(ReadSourceRange(Record, Idx)); 1201 if (E->isTypeOperand()) { // typeid(int) 1202 E->setTypeOperandSourceInfo( 1203 GetTypeSourceInfo(Record, Idx)); 1204 return; 1205 } 1206 1207 // typeid(42+2) 1208 E->setExprOperand(Reader.ReadSubExpr()); 1209 } 1210 1211 void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) { 1212 VisitExpr(E); 1213 E->setLocation(ReadSourceLocation(Record, Idx)); 1214 E->setImplicit(Record[Idx++]); 1215 } 1216 1217 void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) { 1218 VisitExpr(E); 1219 E->ThrowLoc = ReadSourceLocation(Record, Idx); 1220 E->Op = Reader.ReadSubExpr(); 1221 E->IsThrownVariableInScope = Record[Idx++]; 1222 } 1223 1224 void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 1225 VisitExpr(E); 1226 1227 assert((bool)Record[Idx] == E->Param.getInt() && "We messed up at creation ?"); 1228 ++Idx; // HasOtherExprStored and SubExpr was handled during creation. 1229 E->Param.setPointer(ReadDeclAs<ParmVarDecl>(Record, Idx)); 1230 E->Loc = ReadSourceLocation(Record, Idx); 1231 } 1232 1233 void ASTStmtReader::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 1234 VisitExpr(E); 1235 E->Field = ReadDeclAs<FieldDecl>(Record, Idx); 1236 E->Loc = ReadSourceLocation(Record, Idx); 1237 } 1238 1239 void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 1240 VisitExpr(E); 1241 E->setTemporary(Reader.ReadCXXTemporary(F, Record, Idx)); 1242 E->setSubExpr(Reader.ReadSubExpr()); 1243 } 1244 1245 void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { 1246 VisitExpr(E); 1247 E->TypeInfo = GetTypeSourceInfo(Record, Idx); 1248 E->RParenLoc = ReadSourceLocation(Record, Idx); 1249 } 1250 1251 void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) { 1252 VisitExpr(E); 1253 E->GlobalNew = Record[Idx++]; 1254 bool isArray = Record[Idx++]; 1255 E->UsualArrayDeleteWantsSize = Record[Idx++]; 1256 unsigned NumPlacementArgs = Record[Idx++]; 1257 E->StoredInitializationStyle = Record[Idx++]; 1258 E->setOperatorNew(ReadDeclAs<FunctionDecl>(Record, Idx)); 1259 E->setOperatorDelete(ReadDeclAs<FunctionDecl>(Record, Idx)); 1260 E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx); 1261 E->TypeIdParens = ReadSourceRange(Record, Idx); 1262 E->Range = ReadSourceRange(Record, Idx); 1263 E->DirectInitRange = ReadSourceRange(Record, Idx); 1264 1265 E->AllocateArgsArray(Reader.getContext(), isArray, NumPlacementArgs, 1266 E->StoredInitializationStyle != 0); 1267 1268 // Install all the subexpressions. 1269 for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end(); 1270 I != e; ++I) 1271 *I = Reader.ReadSubStmt(); 1272 } 1273 1274 void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 1275 VisitExpr(E); 1276 E->GlobalDelete = Record[Idx++]; 1277 E->ArrayForm = Record[Idx++]; 1278 E->ArrayFormAsWritten = Record[Idx++]; 1279 E->UsualArrayDeleteWantsSize = Record[Idx++]; 1280 E->OperatorDelete = ReadDeclAs<FunctionDecl>(Record, Idx); 1281 E->Argument = Reader.ReadSubExpr(); 1282 E->Loc = ReadSourceLocation(Record, Idx); 1283 } 1284 1285 void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 1286 VisitExpr(E); 1287 1288 E->Base = Reader.ReadSubExpr(); 1289 E->IsArrow = Record[Idx++]; 1290 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1291 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1292 E->ScopeType = GetTypeSourceInfo(Record, Idx); 1293 E->ColonColonLoc = ReadSourceLocation(Record, Idx); 1294 E->TildeLoc = ReadSourceLocation(Record, Idx); 1295 1296 IdentifierInfo *II = Reader.GetIdentifierInfo(F, Record, Idx); 1297 if (II) 1298 E->setDestroyedType(II, ReadSourceLocation(Record, Idx)); 1299 else 1300 E->setDestroyedType(GetTypeSourceInfo(Record, Idx)); 1301 } 1302 1303 void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) { 1304 VisitExpr(E); 1305 1306 unsigned NumObjects = Record[Idx++]; 1307 assert(NumObjects == E->getNumObjects()); 1308 for (unsigned i = 0; i != NumObjects; ++i) 1309 E->getObjectsBuffer()[i] = ReadDeclAs<BlockDecl>(Record, Idx); 1310 1311 E->SubExpr = Reader.ReadSubExpr(); 1312 } 1313 1314 void 1315 ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){ 1316 VisitExpr(E); 1317 1318 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 1319 ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), 1320 /*NumTemplateArgs=*/Record[Idx++]); 1321 1322 E->Base = Reader.ReadSubExpr(); 1323 E->BaseType = Reader.readType(F, Record, Idx); 1324 E->IsArrow = Record[Idx++]; 1325 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1326 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1327 E->FirstQualifierFoundInScope = ReadDeclAs<NamedDecl>(Record, Idx); 1328 ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx); 1329 } 1330 1331 void 1332 ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { 1333 VisitExpr(E); 1334 1335 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 1336 ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), 1337 /*NumTemplateArgs=*/Record[Idx++]); 1338 1339 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1340 ReadDeclarationNameInfo(E->NameInfo, Record, Idx); 1341 } 1342 1343 void 1344 ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) { 1345 VisitExpr(E); 1346 assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?"); 1347 ++Idx; // NumArgs; 1348 for (unsigned I = 0, N = E->arg_size(); I != N; ++I) 1349 E->setArg(I, Reader.ReadSubExpr()); 1350 E->Type = GetTypeSourceInfo(Record, Idx); 1351 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 1352 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1353 } 1354 1355 void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) { 1356 VisitExpr(E); 1357 1358 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 1359 ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), 1360 /*NumTemplateArgs=*/Record[Idx++]); 1361 1362 unsigned NumDecls = Record[Idx++]; 1363 UnresolvedSet<8> Decls; 1364 for (unsigned i = 0; i != NumDecls; ++i) { 1365 NamedDecl *D = ReadDeclAs<NamedDecl>(Record, Idx); 1366 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 1367 Decls.addDecl(D, AS); 1368 } 1369 E->initializeResults(Reader.getContext(), Decls.begin(), Decls.end()); 1370 1371 ReadDeclarationNameInfo(E->NameInfo, Record, Idx); 1372 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1373 } 1374 1375 void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) { 1376 VisitOverloadExpr(E); 1377 E->IsArrow = Record[Idx++]; 1378 E->HasUnresolvedUsing = Record[Idx++]; 1379 E->Base = Reader.ReadSubExpr(); 1380 E->BaseType = Reader.readType(F, Record, Idx); 1381 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1382 } 1383 1384 void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { 1385 VisitOverloadExpr(E); 1386 E->RequiresADL = Record[Idx++]; 1387 E->Overloaded = Record[Idx++]; 1388 E->NamingClass = ReadDeclAs<CXXRecordDecl>(Record, Idx); 1389 } 1390 1391 void ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 1392 VisitExpr(E); 1393 E->UTT = (UnaryTypeTrait)Record[Idx++]; 1394 E->Value = (bool)Record[Idx++]; 1395 SourceRange Range = ReadSourceRange(Record, Idx); 1396 E->Loc = Range.getBegin(); 1397 E->RParen = Range.getEnd(); 1398 E->QueriedType = GetTypeSourceInfo(Record, Idx); 1399 } 1400 1401 void ASTStmtReader::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) { 1402 VisitExpr(E); 1403 E->BTT = (BinaryTypeTrait)Record[Idx++]; 1404 E->Value = (bool)Record[Idx++]; 1405 SourceRange Range = ReadSourceRange(Record, Idx); 1406 E->Loc = Range.getBegin(); 1407 E->RParen = Range.getEnd(); 1408 E->LhsType = GetTypeSourceInfo(Record, Idx); 1409 E->RhsType = GetTypeSourceInfo(Record, Idx); 1410 } 1411 1412 void ASTStmtReader::VisitTypeTraitExpr(TypeTraitExpr *E) { 1413 VisitExpr(E); 1414 E->TypeTraitExprBits.NumArgs = Record[Idx++]; 1415 E->TypeTraitExprBits.Kind = Record[Idx++]; 1416 E->TypeTraitExprBits.Value = Record[Idx++]; 1417 1418 TypeSourceInfo **Args = E->getTypeSourceInfos(); 1419 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 1420 Args[I] = GetTypeSourceInfo(Record, Idx); 1421 } 1422 1423 void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 1424 VisitExpr(E); 1425 E->ATT = (ArrayTypeTrait)Record[Idx++]; 1426 E->Value = (unsigned int)Record[Idx++]; 1427 SourceRange Range = ReadSourceRange(Record, Idx); 1428 E->Loc = Range.getBegin(); 1429 E->RParen = Range.getEnd(); 1430 E->QueriedType = GetTypeSourceInfo(Record, Idx); 1431 } 1432 1433 void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 1434 VisitExpr(E); 1435 E->ET = (ExpressionTrait)Record[Idx++]; 1436 E->Value = (bool)Record[Idx++]; 1437 SourceRange Range = ReadSourceRange(Record, Idx); 1438 E->QueriedExpression = Reader.ReadSubExpr(); 1439 E->Loc = Range.getBegin(); 1440 E->RParen = Range.getEnd(); 1441 } 1442 1443 void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 1444 VisitExpr(E); 1445 E->Value = (bool)Record[Idx++]; 1446 E->Range = ReadSourceRange(Record, Idx); 1447 E->Operand = Reader.ReadSubExpr(); 1448 } 1449 1450 void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) { 1451 VisitExpr(E); 1452 E->EllipsisLoc = ReadSourceLocation(Record, Idx); 1453 E->NumExpansions = Record[Idx++]; 1454 E->Pattern = Reader.ReadSubExpr(); 1455 } 1456 1457 void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) { 1458 VisitExpr(E); 1459 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1460 E->PackLoc = ReadSourceLocation(Record, Idx); 1461 E->RParenLoc = ReadSourceLocation(Record, Idx); 1462 E->Length = Record[Idx++]; 1463 E->Pack = ReadDeclAs<NamedDecl>(Record, Idx); 1464 } 1465 1466 void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( 1467 SubstNonTypeTemplateParmExpr *E) { 1468 VisitExpr(E); 1469 E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx); 1470 E->NameLoc = ReadSourceLocation(Record, Idx); 1471 E->Replacement = Reader.ReadSubExpr(); 1472 } 1473 1474 void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr( 1475 SubstNonTypeTemplateParmPackExpr *E) { 1476 VisitExpr(E); 1477 E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx); 1478 TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx); 1479 if (ArgPack.getKind() != TemplateArgument::Pack) 1480 return; 1481 1482 E->Arguments = ArgPack.pack_begin(); 1483 E->NumArguments = ArgPack.pack_size(); 1484 E->NameLoc = ReadSourceLocation(Record, Idx); 1485 } 1486 1487 void ASTStmtReader::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) { 1488 VisitExpr(E); 1489 E->NumParameters = Record[Idx++]; 1490 E->ParamPack = ReadDeclAs<ParmVarDecl>(Record, Idx); 1491 E->NameLoc = ReadSourceLocation(Record, Idx); 1492 ParmVarDecl **Parms = reinterpret_cast<ParmVarDecl**>(E+1); 1493 for (unsigned i = 0, n = E->NumParameters; i != n; ++i) 1494 Parms[i] = ReadDeclAs<ParmVarDecl>(Record, Idx); 1495 } 1496 1497 void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) { 1498 VisitExpr(E); 1499 E->Temporary = Reader.ReadSubExpr(); 1500 } 1501 1502 void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) { 1503 VisitExpr(E); 1504 E->SourceExpr = Reader.ReadSubExpr(); 1505 E->Loc = ReadSourceLocation(Record, Idx); 1506 } 1507 1508 //===----------------------------------------------------------------------===// 1509 // Microsoft Expressions and Statements 1510 //===----------------------------------------------------------------------===// 1511 void ASTStmtReader::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) { 1512 VisitExpr(E); 1513 E->IsArrow = (Record[Idx++] != 0); 1514 E->BaseExpr = Reader.ReadSubExpr(); 1515 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1516 E->MemberLoc = ReadSourceLocation(Record, Idx); 1517 E->TheDecl = ReadDeclAs<MSPropertyDecl>(Record, Idx); 1518 } 1519 1520 void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) { 1521 VisitExpr(E); 1522 E->setSourceRange(ReadSourceRange(Record, Idx)); 1523 if (E->isTypeOperand()) { // __uuidof(ComType) 1524 E->setTypeOperandSourceInfo( 1525 GetTypeSourceInfo(Record, Idx)); 1526 return; 1527 } 1528 1529 // __uuidof(expr) 1530 E->setExprOperand(Reader.ReadSubExpr()); 1531 } 1532 1533 void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) { 1534 VisitStmt(S); 1535 S->Loc = ReadSourceLocation(Record, Idx); 1536 S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt(); 1537 S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt(); 1538 } 1539 1540 void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) { 1541 VisitStmt(S); 1542 S->Loc = ReadSourceLocation(Record, Idx); 1543 S->Block = Reader.ReadSubStmt(); 1544 } 1545 1546 void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) { 1547 VisitStmt(S); 1548 S->IsCXXTry = Record[Idx++]; 1549 S->TryLoc = ReadSourceLocation(Record, Idx); 1550 S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt(); 1551 S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt(); 1552 } 1553 1554 //===----------------------------------------------------------------------===// 1555 // CUDA Expressions and Statements 1556 //===----------------------------------------------------------------------===// 1557 1558 void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 1559 VisitCallExpr(E); 1560 E->setConfig(cast<CallExpr>(Reader.ReadSubExpr())); 1561 } 1562 1563 //===----------------------------------------------------------------------===// 1564 // OpenCL Expressions and Statements. 1565 //===----------------------------------------------------------------------===// 1566 void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) { 1567 VisitExpr(E); 1568 E->BuiltinLoc = ReadSourceLocation(Record, Idx); 1569 E->RParenLoc = ReadSourceLocation(Record, Idx); 1570 E->SrcExpr = Reader.ReadSubExpr(); 1571 } 1572 1573 //===----------------------------------------------------------------------===// 1574 // ASTReader Implementation 1575 //===----------------------------------------------------------------------===// 1576 1577 Stmt *ASTReader::ReadStmt(ModuleFile &F) { 1578 switch (ReadingKind) { 1579 case Read_Decl: 1580 case Read_Type: 1581 return ReadStmtFromStream(F); 1582 case Read_Stmt: 1583 return ReadSubStmt(); 1584 } 1585 1586 llvm_unreachable("ReadingKind not set ?"); 1587 } 1588 1589 Expr *ASTReader::ReadExpr(ModuleFile &F) { 1590 return cast_or_null<Expr>(ReadStmt(F)); 1591 } 1592 1593 Expr *ASTReader::ReadSubExpr() { 1594 return cast_or_null<Expr>(ReadSubStmt()); 1595 } 1596 1597 // Within the bitstream, expressions are stored in Reverse Polish 1598 // Notation, with each of the subexpressions preceding the 1599 // expression they are stored in. Subexpressions are stored from last to first. 1600 // To evaluate expressions, we continue reading expressions and placing them on 1601 // the stack, with expressions having operands removing those operands from the 1602 // stack. Evaluation terminates when we see a STMT_STOP record, and 1603 // the single remaining expression on the stack is our result. 1604 Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) { 1605 1606 ReadingKindTracker ReadingKind(Read_Stmt, *this); 1607 llvm::BitstreamCursor &Cursor = F.DeclsCursor; 1608 1609 // Map of offset to previously deserialized stmt. The offset points 1610 /// just after the stmt record. 1611 llvm::DenseMap<uint64_t, Stmt *> StmtEntries; 1612 1613 #ifndef NDEBUG 1614 unsigned PrevNumStmts = StmtStack.size(); 1615 #endif 1616 1617 RecordData Record; 1618 unsigned Idx; 1619 ASTStmtReader Reader(*this, F, Cursor, Record, Idx); 1620 Stmt::EmptyShell Empty; 1621 1622 while (true) { 1623 llvm::BitstreamEntry Entry = Cursor.advanceSkippingSubblocks(); 1624 1625 switch (Entry.Kind) { 1626 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1627 case llvm::BitstreamEntry::Error: 1628 Error("malformed block record in AST file"); 1629 return 0; 1630 case llvm::BitstreamEntry::EndBlock: 1631 goto Done; 1632 case llvm::BitstreamEntry::Record: 1633 // The interesting case. 1634 break; 1635 } 1636 1637 1638 Stmt *S = 0; 1639 Idx = 0; 1640 Record.clear(); 1641 bool Finished = false; 1642 bool IsStmtReference = false; 1643 switch ((StmtCode)Cursor.readRecord(Entry.ID, Record)) { 1644 case STMT_STOP: 1645 Finished = true; 1646 break; 1647 1648 case STMT_REF_PTR: 1649 IsStmtReference = true; 1650 assert(StmtEntries.find(Record[0]) != StmtEntries.end() && 1651 "No stmt was recorded for this offset reference!"); 1652 S = StmtEntries[Record[Idx++]]; 1653 break; 1654 1655 case STMT_NULL_PTR: 1656 S = 0; 1657 break; 1658 1659 case STMT_NULL: 1660 S = new (Context) NullStmt(Empty); 1661 break; 1662 1663 case STMT_COMPOUND: 1664 S = new (Context) CompoundStmt(Empty); 1665 break; 1666 1667 case STMT_CASE: 1668 S = new (Context) CaseStmt(Empty); 1669 break; 1670 1671 case STMT_DEFAULT: 1672 S = new (Context) DefaultStmt(Empty); 1673 break; 1674 1675 case STMT_LABEL: 1676 S = new (Context) LabelStmt(Empty); 1677 break; 1678 1679 case STMT_ATTRIBUTED: 1680 S = AttributedStmt::CreateEmpty( 1681 Context, 1682 /*NumAttrs*/Record[ASTStmtReader::NumStmtFields]); 1683 break; 1684 1685 case STMT_IF: 1686 S = new (Context) IfStmt(Empty); 1687 break; 1688 1689 case STMT_SWITCH: 1690 S = new (Context) SwitchStmt(Empty); 1691 break; 1692 1693 case STMT_WHILE: 1694 S = new (Context) WhileStmt(Empty); 1695 break; 1696 1697 case STMT_DO: 1698 S = new (Context) DoStmt(Empty); 1699 break; 1700 1701 case STMT_FOR: 1702 S = new (Context) ForStmt(Empty); 1703 break; 1704 1705 case STMT_GOTO: 1706 S = new (Context) GotoStmt(Empty); 1707 break; 1708 1709 case STMT_INDIRECT_GOTO: 1710 S = new (Context) IndirectGotoStmt(Empty); 1711 break; 1712 1713 case STMT_CONTINUE: 1714 S = new (Context) ContinueStmt(Empty); 1715 break; 1716 1717 case STMT_BREAK: 1718 S = new (Context) BreakStmt(Empty); 1719 break; 1720 1721 case STMT_RETURN: 1722 S = new (Context) ReturnStmt(Empty); 1723 break; 1724 1725 case STMT_DECL: 1726 S = new (Context) DeclStmt(Empty); 1727 break; 1728 1729 case STMT_GCCASM: 1730 S = new (Context) GCCAsmStmt(Empty); 1731 break; 1732 1733 case STMT_MSASM: 1734 S = new (Context) MSAsmStmt(Empty); 1735 break; 1736 1737 case STMT_CAPTURED: 1738 llvm_unreachable("not implemented yet"); 1739 break; 1740 1741 case EXPR_PREDEFINED: 1742 S = new (Context) PredefinedExpr(Empty); 1743 break; 1744 1745 case EXPR_DECL_REF: 1746 S = DeclRefExpr::CreateEmpty( 1747 Context, 1748 /*HasQualifier=*/Record[ASTStmtReader::NumExprFields], 1749 /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1], 1750 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 2], 1751 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ? 1752 Record[ASTStmtReader::NumExprFields + 5] : 0); 1753 break; 1754 1755 case EXPR_INTEGER_LITERAL: 1756 S = IntegerLiteral::Create(Context, Empty); 1757 break; 1758 1759 case EXPR_FLOATING_LITERAL: 1760 S = FloatingLiteral::Create(Context, Empty); 1761 break; 1762 1763 case EXPR_IMAGINARY_LITERAL: 1764 S = new (Context) ImaginaryLiteral(Empty); 1765 break; 1766 1767 case EXPR_STRING_LITERAL: 1768 S = StringLiteral::CreateEmpty(Context, 1769 Record[ASTStmtReader::NumExprFields + 1]); 1770 break; 1771 1772 case EXPR_CHARACTER_LITERAL: 1773 S = new (Context) CharacterLiteral(Empty); 1774 break; 1775 1776 case EXPR_PAREN: 1777 S = new (Context) ParenExpr(Empty); 1778 break; 1779 1780 case EXPR_PAREN_LIST: 1781 S = new (Context) ParenListExpr(Empty); 1782 break; 1783 1784 case EXPR_UNARY_OPERATOR: 1785 S = new (Context) UnaryOperator(Empty); 1786 break; 1787 1788 case EXPR_OFFSETOF: 1789 S = OffsetOfExpr::CreateEmpty(Context, 1790 Record[ASTStmtReader::NumExprFields], 1791 Record[ASTStmtReader::NumExprFields + 1]); 1792 break; 1793 1794 case EXPR_SIZEOF_ALIGN_OF: 1795 S = new (Context) UnaryExprOrTypeTraitExpr(Empty); 1796 break; 1797 1798 case EXPR_ARRAY_SUBSCRIPT: 1799 S = new (Context) ArraySubscriptExpr(Empty); 1800 break; 1801 1802 case EXPR_CALL: 1803 S = new (Context) CallExpr(Context, Stmt::CallExprClass, Empty); 1804 break; 1805 1806 case EXPR_MEMBER: { 1807 // We load everything here and fully initialize it at creation. 1808 // That way we can use MemberExpr::Create and don't have to duplicate its 1809 // logic with a MemberExpr::CreateEmpty. 1810 1811 assert(Idx == 0); 1812 NestedNameSpecifierLoc QualifierLoc; 1813 if (Record[Idx++]) { // HasQualifier. 1814 QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 1815 } 1816 1817 SourceLocation TemplateKWLoc; 1818 TemplateArgumentListInfo ArgInfo; 1819 bool HasTemplateKWAndArgsInfo = Record[Idx++]; 1820 if (HasTemplateKWAndArgsInfo) { 1821 TemplateKWLoc = ReadSourceLocation(F, Record, Idx); 1822 unsigned NumTemplateArgs = Record[Idx++]; 1823 ArgInfo.setLAngleLoc(ReadSourceLocation(F, Record, Idx)); 1824 ArgInfo.setRAngleLoc(ReadSourceLocation(F, Record, Idx)); 1825 for (unsigned i = 0; i != NumTemplateArgs; ++i) 1826 ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx)); 1827 } 1828 1829 bool HadMultipleCandidates = Record[Idx++]; 1830 1831 NamedDecl *FoundD = ReadDeclAs<NamedDecl>(F, Record, Idx); 1832 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 1833 DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS); 1834 1835 QualType T = readType(F, Record, Idx); 1836 ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]); 1837 ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]); 1838 Expr *Base = ReadSubExpr(); 1839 ValueDecl *MemberD = ReadDeclAs<ValueDecl>(F, Record, Idx); 1840 SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx); 1841 DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc); 1842 bool IsArrow = Record[Idx++]; 1843 1844 S = MemberExpr::Create(Context, Base, IsArrow, QualifierLoc, 1845 TemplateKWLoc, MemberD, FoundDecl, MemberNameInfo, 1846 HasTemplateKWAndArgsInfo ? &ArgInfo : 0, 1847 T, VK, OK); 1848 ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc, 1849 MemberD->getDeclName(), Record, Idx); 1850 if (HadMultipleCandidates) 1851 cast<MemberExpr>(S)->setHadMultipleCandidates(true); 1852 break; 1853 } 1854 1855 case EXPR_BINARY_OPERATOR: 1856 S = new (Context) BinaryOperator(Empty); 1857 break; 1858 1859 case EXPR_COMPOUND_ASSIGN_OPERATOR: 1860 S = new (Context) CompoundAssignOperator(Empty); 1861 break; 1862 1863 case EXPR_CONDITIONAL_OPERATOR: 1864 S = new (Context) ConditionalOperator(Empty); 1865 break; 1866 1867 case EXPR_BINARY_CONDITIONAL_OPERATOR: 1868 S = new (Context) BinaryConditionalOperator(Empty); 1869 break; 1870 1871 case EXPR_IMPLICIT_CAST: 1872 S = ImplicitCastExpr::CreateEmpty(Context, 1873 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 1874 break; 1875 1876 case EXPR_CSTYLE_CAST: 1877 S = CStyleCastExpr::CreateEmpty(Context, 1878 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 1879 break; 1880 1881 case EXPR_COMPOUND_LITERAL: 1882 S = new (Context) CompoundLiteralExpr(Empty); 1883 break; 1884 1885 case EXPR_EXT_VECTOR_ELEMENT: 1886 S = new (Context) ExtVectorElementExpr(Empty); 1887 break; 1888 1889 case EXPR_INIT_LIST: 1890 S = new (Context) InitListExpr(Empty); 1891 break; 1892 1893 case EXPR_DESIGNATED_INIT: 1894 S = DesignatedInitExpr::CreateEmpty(Context, 1895 Record[ASTStmtReader::NumExprFields] - 1); 1896 1897 break; 1898 1899 case EXPR_IMPLICIT_VALUE_INIT: 1900 S = new (Context) ImplicitValueInitExpr(Empty); 1901 break; 1902 1903 case EXPR_VA_ARG: 1904 S = new (Context) VAArgExpr(Empty); 1905 break; 1906 1907 case EXPR_ADDR_LABEL: 1908 S = new (Context) AddrLabelExpr(Empty); 1909 break; 1910 1911 case EXPR_STMT: 1912 S = new (Context) StmtExpr(Empty); 1913 break; 1914 1915 case EXPR_CHOOSE: 1916 S = new (Context) ChooseExpr(Empty); 1917 break; 1918 1919 case EXPR_GNU_NULL: 1920 S = new (Context) GNUNullExpr(Empty); 1921 break; 1922 1923 case EXPR_SHUFFLE_VECTOR: 1924 S = new (Context) ShuffleVectorExpr(Empty); 1925 break; 1926 1927 case EXPR_BLOCK: 1928 S = new (Context) BlockExpr(Empty); 1929 break; 1930 1931 case EXPR_GENERIC_SELECTION: 1932 S = new (Context) GenericSelectionExpr(Empty); 1933 break; 1934 1935 case EXPR_OBJC_STRING_LITERAL: 1936 S = new (Context) ObjCStringLiteral(Empty); 1937 break; 1938 case EXPR_OBJC_BOXED_EXPRESSION: 1939 S = new (Context) ObjCBoxedExpr(Empty); 1940 break; 1941 case EXPR_OBJC_ARRAY_LITERAL: 1942 S = ObjCArrayLiteral::CreateEmpty(Context, 1943 Record[ASTStmtReader::NumExprFields]); 1944 break; 1945 case EXPR_OBJC_DICTIONARY_LITERAL: 1946 S = ObjCDictionaryLiteral::CreateEmpty(Context, 1947 Record[ASTStmtReader::NumExprFields], 1948 Record[ASTStmtReader::NumExprFields + 1]); 1949 break; 1950 case EXPR_OBJC_ENCODE: 1951 S = new (Context) ObjCEncodeExpr(Empty); 1952 break; 1953 case EXPR_OBJC_SELECTOR_EXPR: 1954 S = new (Context) ObjCSelectorExpr(Empty); 1955 break; 1956 case EXPR_OBJC_PROTOCOL_EXPR: 1957 S = new (Context) ObjCProtocolExpr(Empty); 1958 break; 1959 case EXPR_OBJC_IVAR_REF_EXPR: 1960 S = new (Context) ObjCIvarRefExpr(Empty); 1961 break; 1962 case EXPR_OBJC_PROPERTY_REF_EXPR: 1963 S = new (Context) ObjCPropertyRefExpr(Empty); 1964 break; 1965 case EXPR_OBJC_SUBSCRIPT_REF_EXPR: 1966 S = new (Context) ObjCSubscriptRefExpr(Empty); 1967 break; 1968 case EXPR_OBJC_KVC_REF_EXPR: 1969 llvm_unreachable("mismatching AST file"); 1970 case EXPR_OBJC_MESSAGE_EXPR: 1971 S = ObjCMessageExpr::CreateEmpty(Context, 1972 Record[ASTStmtReader::NumExprFields], 1973 Record[ASTStmtReader::NumExprFields + 1]); 1974 break; 1975 case EXPR_OBJC_ISA: 1976 S = new (Context) ObjCIsaExpr(Empty); 1977 break; 1978 case EXPR_OBJC_INDIRECT_COPY_RESTORE: 1979 S = new (Context) ObjCIndirectCopyRestoreExpr(Empty); 1980 break; 1981 case EXPR_OBJC_BRIDGED_CAST: 1982 S = new (Context) ObjCBridgedCastExpr(Empty); 1983 break; 1984 case STMT_OBJC_FOR_COLLECTION: 1985 S = new (Context) ObjCForCollectionStmt(Empty); 1986 break; 1987 case STMT_OBJC_CATCH: 1988 S = new (Context) ObjCAtCatchStmt(Empty); 1989 break; 1990 case STMT_OBJC_FINALLY: 1991 S = new (Context) ObjCAtFinallyStmt(Empty); 1992 break; 1993 case STMT_OBJC_AT_TRY: 1994 S = ObjCAtTryStmt::CreateEmpty(Context, 1995 Record[ASTStmtReader::NumStmtFields], 1996 Record[ASTStmtReader::NumStmtFields + 1]); 1997 break; 1998 case STMT_OBJC_AT_SYNCHRONIZED: 1999 S = new (Context) ObjCAtSynchronizedStmt(Empty); 2000 break; 2001 case STMT_OBJC_AT_THROW: 2002 S = new (Context) ObjCAtThrowStmt(Empty); 2003 break; 2004 case STMT_OBJC_AUTORELEASE_POOL: 2005 S = new (Context) ObjCAutoreleasePoolStmt(Empty); 2006 break; 2007 case EXPR_OBJC_BOOL_LITERAL: 2008 S = new (Context) ObjCBoolLiteralExpr(Empty); 2009 break; 2010 case STMT_SEH_EXCEPT: 2011 S = new (Context) SEHExceptStmt(Empty); 2012 break; 2013 case STMT_SEH_FINALLY: 2014 S = new (Context) SEHFinallyStmt(Empty); 2015 break; 2016 case STMT_SEH_TRY: 2017 S = new (Context) SEHTryStmt(Empty); 2018 break; 2019 case STMT_CXX_CATCH: 2020 S = new (Context) CXXCatchStmt(Empty); 2021 break; 2022 2023 case STMT_CXX_TRY: 2024 S = CXXTryStmt::Create(Context, Empty, 2025 /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]); 2026 break; 2027 2028 case STMT_CXX_FOR_RANGE: 2029 S = new (Context) CXXForRangeStmt(Empty); 2030 break; 2031 2032 case STMT_MS_DEPENDENT_EXISTS: 2033 S = new (Context) MSDependentExistsStmt(SourceLocation(), true, 2034 NestedNameSpecifierLoc(), 2035 DeclarationNameInfo(), 2036 0); 2037 break; 2038 2039 case EXPR_CXX_OPERATOR_CALL: 2040 S = new (Context) CXXOperatorCallExpr(Context, Empty); 2041 break; 2042 2043 case EXPR_CXX_MEMBER_CALL: 2044 S = new (Context) CXXMemberCallExpr(Context, Empty); 2045 break; 2046 2047 case EXPR_CXX_CONSTRUCT: 2048 S = new (Context) CXXConstructExpr(Empty); 2049 break; 2050 2051 case EXPR_CXX_TEMPORARY_OBJECT: 2052 S = new (Context) CXXTemporaryObjectExpr(Empty); 2053 break; 2054 2055 case EXPR_CXX_STATIC_CAST: 2056 S = CXXStaticCastExpr::CreateEmpty(Context, 2057 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 2058 break; 2059 2060 case EXPR_CXX_DYNAMIC_CAST: 2061 S = CXXDynamicCastExpr::CreateEmpty(Context, 2062 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 2063 break; 2064 2065 case EXPR_CXX_REINTERPRET_CAST: 2066 S = CXXReinterpretCastExpr::CreateEmpty(Context, 2067 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 2068 break; 2069 2070 case EXPR_CXX_CONST_CAST: 2071 S = CXXConstCastExpr::CreateEmpty(Context); 2072 break; 2073 2074 case EXPR_CXX_FUNCTIONAL_CAST: 2075 S = CXXFunctionalCastExpr::CreateEmpty(Context, 2076 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 2077 break; 2078 2079 case EXPR_USER_DEFINED_LITERAL: 2080 S = new (Context) UserDefinedLiteral(Context, Empty); 2081 break; 2082 2083 case EXPR_CXX_BOOL_LITERAL: 2084 S = new (Context) CXXBoolLiteralExpr(Empty); 2085 break; 2086 2087 case EXPR_CXX_NULL_PTR_LITERAL: 2088 S = new (Context) CXXNullPtrLiteralExpr(Empty); 2089 break; 2090 case EXPR_CXX_TYPEID_EXPR: 2091 S = new (Context) CXXTypeidExpr(Empty, true); 2092 break; 2093 case EXPR_CXX_TYPEID_TYPE: 2094 S = new (Context) CXXTypeidExpr(Empty, false); 2095 break; 2096 case EXPR_CXX_UUIDOF_EXPR: 2097 S = new (Context) CXXUuidofExpr(Empty, true); 2098 break; 2099 case EXPR_CXX_PROPERTY_REF_EXPR: 2100 S = new (Context) MSPropertyRefExpr(Empty); 2101 break; 2102 case EXPR_CXX_UUIDOF_TYPE: 2103 S = new (Context) CXXUuidofExpr(Empty, false); 2104 break; 2105 case EXPR_CXX_THIS: 2106 S = new (Context) CXXThisExpr(Empty); 2107 break; 2108 case EXPR_CXX_THROW: 2109 S = new (Context) CXXThrowExpr(Empty); 2110 break; 2111 case EXPR_CXX_DEFAULT_ARG: { 2112 bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields]; 2113 if (HasOtherExprStored) { 2114 Expr *SubExpr = ReadSubExpr(); 2115 S = CXXDefaultArgExpr::Create(Context, SourceLocation(), 0, SubExpr); 2116 } else 2117 S = new (Context) CXXDefaultArgExpr(Empty); 2118 break; 2119 } 2120 case EXPR_CXX_DEFAULT_INIT: 2121 S = new (Context) CXXDefaultInitExpr(Empty); 2122 break; 2123 case EXPR_CXX_BIND_TEMPORARY: 2124 S = new (Context) CXXBindTemporaryExpr(Empty); 2125 break; 2126 2127 case EXPR_CXX_SCALAR_VALUE_INIT: 2128 S = new (Context) CXXScalarValueInitExpr(Empty); 2129 break; 2130 case EXPR_CXX_NEW: 2131 S = new (Context) CXXNewExpr(Empty); 2132 break; 2133 case EXPR_CXX_DELETE: 2134 S = new (Context) CXXDeleteExpr(Empty); 2135 break; 2136 case EXPR_CXX_PSEUDO_DESTRUCTOR: 2137 S = new (Context) CXXPseudoDestructorExpr(Empty); 2138 break; 2139 2140 case EXPR_EXPR_WITH_CLEANUPS: 2141 S = ExprWithCleanups::Create(Context, Empty, 2142 Record[ASTStmtReader::NumExprFields]); 2143 break; 2144 2145 case EXPR_CXX_DEPENDENT_SCOPE_MEMBER: 2146 S = CXXDependentScopeMemberExpr::CreateEmpty(Context, 2147 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 2148 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 2149 ? Record[ASTStmtReader::NumExprFields + 1] 2150 : 0); 2151 break; 2152 2153 case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF: 2154 S = DependentScopeDeclRefExpr::CreateEmpty(Context, 2155 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 2156 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 2157 ? Record[ASTStmtReader::NumExprFields + 1] 2158 : 0); 2159 break; 2160 2161 case EXPR_CXX_UNRESOLVED_CONSTRUCT: 2162 S = CXXUnresolvedConstructExpr::CreateEmpty(Context, 2163 /*NumArgs=*/Record[ASTStmtReader::NumExprFields]); 2164 break; 2165 2166 case EXPR_CXX_UNRESOLVED_MEMBER: 2167 S = UnresolvedMemberExpr::CreateEmpty(Context, 2168 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 2169 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 2170 ? Record[ASTStmtReader::NumExprFields + 1] 2171 : 0); 2172 break; 2173 2174 case EXPR_CXX_UNRESOLVED_LOOKUP: 2175 S = UnresolvedLookupExpr::CreateEmpty(Context, 2176 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 2177 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 2178 ? Record[ASTStmtReader::NumExprFields + 1] 2179 : 0); 2180 break; 2181 2182 case EXPR_CXX_UNARY_TYPE_TRAIT: 2183 S = new (Context) UnaryTypeTraitExpr(Empty); 2184 break; 2185 2186 case EXPR_BINARY_TYPE_TRAIT: 2187 S = new (Context) BinaryTypeTraitExpr(Empty); 2188 break; 2189 2190 case EXPR_TYPE_TRAIT: 2191 S = TypeTraitExpr::CreateDeserialized(Context, 2192 Record[ASTStmtReader::NumExprFields]); 2193 break; 2194 2195 case EXPR_ARRAY_TYPE_TRAIT: 2196 S = new (Context) ArrayTypeTraitExpr(Empty); 2197 break; 2198 2199 case EXPR_CXX_EXPRESSION_TRAIT: 2200 S = new (Context) ExpressionTraitExpr(Empty); 2201 break; 2202 2203 case EXPR_CXX_NOEXCEPT: 2204 S = new (Context) CXXNoexceptExpr(Empty); 2205 break; 2206 2207 case EXPR_PACK_EXPANSION: 2208 S = new (Context) PackExpansionExpr(Empty); 2209 break; 2210 2211 case EXPR_SIZEOF_PACK: 2212 S = new (Context) SizeOfPackExpr(Empty); 2213 break; 2214 2215 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM: 2216 S = new (Context) SubstNonTypeTemplateParmExpr(Empty); 2217 break; 2218 2219 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK: 2220 S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty); 2221 break; 2222 2223 case EXPR_FUNCTION_PARM_PACK: 2224 S = FunctionParmPackExpr::CreateEmpty(Context, 2225 Record[ASTStmtReader::NumExprFields]); 2226 break; 2227 2228 case EXPR_MATERIALIZE_TEMPORARY: 2229 S = new (Context) MaterializeTemporaryExpr(Empty); 2230 break; 2231 2232 case EXPR_OPAQUE_VALUE: 2233 S = new (Context) OpaqueValueExpr(Empty); 2234 break; 2235 2236 case EXPR_CUDA_KERNEL_CALL: 2237 S = new (Context) CUDAKernelCallExpr(Context, Empty); 2238 break; 2239 2240 case EXPR_ASTYPE: 2241 S = new (Context) AsTypeExpr(Empty); 2242 break; 2243 2244 case EXPR_PSEUDO_OBJECT: { 2245 unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields]; 2246 S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs); 2247 break; 2248 } 2249 2250 case EXPR_ATOMIC: 2251 S = new (Context) AtomicExpr(Empty); 2252 break; 2253 2254 case EXPR_LAMBDA: { 2255 unsigned NumCaptures = Record[ASTStmtReader::NumExprFields]; 2256 unsigned NumArrayIndexVars = Record[ASTStmtReader::NumExprFields + 1]; 2257 S = LambdaExpr::CreateDeserialized(Context, NumCaptures, 2258 NumArrayIndexVars); 2259 break; 2260 } 2261 } 2262 2263 // We hit a STMT_STOP, so we're done with this expression. 2264 if (Finished) 2265 break; 2266 2267 ++NumStatementsRead; 2268 2269 if (S && !IsStmtReference) { 2270 Reader.Visit(S); 2271 StmtEntries[Cursor.GetCurrentBitNo()] = S; 2272 } 2273 2274 2275 assert(Idx == Record.size() && "Invalid deserialization of statement"); 2276 StmtStack.push_back(S); 2277 } 2278 Done: 2279 assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!"); 2280 assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!"); 2281 return StmtStack.pop_back_val(); 2282 } 2283