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