clang API Documentation

ASTReaderStmt.cpp
Go to the documentation of this file.
00001 //===--- ASTReaderStmt.cpp - Stmt/Expr Deserialization ----------*- C++ -*-===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // Statement/expression deserialization.  This implements the
00011 // ASTReader::ReadStmt method.
00012 //
00013 //===----------------------------------------------------------------------===//
00014 
00015 #include "clang/Serialization/ASTReader.h"
00016 #include "clang/AST/DeclCXX.h"
00017 #include "clang/AST/DeclTemplate.h"
00018 #include "clang/AST/StmtVisitor.h"
00019 #include "llvm/ADT/SmallString.h"
00020 using namespace clang;
00021 using namespace clang::serialization;
00022 
00023 namespace clang {
00024 
00025   class ASTStmtReader : public StmtVisitor<ASTStmtReader> {
00026     typedef ASTReader::RecordData RecordData;
00027     
00028     ASTReader &Reader;
00029     ModuleFile &F;
00030     llvm::BitstreamCursor &DeclsCursor;
00031     const ASTReader::RecordData &Record;
00032     unsigned &Idx;
00033 
00034     SourceLocation ReadSourceLocation(const RecordData &R, unsigned &I) {
00035       return Reader.ReadSourceLocation(F, R, I);
00036     }
00037     
00038     SourceRange ReadSourceRange(const RecordData &R, unsigned &I) {
00039       return Reader.ReadSourceRange(F, R, I);
00040     }
00041     
00042     TypeSourceInfo *GetTypeSourceInfo(const RecordData &R, unsigned &I) {
00043       return Reader.GetTypeSourceInfo(F, R, I);
00044     }
00045     
00046     serialization::DeclID ReadDeclID(const RecordData &R, unsigned &I) {
00047       return Reader.ReadDeclID(F, R, I);
00048     }
00049     
00050     Decl *ReadDecl(const RecordData &R, unsigned &I) {
00051       return Reader.ReadDecl(F, R, I);
00052     }
00053     
00054     template<typename T>
00055     T *ReadDeclAs(const RecordData &R, unsigned &I) {
00056       return Reader.ReadDeclAs<T>(F, R, I);
00057     }
00058 
00059     void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name,
00060                                 const ASTReader::RecordData &R, unsigned &I) {
00061       Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I);
00062     }
00063     
00064     void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo,
00065                                 const ASTReader::RecordData &R, unsigned &I) {
00066       Reader.ReadDeclarationNameInfo(F, NameInfo, R, I);
00067     }
00068 
00069   public:
00070     ASTStmtReader(ASTReader &Reader, ModuleFile &F,
00071                   llvm::BitstreamCursor &Cursor,
00072                   const ASTReader::RecordData &Record, unsigned &Idx)
00073       : Reader(Reader), F(F), DeclsCursor(Cursor), Record(Record), Idx(Idx) { }
00074 
00075     /// \brief The number of record fields required for the Stmt class
00076     /// itself.
00077     static const unsigned NumStmtFields = 0;
00078 
00079     /// \brief The number of record fields required for the Expr class
00080     /// itself.
00081     static const unsigned NumExprFields = NumStmtFields + 7;
00082 
00083     /// \brief Read and initialize a ExplicitTemplateArgumentList structure.
00084     void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,
00085                                    unsigned NumTemplateArgs);
00086     /// \brief Read and initialize a ExplicitTemplateArgumentList structure.
00087     void ReadExplicitTemplateArgumentList(ASTTemplateArgumentListInfo &ArgList,
00088                                           unsigned NumTemplateArgs);
00089 
00090     void VisitStmt(Stmt *S);
00091 #define STMT(Type, Base) \
00092     void Visit##Type(Type *);
00093 #include "clang/AST/StmtNodes.inc"
00094   };
00095 }
00096 
00097 void ASTStmtReader::
00098 ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,
00099                           unsigned NumTemplateArgs) {
00100   SourceLocation TemplateKWLoc = ReadSourceLocation(Record, Idx);
00101   TemplateArgumentListInfo ArgInfo;
00102   ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx));
00103   ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx));
00104   for (unsigned i = 0; i != NumTemplateArgs; ++i)
00105     ArgInfo.addArgument(
00106         Reader.ReadTemplateArgumentLoc(F, Record, Idx));
00107   Args.initializeFrom(TemplateKWLoc, ArgInfo);
00108 }
00109 
00110 void ASTStmtReader::VisitStmt(Stmt *S) {
00111   assert(Idx == NumStmtFields && "Incorrect statement field count");
00112 }
00113 
00114 void ASTStmtReader::VisitNullStmt(NullStmt *S) {
00115   VisitStmt(S);
00116   S->setSemiLoc(ReadSourceLocation(Record, Idx));
00117   S->HasLeadingEmptyMacro = Record[Idx++];
00118 }
00119 
00120 void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) {
00121   VisitStmt(S);
00122   SmallVector<Stmt *, 16> Stmts;
00123   unsigned NumStmts = Record[Idx++];
00124   while (NumStmts--)
00125     Stmts.push_back(Reader.ReadSubStmt());
00126   S->setStmts(Reader.getContext(), Stmts.data(), Stmts.size());
00127   S->setLBracLoc(ReadSourceLocation(Record, Idx));
00128   S->setRBracLoc(ReadSourceLocation(Record, Idx));
00129 }
00130 
00131 void ASTStmtReader::VisitSwitchCase(SwitchCase *S) {
00132   VisitStmt(S);
00133   Reader.RecordSwitchCaseID(S, Record[Idx++]);
00134 }
00135 
00136 void ASTStmtReader::VisitCaseStmt(CaseStmt *S) {
00137   VisitSwitchCase(S);
00138   S->setLHS(Reader.ReadSubExpr());
00139   S->setRHS(Reader.ReadSubExpr());
00140   S->setSubStmt(Reader.ReadSubStmt());
00141   S->setCaseLoc(ReadSourceLocation(Record, Idx));
00142   S->setEllipsisLoc(ReadSourceLocation(Record, Idx));
00143   S->setColonLoc(ReadSourceLocation(Record, Idx));
00144 }
00145 
00146 void ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) {
00147   VisitSwitchCase(S);
00148   S->setSubStmt(Reader.ReadSubStmt());
00149   S->setDefaultLoc(ReadSourceLocation(Record, Idx));
00150   S->setColonLoc(ReadSourceLocation(Record, Idx));
00151 }
00152 
00153 void ASTStmtReader::VisitLabelStmt(LabelStmt *S) {
00154   VisitStmt(S);
00155   LabelDecl *LD = ReadDeclAs<LabelDecl>(Record, Idx);
00156   LD->setStmt(S);
00157   S->setDecl(LD);
00158   S->setSubStmt(Reader.ReadSubStmt());
00159   S->setIdentLoc(ReadSourceLocation(Record, Idx));
00160 }
00161 
00162 void ASTStmtReader::VisitAttributedStmt(AttributedStmt *S) {
00163   VisitStmt(S);
00164   AttrVec Attrs;
00165   Reader.ReadAttributes(F, Attrs, Record, Idx);
00166   S->Attrs = Attrs;
00167   S->SubStmt = Reader.ReadSubStmt();
00168   S->AttrLoc = ReadSourceLocation(Record, Idx);
00169 }
00170 
00171 void ASTStmtReader::VisitIfStmt(IfStmt *S) {
00172   VisitStmt(S);
00173   S->setConditionVariable(Reader.getContext(),
00174                           ReadDeclAs<VarDecl>(Record, Idx));
00175   S->setCond(Reader.ReadSubExpr());
00176   S->setThen(Reader.ReadSubStmt());
00177   S->setElse(Reader.ReadSubStmt());
00178   S->setIfLoc(ReadSourceLocation(Record, Idx));
00179   S->setElseLoc(ReadSourceLocation(Record, Idx));
00180 }
00181 
00182 void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) {
00183   VisitStmt(S);
00184   S->setConditionVariable(Reader.getContext(),
00185                           ReadDeclAs<VarDecl>(Record, Idx));
00186   S->setCond(Reader.ReadSubExpr());
00187   S->setBody(Reader.ReadSubStmt());
00188   S->setSwitchLoc(ReadSourceLocation(Record, Idx));
00189   if (Record[Idx++])
00190     S->setAllEnumCasesCovered();
00191 
00192   SwitchCase *PrevSC = 0;
00193   for (unsigned N = Record.size(); Idx != N; ++Idx) {
00194     SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]);
00195     if (PrevSC)
00196       PrevSC->setNextSwitchCase(SC);
00197     else
00198       S->setSwitchCaseList(SC);
00199 
00200     PrevSC = SC;
00201   }
00202 }
00203 
00204 void ASTStmtReader::VisitWhileStmt(WhileStmt *S) {
00205   VisitStmt(S);
00206   S->setConditionVariable(Reader.getContext(),
00207                           ReadDeclAs<VarDecl>(Record, Idx));
00208 
00209   S->setCond(Reader.ReadSubExpr());
00210   S->setBody(Reader.ReadSubStmt());
00211   S->setWhileLoc(ReadSourceLocation(Record, Idx));
00212 }
00213 
00214 void ASTStmtReader::VisitDoStmt(DoStmt *S) {
00215   VisitStmt(S);
00216   S->setCond(Reader.ReadSubExpr());
00217   S->setBody(Reader.ReadSubStmt());
00218   S->setDoLoc(ReadSourceLocation(Record, Idx));
00219   S->setWhileLoc(ReadSourceLocation(Record, Idx));
00220   S->setRParenLoc(ReadSourceLocation(Record, Idx));
00221 }
00222 
00223 void ASTStmtReader::VisitForStmt(ForStmt *S) {
00224   VisitStmt(S);
00225   S->setInit(Reader.ReadSubStmt());
00226   S->setCond(Reader.ReadSubExpr());
00227   S->setConditionVariable(Reader.getContext(),
00228                           ReadDeclAs<VarDecl>(Record, Idx));
00229   S->setInc(Reader.ReadSubExpr());
00230   S->setBody(Reader.ReadSubStmt());
00231   S->setForLoc(ReadSourceLocation(Record, Idx));
00232   S->setLParenLoc(ReadSourceLocation(Record, Idx));
00233   S->setRParenLoc(ReadSourceLocation(Record, Idx));
00234 }
00235 
00236 void ASTStmtReader::VisitGotoStmt(GotoStmt *S) {
00237   VisitStmt(S);
00238   S->setLabel(ReadDeclAs<LabelDecl>(Record, Idx));
00239   S->setGotoLoc(ReadSourceLocation(Record, Idx));
00240   S->setLabelLoc(ReadSourceLocation(Record, Idx));
00241 }
00242 
00243 void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
00244   VisitStmt(S);
00245   S->setGotoLoc(ReadSourceLocation(Record, Idx));
00246   S->setStarLoc(ReadSourceLocation(Record, Idx));
00247   S->setTarget(Reader.ReadSubExpr());
00248 }
00249 
00250 void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {
00251   VisitStmt(S);
00252   S->setContinueLoc(ReadSourceLocation(Record, Idx));
00253 }
00254 
00255 void ASTStmtReader::VisitBreakStmt(BreakStmt *S) {
00256   VisitStmt(S);
00257   S->setBreakLoc(ReadSourceLocation(Record, Idx));
00258 }
00259 
00260 void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) {
00261   VisitStmt(S);
00262   S->setRetValue(Reader.ReadSubExpr());
00263   S->setReturnLoc(ReadSourceLocation(Record, Idx));
00264   S->setNRVOCandidate(ReadDeclAs<VarDecl>(Record, Idx));
00265 }
00266 
00267 void ASTStmtReader::VisitDeclStmt(DeclStmt *S) {
00268   VisitStmt(S);
00269   S->setStartLoc(ReadSourceLocation(Record, Idx));
00270   S->setEndLoc(ReadSourceLocation(Record, Idx));
00271 
00272   if (Idx + 1 == Record.size()) {
00273     // Single declaration
00274     S->setDeclGroup(DeclGroupRef(ReadDecl(Record, Idx)));
00275   } else {
00276     SmallVector<Decl *, 16> Decls;
00277     Decls.reserve(Record.size() - Idx);    
00278     for (unsigned N = Record.size(); Idx != N; )
00279       Decls.push_back(ReadDecl(Record, Idx));
00280     S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Reader.getContext(),
00281                                                    Decls.data(),
00282                                                    Decls.size())));
00283   }
00284 }
00285 
00286 void ASTStmtReader::VisitAsmStmt(AsmStmt *S) {
00287   VisitStmt(S);
00288   unsigned NumOutputs = Record[Idx++];
00289   unsigned NumInputs = Record[Idx++];
00290   unsigned NumClobbers = Record[Idx++];
00291   S->setAsmLoc(ReadSourceLocation(Record, Idx));
00292   S->setRParenLoc(ReadSourceLocation(Record, Idx));
00293   S->setVolatile(Record[Idx++]);
00294   S->setSimple(Record[Idx++]);
00295   S->setMSAsm(Record[Idx++]);
00296 
00297   S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
00298 
00299   // Outputs and inputs
00300   SmallVector<IdentifierInfo *, 16> Names;
00301   SmallVector<StringLiteral*, 16> Constraints;
00302   SmallVector<Stmt*, 16> Exprs;
00303   for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {
00304     Names.push_back(Reader.GetIdentifierInfo(F, Record, Idx));
00305     Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
00306     Exprs.push_back(Reader.ReadSubStmt());
00307   }
00308 
00309   // Constraints
00310   SmallVector<StringLiteral*, 16> Clobbers;
00311   for (unsigned I = 0; I != NumClobbers; ++I)
00312     Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
00313 
00314   S->setOutputsAndInputsAndClobbers(Reader.getContext(),
00315                                     Names.data(), Constraints.data(), 
00316                                     Exprs.data(), NumOutputs, NumInputs, 
00317                                     Clobbers.data(), NumClobbers);
00318 }
00319 
00320 void ASTStmtReader::VisitExpr(Expr *E) {
00321   VisitStmt(E);
00322   E->setType(Reader.readType(F, Record, Idx));
00323   E->setTypeDependent(Record[Idx++]);
00324   E->setValueDependent(Record[Idx++]);
00325   E->setInstantiationDependent(Record[Idx++]);
00326   E->ExprBits.ContainsUnexpandedParameterPack = Record[Idx++];
00327   E->setValueKind(static_cast<ExprValueKind>(Record[Idx++]));
00328   E->setObjectKind(static_cast<ExprObjectKind>(Record[Idx++]));
00329   assert(Idx == NumExprFields && "Incorrect expression field count");
00330 }
00331 
00332 void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {
00333   VisitExpr(E);
00334   E->setLocation(ReadSourceLocation(Record, Idx));
00335   E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]);
00336 }
00337 
00338 void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {
00339   VisitExpr(E);
00340 
00341   E->DeclRefExprBits.HasQualifier = Record[Idx++];
00342   E->DeclRefExprBits.HasFoundDecl = Record[Idx++];
00343   E->DeclRefExprBits.HasTemplateKWAndArgsInfo = Record[Idx++];
00344   E->DeclRefExprBits.HadMultipleCandidates = Record[Idx++];
00345   E->DeclRefExprBits.RefersToEnclosingLocal = Record[Idx++];
00346   unsigned NumTemplateArgs = 0;
00347   if (E->hasTemplateKWAndArgsInfo())
00348     NumTemplateArgs = Record[Idx++];
00349 
00350   if (E->hasQualifier())
00351     E->getInternalQualifierLoc()
00352       = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
00353 
00354   if (E->hasFoundDecl())
00355     E->getInternalFoundDecl() = ReadDeclAs<NamedDecl>(Record, Idx);
00356 
00357   if (E->hasTemplateKWAndArgsInfo())
00358     ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(),
00359                               NumTemplateArgs);
00360 
00361   E->setDecl(ReadDeclAs<ValueDecl>(Record, Idx));
00362   E->setLocation(ReadSourceLocation(Record, Idx));
00363   ReadDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record, Idx);
00364 }
00365 
00366 void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
00367   VisitExpr(E);
00368   E->setLocation(ReadSourceLocation(Record, Idx));
00369   E->setValue(Reader.getContext(), Reader.ReadAPInt(Record, Idx));
00370 }
00371 
00372 void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {
00373   VisitExpr(E);
00374   E->setValue(Reader.getContext(), Reader.ReadAPFloat(Record, Idx));
00375   E->setExact(Record[Idx++]);
00376   E->setLocation(ReadSourceLocation(Record, Idx));
00377 }
00378 
00379 void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
00380   VisitExpr(E);
00381   E->setSubExpr(Reader.ReadSubExpr());
00382 }
00383 
00384 void ASTStmtReader::VisitStringLiteral(StringLiteral *E) {
00385   VisitExpr(E);
00386   unsigned Len = Record[Idx++];
00387   assert(Record[Idx] == E->getNumConcatenated() &&
00388          "Wrong number of concatenated tokens!");
00389   ++Idx;
00390   StringLiteral::StringKind kind =
00391         static_cast<StringLiteral::StringKind>(Record[Idx++]);
00392   bool isPascal = Record[Idx++];
00393 
00394   // Read string data
00395   SmallString<16> Str(&Record[Idx], &Record[Idx] + Len);
00396   E->setString(Reader.getContext(), Str.str(), kind, isPascal);
00397   Idx += Len;
00398 
00399   // Read source locations
00400   for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
00401     E->setStrTokenLoc(I, ReadSourceLocation(Record, Idx));
00402 }
00403 
00404 void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
00405   VisitExpr(E);
00406   E->setValue(Record[Idx++]);
00407   E->setLocation(ReadSourceLocation(Record, Idx));
00408   E->setKind(static_cast<CharacterLiteral::CharacterKind>(Record[Idx++]));
00409 }
00410 
00411 void ASTStmtReader::VisitParenExpr(ParenExpr *E) {
00412   VisitExpr(E);
00413   E->setLParen(ReadSourceLocation(Record, Idx));
00414   E->setRParen(ReadSourceLocation(Record, Idx));
00415   E->setSubExpr(Reader.ReadSubExpr());
00416 }
00417 
00418 void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {
00419   VisitExpr(E);
00420   unsigned NumExprs = Record[Idx++];
00421   E->Exprs = new (Reader.getContext()) Stmt*[NumExprs];
00422   for (unsigned i = 0; i != NumExprs; ++i)
00423     E->Exprs[i] = Reader.ReadSubStmt();
00424   E->NumExprs = NumExprs;
00425   E->LParenLoc = ReadSourceLocation(Record, Idx);
00426   E->RParenLoc = ReadSourceLocation(Record, Idx);
00427 }
00428 
00429 void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {
00430   VisitExpr(E);
00431   E->setSubExpr(Reader.ReadSubExpr());
00432   E->setOpcode((UnaryOperator::Opcode)Record[Idx++]);
00433   E->setOperatorLoc(ReadSourceLocation(Record, Idx));
00434 }
00435 
00436 void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
00437   typedef OffsetOfExpr::OffsetOfNode Node;
00438   VisitExpr(E);
00439   assert(E->getNumComponents() == Record[Idx]);
00440   ++Idx;
00441   assert(E->getNumExpressions() == Record[Idx]);
00442   ++Idx;
00443   E->setOperatorLoc(ReadSourceLocation(Record, Idx));
00444   E->setRParenLoc(ReadSourceLocation(Record, Idx));
00445   E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
00446   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
00447     Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]);
00448     SourceLocation Start = ReadSourceLocation(Record, Idx);
00449     SourceLocation End = ReadSourceLocation(Record, Idx);
00450     switch (Kind) {
00451     case Node::Array:
00452       E->setComponent(I, Node(Start, Record[Idx++], End));
00453       break;
00454         
00455     case Node::Field:
00456       E->setComponent(I, Node(Start, ReadDeclAs<FieldDecl>(Record, Idx), End));
00457       break;
00458 
00459     case Node::Identifier:
00460       E->setComponent(I, 
00461                       Node(Start, 
00462                            Reader.GetIdentifierInfo(F, Record, Idx),
00463                            End));
00464       break;
00465         
00466     case Node::Base: {
00467       CXXBaseSpecifier *Base = new (Reader.getContext()) CXXBaseSpecifier();
00468       *Base = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
00469       E->setComponent(I, Node(Base));
00470       break;
00471     }
00472     }
00473   }
00474   
00475   for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
00476     E->setIndexExpr(I, Reader.ReadSubExpr());
00477 }
00478 
00479 void ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
00480   VisitExpr(E);
00481   E->setKind(static_cast<UnaryExprOrTypeTrait>(Record[Idx++]));
00482   if (Record[Idx] == 0) {
00483     E->setArgument(Reader.ReadSubExpr());
00484     ++Idx;
00485   } else {
00486     E->setArgument(GetTypeSourceInfo(Record, Idx));
00487   }
00488   E->setOperatorLoc(ReadSourceLocation(Record, Idx));
00489   E->setRParenLoc(ReadSourceLocation(Record, Idx));
00490 }
00491 
00492 void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
00493   VisitExpr(E);
00494   E->setLHS(Reader.ReadSubExpr());
00495   E->setRHS(Reader.ReadSubExpr());
00496   E->setRBracketLoc(ReadSourceLocation(Record, Idx));
00497 }
00498 
00499 void ASTStmtReader::VisitCallExpr(CallExpr *E) {
00500   VisitExpr(E);
00501   E->setNumArgs(Reader.getContext(), Record[Idx++]);
00502   E->setRParenLoc(ReadSourceLocation(Record, Idx));
00503   E->setCallee(Reader.ReadSubExpr());
00504   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
00505     E->setArg(I, Reader.ReadSubExpr());
00506 }
00507 
00508 void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
00509   VisitCallExpr(E);
00510 }
00511 
00512 void ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
00513   // Don't call VisitExpr, this is fully initialized at creation.
00514   assert(E->getStmtClass() == Stmt::MemberExprClass &&
00515          "It's a subclass, we must advance Idx!");
00516 }
00517 
00518 void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
00519   VisitExpr(E);
00520   E->setBase(Reader.ReadSubExpr());
00521   E->setIsaMemberLoc(ReadSourceLocation(Record, Idx));
00522   E->setArrow(Record[Idx++]);
00523 }
00524 
00525 void ASTStmtReader::
00526 VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
00527   VisitExpr(E);
00528   E->Operand = Reader.ReadSubExpr();
00529   E->setShouldCopy(Record[Idx++]);
00530 }
00531 
00532 void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
00533   VisitExplicitCastExpr(E);
00534   E->LParenLoc = ReadSourceLocation(Record, Idx);
00535   E->BridgeKeywordLoc = ReadSourceLocation(Record, Idx);
00536   E->Kind = Record[Idx++];
00537 }
00538 
00539 void ASTStmtReader::VisitCastExpr(CastExpr *E) {
00540   VisitExpr(E);
00541   unsigned NumBaseSpecs = Record[Idx++];
00542   assert(NumBaseSpecs == E->path_size());
00543   E->setSubExpr(Reader.ReadSubExpr());
00544   E->setCastKind((CastExpr::CastKind)Record[Idx++]);
00545   CastExpr::path_iterator BaseI = E->path_begin();
00546   while (NumBaseSpecs--) {
00547     CXXBaseSpecifier *BaseSpec = new (Reader.getContext()) CXXBaseSpecifier;
00548     *BaseSpec = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
00549     *BaseI++ = BaseSpec;
00550   }
00551 }
00552 
00553 void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {
00554   VisitExpr(E);
00555   E->setLHS(Reader.ReadSubExpr());
00556   E->setRHS(Reader.ReadSubExpr());
00557   E->setOpcode((BinaryOperator::Opcode)Record[Idx++]);
00558   E->setOperatorLoc(ReadSourceLocation(Record, Idx));
00559 }
00560 
00561 void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
00562   VisitBinaryOperator(E);
00563   E->setComputationLHSType(Reader.readType(F, Record, Idx));
00564   E->setComputationResultType(Reader.readType(F, Record, Idx));
00565 }
00566 
00567 void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
00568   VisitExpr(E);
00569   E->SubExprs[ConditionalOperator::COND] = Reader.ReadSubExpr();
00570   E->SubExprs[ConditionalOperator::LHS] = Reader.ReadSubExpr();
00571   E->SubExprs[ConditionalOperator::RHS] = Reader.ReadSubExpr();
00572   E->QuestionLoc = ReadSourceLocation(Record, Idx);
00573   E->ColonLoc = ReadSourceLocation(Record, Idx);
00574 }
00575 
00576 void
00577 ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
00578   VisitExpr(E);
00579   E->OpaqueValue = cast<OpaqueValueExpr>(Reader.ReadSubExpr());
00580   E->SubExprs[BinaryConditionalOperator::COMMON] = Reader.ReadSubExpr();
00581   E->SubExprs[BinaryConditionalOperator::COND] = Reader.ReadSubExpr();
00582   E->SubExprs[BinaryConditionalOperator::LHS] = Reader.ReadSubExpr();
00583   E->SubExprs[BinaryConditionalOperator::RHS] = Reader.ReadSubExpr();
00584   E->QuestionLoc = ReadSourceLocation(Record, Idx);
00585   E->ColonLoc = ReadSourceLocation(Record, Idx);
00586 }
00587 
00588 void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
00589   VisitCastExpr(E);
00590 }
00591 
00592 void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
00593   VisitCastExpr(E);
00594   E->setTypeInfoAsWritten(GetTypeSourceInfo(Record, Idx));
00595 }
00596 
00597 void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
00598   VisitExplicitCastExpr(E);
00599   E->setLParenLoc(ReadSourceLocation(Record, Idx));
00600   E->setRParenLoc(ReadSourceLocation(Record, Idx));
00601 }
00602 
00603 void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
00604   VisitExpr(E);
00605   E->setLParenLoc(ReadSourceLocation(Record, Idx));
00606   E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
00607   E->setInitializer(Reader.ReadSubExpr());
00608   E->setFileScope(Record[Idx++]);
00609 }
00610 
00611 void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
00612   VisitExpr(E);
00613   E->setBase(Reader.ReadSubExpr());
00614   E->setAccessor(Reader.GetIdentifierInfo(F, Record, Idx));
00615   E->setAccessorLoc(ReadSourceLocation(Record, Idx));
00616 }
00617 
00618 void ASTStmtReader::VisitInitListExpr(InitListExpr *E) {
00619   VisitExpr(E);
00620   E->setSyntacticForm(cast_or_null<InitListExpr>(Reader.ReadSubStmt()));
00621   E->setLBraceLoc(ReadSourceLocation(Record, Idx));
00622   E->setRBraceLoc(ReadSourceLocation(Record, Idx));
00623   bool isArrayFiller = Record[Idx++];
00624   Expr *filler = 0;
00625   if (isArrayFiller) {
00626     filler = Reader.ReadSubExpr();
00627     E->ArrayFillerOrUnionFieldInit = filler;
00628   } else
00629     E->ArrayFillerOrUnionFieldInit = ReadDeclAs<FieldDecl>(Record, Idx);
00630   E->sawArrayRangeDesignator(Record[Idx++]);
00631   E->setInitializesStdInitializerList(Record[Idx++]);
00632   unsigned NumInits = Record[Idx++];
00633   E->reserveInits(Reader.getContext(), NumInits);
00634   if (isArrayFiller) {
00635     for (unsigned I = 0; I != NumInits; ++I) {
00636       Expr *init = Reader.ReadSubExpr();
00637       E->updateInit(Reader.getContext(), I, init ? init : filler);
00638     }
00639   } else {
00640     for (unsigned I = 0; I != NumInits; ++I)
00641       E->updateInit(Reader.getContext(), I, Reader.ReadSubExpr());
00642   }
00643 }
00644 
00645 void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
00646   typedef DesignatedInitExpr::Designator Designator;
00647 
00648   VisitExpr(E);
00649   unsigned NumSubExprs = Record[Idx++];
00650   assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
00651   for (unsigned I = 0; I != NumSubExprs; ++I)
00652     E->setSubExpr(I, Reader.ReadSubExpr());
00653   E->setEqualOrColonLoc(ReadSourceLocation(Record, Idx));
00654   E->setGNUSyntax(Record[Idx++]);
00655 
00656   SmallVector<Designator, 4> Designators;
00657   while (Idx < Record.size()) {
00658     switch ((DesignatorTypes)Record[Idx++]) {
00659     case DESIG_FIELD_DECL: {
00660       FieldDecl *Field = ReadDeclAs<FieldDecl>(Record, Idx);
00661       SourceLocation DotLoc
00662         = ReadSourceLocation(Record, Idx);
00663       SourceLocation FieldLoc
00664         = ReadSourceLocation(Record, Idx);
00665       Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
00666                                        FieldLoc));
00667       Designators.back().setField(Field);
00668       break;
00669     }
00670 
00671     case DESIG_FIELD_NAME: {
00672       const IdentifierInfo *Name = Reader.GetIdentifierInfo(F, Record, Idx);
00673       SourceLocation DotLoc
00674         = ReadSourceLocation(Record, Idx);
00675       SourceLocation FieldLoc
00676         = ReadSourceLocation(Record, Idx);
00677       Designators.push_back(Designator(Name, DotLoc, FieldLoc));
00678       break;
00679     }
00680 
00681     case DESIG_ARRAY: {
00682       unsigned Index = Record[Idx++];
00683       SourceLocation LBracketLoc
00684         = ReadSourceLocation(Record, Idx);
00685       SourceLocation RBracketLoc
00686         = ReadSourceLocation(Record, Idx);
00687       Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
00688       break;
00689     }
00690 
00691     case DESIG_ARRAY_RANGE: {
00692       unsigned Index = Record[Idx++];
00693       SourceLocation LBracketLoc
00694         = ReadSourceLocation(Record, Idx);
00695       SourceLocation EllipsisLoc
00696         = ReadSourceLocation(Record, Idx);
00697       SourceLocation RBracketLoc
00698         = ReadSourceLocation(Record, Idx);
00699       Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
00700                                        RBracketLoc));
00701       break;
00702     }
00703     }
00704   }
00705   E->setDesignators(Reader.getContext(), 
00706                     Designators.data(), Designators.size());
00707 }
00708 
00709 void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
00710   VisitExpr(E);
00711 }
00712 
00713 void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {
00714   VisitExpr(E);
00715   E->setSubExpr(Reader.ReadSubExpr());
00716   E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx));
00717   E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
00718   E->setRParenLoc(ReadSourceLocation(Record, Idx));
00719 }
00720 
00721 void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
00722   VisitExpr(E);
00723   E->setAmpAmpLoc(ReadSourceLocation(Record, Idx));
00724   E->setLabelLoc(ReadSourceLocation(Record, Idx));
00725   E->setLabel(ReadDeclAs<LabelDecl>(Record, Idx));
00726 }
00727 
00728 void ASTStmtReader::VisitStmtExpr(StmtExpr *E) {
00729   VisitExpr(E);
00730   E->setLParenLoc(ReadSourceLocation(Record, Idx));
00731   E->setRParenLoc(ReadSourceLocation(Record, Idx));
00732   E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt()));
00733 }
00734 
00735 void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {
00736   VisitExpr(E);
00737   E->setCond(Reader.ReadSubExpr());
00738   E->setLHS(Reader.ReadSubExpr());
00739   E->setRHS(Reader.ReadSubExpr());
00740   E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
00741   E->setRParenLoc(ReadSourceLocation(Record, Idx));
00742 }
00743 
00744 void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
00745   VisitExpr(E);
00746   E->setTokenLocation(ReadSourceLocation(Record, Idx));
00747 }
00748 
00749 void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
00750   VisitExpr(E);
00751   SmallVector<Expr *, 16> Exprs;
00752   unsigned NumExprs = Record[Idx++];
00753   while (NumExprs--)
00754     Exprs.push_back(Reader.ReadSubExpr());
00755   E->setExprs(Reader.getContext(), Exprs.data(), Exprs.size());
00756   E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
00757   E->setRParenLoc(ReadSourceLocation(Record, Idx));
00758 }
00759 
00760 void ASTStmtReader::VisitBlockExpr(BlockExpr *E) {
00761   VisitExpr(E);
00762   E->setBlockDecl(ReadDeclAs<BlockDecl>(Record, Idx));
00763 }
00764 
00765 void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
00766   VisitExpr(E);
00767   E->NumAssocs = Record[Idx++];
00768   E->AssocTypes = new (Reader.getContext()) TypeSourceInfo*[E->NumAssocs];
00769   E->SubExprs =
00770    new(Reader.getContext()) Stmt*[GenericSelectionExpr::END_EXPR+E->NumAssocs];
00771 
00772   E->SubExprs[GenericSelectionExpr::CONTROLLING] = Reader.ReadSubExpr();
00773   for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {
00774     E->AssocTypes[I] = GetTypeSourceInfo(Record, Idx);
00775     E->SubExprs[GenericSelectionExpr::END_EXPR+I] = Reader.ReadSubExpr();
00776   }
00777   E->ResultIndex = Record[Idx++];
00778 
00779   E->GenericLoc = ReadSourceLocation(Record, Idx);
00780   E->DefaultLoc = ReadSourceLocation(Record, Idx);
00781   E->RParenLoc = ReadSourceLocation(Record, Idx);
00782 }
00783 
00784 void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
00785   VisitExpr(E);
00786   unsigned numSemanticExprs = Record[Idx++];
00787   assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs);
00788   E->PseudoObjectExprBits.ResultIndex = Record[Idx++];
00789 
00790   // Read the syntactic expression.
00791   E->getSubExprsBuffer()[0] = Reader.ReadSubExpr();
00792 
00793   // Read all the semantic expressions.
00794   for (unsigned i = 0; i != numSemanticExprs; ++i) {
00795     Expr *subExpr = Reader.ReadSubExpr();
00796     E->getSubExprsBuffer()[i+1] = subExpr;
00797   }
00798 }
00799 
00800 void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) {
00801   VisitExpr(E);
00802   E->Op = AtomicExpr::AtomicOp(Record[Idx++]);
00803   E->NumSubExprs = AtomicExpr::getNumSubExprs(E->Op);
00804   for (unsigned I = 0; I != E->NumSubExprs; ++I)
00805     E->SubExprs[I] = Reader.ReadSubExpr();
00806   E->BuiltinLoc = ReadSourceLocation(Record, Idx);
00807   E->RParenLoc = ReadSourceLocation(Record, Idx);
00808 }
00809 
00810 //===----------------------------------------------------------------------===//
00811 // Objective-C Expressions and Statements
00812 
00813 void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
00814   VisitExpr(E);
00815   E->setString(cast<StringLiteral>(Reader.ReadSubStmt()));
00816   E->setAtLoc(ReadSourceLocation(Record, Idx));
00817 }
00818 
00819 void ASTStmtReader::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
00820   VisitExpr(E);
00821   // could be one of several IntegerLiteral, FloatLiteral, etc.
00822   E->SubExpr = Reader.ReadSubStmt();
00823   E->BoxingMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
00824   E->Range = ReadSourceRange(Record, Idx);
00825 }
00826 
00827 void ASTStmtReader::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
00828   VisitExpr(E);
00829   unsigned NumElements = Record[Idx++];
00830   assert(NumElements == E->getNumElements() && "Wrong number of elements");
00831   Expr **Elements = E->getElements();
00832   for (unsigned I = 0, N = NumElements; I != N; ++I)
00833     Elements[I] = Reader.ReadSubExpr();
00834   E->ArrayWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
00835   E->Range = ReadSourceRange(Record, Idx);
00836 }
00837 
00838 void ASTStmtReader::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
00839   VisitExpr(E);
00840   unsigned NumElements = Record[Idx++];
00841   assert(NumElements == E->getNumElements() && "Wrong number of elements");
00842   bool HasPackExpansions = Record[Idx++];
00843   assert(HasPackExpansions == E->HasPackExpansions &&"Pack expansion mismatch");
00844   ObjCDictionaryLiteral::KeyValuePair *KeyValues = E->getKeyValues();
00845   ObjCDictionaryLiteral::ExpansionData *Expansions = E->getExpansionData();
00846   for (unsigned I = 0; I != NumElements; ++I) {
00847     KeyValues[I].Key = Reader.ReadSubExpr();
00848     KeyValues[I].Value = Reader.ReadSubExpr();
00849     if (HasPackExpansions) {
00850       Expansions[I].EllipsisLoc = ReadSourceLocation(Record, Idx);
00851       Expansions[I].NumExpansionsPlusOne = Record[Idx++];
00852     }
00853   }
00854   E->DictWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
00855   E->Range = ReadSourceRange(Record, Idx);
00856 }
00857 
00858 void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
00859   VisitExpr(E);
00860   E->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
00861   E->setAtLoc(ReadSourceLocation(Record, Idx));
00862   E->setRParenLoc(ReadSourceLocation(Record, Idx));
00863 }
00864 
00865 void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
00866   VisitExpr(E);
00867   E->setSelector(Reader.ReadSelector(F, Record, Idx));
00868   E->setAtLoc(ReadSourceLocation(Record, Idx));
00869   E->setRParenLoc(ReadSourceLocation(Record, Idx));
00870 }
00871 
00872 void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
00873   VisitExpr(E);
00874   E->setProtocol(ReadDeclAs<ObjCProtocolDecl>(Record, Idx));
00875   E->setAtLoc(ReadSourceLocation(Record, Idx));
00876   E->ProtoLoc = ReadSourceLocation(Record, Idx);
00877   E->setRParenLoc(ReadSourceLocation(Record, Idx));
00878 }
00879 
00880 void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
00881   VisitExpr(E);
00882   E->setDecl(ReadDeclAs<ObjCIvarDecl>(Record, Idx));
00883   E->setLocation(ReadSourceLocation(Record, Idx));
00884   E->setBase(Reader.ReadSubExpr());
00885   E->setIsArrow(Record[Idx++]);
00886   E->setIsFreeIvar(Record[Idx++]);
00887 }
00888 
00889 void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
00890   VisitExpr(E);
00891   unsigned MethodRefFlags = Record[Idx++];
00892   bool Implicit = Record[Idx++] != 0;
00893   if (Implicit) {
00894     ObjCMethodDecl *Getter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
00895     ObjCMethodDecl *Setter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
00896     E->setImplicitProperty(Getter, Setter, MethodRefFlags);
00897   } else {
00898     E->setExplicitProperty(ReadDeclAs<ObjCPropertyDecl>(Record, Idx),
00899                            MethodRefFlags);
00900   }
00901   E->setLocation(ReadSourceLocation(Record, Idx));
00902   E->setReceiverLocation(ReadSourceLocation(Record, Idx));
00903   switch (Record[Idx++]) {
00904   case 0:
00905     E->setBase(Reader.ReadSubExpr());
00906     break;
00907   case 1:
00908     E->setSuperReceiver(Reader.readType(F, Record, Idx));
00909     break;
00910   case 2:
00911     E->setClassReceiver(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx));
00912     break;
00913   }
00914 }
00915 
00916 void ASTStmtReader::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
00917   VisitExpr(E);
00918   E->setRBracket(ReadSourceLocation(Record, Idx));
00919   E->setBaseExpr(Reader.ReadSubExpr());
00920   E->setKeyExpr(Reader.ReadSubExpr());
00921   E->GetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
00922   E->SetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
00923 }
00924 
00925 void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
00926   VisitExpr(E);
00927   assert(Record[Idx] == E->getNumArgs());
00928   ++Idx;
00929   unsigned NumStoredSelLocs = Record[Idx++];
00930   E->SelLocsKind = Record[Idx++]; 
00931   E->setDelegateInitCall(Record[Idx++]);
00932   E->IsImplicit = Record[Idx++];
00933   ObjCMessageExpr::ReceiverKind Kind
00934     = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
00935   switch (Kind) {
00936   case ObjCMessageExpr::Instance:
00937     E->setInstanceReceiver(Reader.ReadSubExpr());
00938     break;
00939 
00940   case ObjCMessageExpr::Class:
00941     E->setClassReceiver(GetTypeSourceInfo(Record, Idx));
00942     break;
00943 
00944   case ObjCMessageExpr::SuperClass:
00945   case ObjCMessageExpr::SuperInstance: {
00946     QualType T = Reader.readType(F, Record, Idx);
00947     SourceLocation SuperLoc = ReadSourceLocation(Record, Idx);
00948     E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
00949     break;
00950   }
00951   }
00952 
00953   assert(Kind == E->getReceiverKind());
00954 
00955   if (Record[Idx++])
00956     E->setMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx));
00957   else
00958     E->setSelector(Reader.ReadSelector(F, Record, Idx));
00959 
00960   E->LBracLoc = ReadSourceLocation(Record, Idx);
00961   E->RBracLoc = ReadSourceLocation(Record, Idx);
00962 
00963   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
00964     E->setArg(I, Reader.ReadSubExpr());
00965 
00966   SourceLocation *Locs = E->getStoredSelLocs();
00967   for (unsigned I = 0; I != NumStoredSelLocs; ++I)
00968     Locs[I] = ReadSourceLocation(Record, Idx);
00969 }
00970 
00971 void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
00972   VisitStmt(S);
00973   S->setElement(Reader.ReadSubStmt());
00974   S->setCollection(Reader.ReadSubExpr());
00975   S->setBody(Reader.ReadSubStmt());
00976   S->setForLoc(ReadSourceLocation(Record, Idx));
00977   S->setRParenLoc(ReadSourceLocation(Record, Idx));
00978 }
00979 
00980 void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
00981   VisitStmt(S);
00982   S->setCatchBody(Reader.ReadSubStmt());
00983   S->setCatchParamDecl(ReadDeclAs<VarDecl>(Record, Idx));
00984   S->setAtCatchLoc(ReadSourceLocation(Record, Idx));
00985   S->setRParenLoc(ReadSourceLocation(Record, Idx));
00986 }
00987 
00988 void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
00989   VisitStmt(S);
00990   S->setFinallyBody(Reader.ReadSubStmt());
00991   S->setAtFinallyLoc(ReadSourceLocation(Record, Idx));
00992 }
00993 
00994 void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
00995   VisitStmt(S);
00996   S->setSubStmt(Reader.ReadSubStmt());
00997   S->setAtLoc(ReadSourceLocation(Record, Idx));
00998 }
00999 
01000 void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
01001   VisitStmt(S);
01002   assert(Record[Idx] == S->getNumCatchStmts());
01003   ++Idx;
01004   bool HasFinally = Record[Idx++];
01005   S->setTryBody(Reader.ReadSubStmt());
01006   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
01007     S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
01008 
01009   if (HasFinally)
01010     S->setFinallyStmt(Reader.ReadSubStmt());
01011   S->setAtTryLoc(ReadSourceLocation(Record, Idx));
01012 }
01013 
01014 void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
01015   VisitStmt(S);
01016   S->setSynchExpr(Reader.ReadSubStmt());
01017   S->setSynchBody(Reader.ReadSubStmt());
01018   S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx));
01019 }
01020 
01021 void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
01022   VisitStmt(S);
01023   S->setThrowExpr(Reader.ReadSubStmt());
01024   S->setThrowLoc(ReadSourceLocation(Record, Idx));
01025 }
01026 
01027 void ASTStmtReader::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
01028   VisitExpr(E);
01029   E->setValue(Record[Idx++]);
01030   E->setLocation(ReadSourceLocation(Record, Idx));
01031 }
01032 
01033 //===----------------------------------------------------------------------===//
01034 // C++ Expressions and Statements
01035 //===----------------------------------------------------------------------===//
01036 
01037 void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
01038   VisitStmt(S);
01039   S->CatchLoc = ReadSourceLocation(Record, Idx);
01040   S->ExceptionDecl = ReadDeclAs<VarDecl>(Record, Idx);
01041   S->HandlerBlock = Reader.ReadSubStmt();
01042 }
01043 
01044 void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
01045   VisitStmt(S);
01046   assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?");
01047   ++Idx;
01048   S->TryLoc = ReadSourceLocation(Record, Idx);
01049   S->getStmts()[0] = Reader.ReadSubStmt();
01050   for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
01051     S->getStmts()[i + 1] = Reader.ReadSubStmt();
01052 }
01053 
01054 void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
01055   VisitStmt(S);
01056   S->setForLoc(ReadSourceLocation(Record, Idx));
01057   S->setColonLoc(ReadSourceLocation(Record, Idx));
01058   S->setRParenLoc(ReadSourceLocation(Record, Idx));
01059   S->setRangeStmt(Reader.ReadSubStmt());
01060   S->setBeginEndStmt(Reader.ReadSubStmt());
01061   S->setCond(Reader.ReadSubExpr());
01062   S->setInc(Reader.ReadSubExpr());
01063   S->setLoopVarStmt(Reader.ReadSubStmt());
01064   S->setBody(Reader.ReadSubStmt());
01065 }
01066 
01067 void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
01068   VisitStmt(S);
01069   S->KeywordLoc = ReadSourceLocation(Record, Idx);
01070   S->IsIfExists = Record[Idx++];
01071   S->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
01072   ReadDeclarationNameInfo(S->NameInfo, Record, Idx);
01073   S->SubStmt = Reader.ReadSubStmt();
01074 }
01075 
01076 void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
01077   VisitCallExpr(E);
01078   E->Operator = (OverloadedOperatorKind)Record[Idx++];
01079   E->Range = Reader.ReadSourceRange(F, Record, Idx);
01080 }
01081 
01082 void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
01083   VisitExpr(E);
01084   E->NumArgs = Record[Idx++];
01085   if (E->NumArgs)
01086     E->Args = new (Reader.getContext()) Stmt*[E->NumArgs];
01087   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
01088     E->setArg(I, Reader.ReadSubExpr());
01089   E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx));
01090   E->setLocation(ReadSourceLocation(Record, Idx));
01091   E->setElidable(Record[Idx++]);
01092   E->setHadMultipleCandidates(Record[Idx++]);
01093   E->setRequiresZeroInitialization(Record[Idx++]);
01094   E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
01095   E->ParenRange = ReadSourceRange(Record, Idx);
01096 }
01097 
01098 void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
01099   VisitCXXConstructExpr(E);
01100   E->Type = GetTypeSourceInfo(Record, Idx);
01101 }
01102 
01103 void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) {
01104   VisitExpr(E);
01105   unsigned NumCaptures = Record[Idx++];
01106   assert(NumCaptures == E->NumCaptures);(void)NumCaptures;
01107   unsigned NumArrayIndexVars = Record[Idx++];
01108   E->IntroducerRange = ReadSourceRange(Record, Idx);
01109   E->CaptureDefault = static_cast<LambdaCaptureDefault>(Record[Idx++]);
01110   E->ExplicitParams = Record[Idx++];
01111   E->ExplicitResultType = Record[Idx++];
01112   E->ClosingBrace = ReadSourceLocation(Record, Idx);
01113   
01114   // Read capture initializers.
01115   for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),
01116                                       CEnd = E->capture_init_end();
01117        C != CEnd; ++C)
01118     *C = Reader.ReadSubExpr();
01119   
01120   // Read array capture index variables.
01121   if (NumArrayIndexVars > 0) {
01122     unsigned *ArrayIndexStarts = E->getArrayIndexStarts();
01123     for (unsigned I = 0; I != NumCaptures + 1; ++I)
01124       ArrayIndexStarts[I] = Record[Idx++];
01125     
01126     VarDecl **ArrayIndexVars = E->getArrayIndexVars();
01127     for (unsigned I = 0; I != NumArrayIndexVars; ++I)
01128       ArrayIndexVars[I] = ReadDeclAs<VarDecl>(Record, Idx);
01129   }
01130 }
01131 
01132 void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
01133   VisitExplicitCastExpr(E);
01134   SourceRange R = ReadSourceRange(Record, Idx);
01135   E->Loc = R.getBegin();
01136   E->RParenLoc = R.getEnd();
01137 }
01138 
01139 void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
01140   return VisitCXXNamedCastExpr(E);
01141 }
01142 
01143 void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
01144   return VisitCXXNamedCastExpr(E);
01145 }
01146 
01147 void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
01148   return VisitCXXNamedCastExpr(E);
01149 }
01150 
01151 void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
01152   return VisitCXXNamedCastExpr(E);
01153 }
01154 
01155 void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
01156   VisitExplicitCastExpr(E);
01157   E->setTypeBeginLoc(ReadSourceLocation(Record, Idx));
01158   E->setRParenLoc(ReadSourceLocation(Record, Idx));
01159 }
01160 
01161 void ASTStmtReader::VisitUserDefinedLiteral(UserDefinedLiteral *E) {
01162   VisitCallExpr(E);
01163   E->UDSuffixLoc = ReadSourceLocation(Record, Idx);
01164 }
01165 
01166 void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
01167   VisitExpr(E);
01168   E->setValue(Record[Idx++]);
01169   E->setLocation(ReadSourceLocation(Record, Idx));
01170 }
01171 
01172 void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
01173   VisitExpr(E);
01174   E->setLocation(ReadSourceLocation(Record, Idx));
01175 }
01176 
01177 void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
01178   VisitExpr(E);
01179   E->setSourceRange(ReadSourceRange(Record, Idx));
01180   if (E->isTypeOperand()) { // typeid(int)
01181     E->setTypeOperandSourceInfo(
01182         GetTypeSourceInfo(Record, Idx));
01183     return;
01184   }
01185   
01186   // typeid(42+2)
01187   E->setExprOperand(Reader.ReadSubExpr());
01188 }
01189 
01190 void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
01191   VisitExpr(E);
01192   E->setLocation(ReadSourceLocation(Record, Idx));
01193   E->setImplicit(Record[Idx++]);
01194 }
01195 
01196 void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
01197   VisitExpr(E);
01198   E->ThrowLoc = ReadSourceLocation(Record, Idx);
01199   E->Op = Reader.ReadSubExpr();
01200   E->IsThrownVariableInScope = Record[Idx++];
01201 }
01202 
01203 void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
01204   VisitExpr(E);
01205 
01206   assert((bool)Record[Idx] == E->Param.getInt() && "We messed up at creation ?");
01207   ++Idx; // HasOtherExprStored and SubExpr was handled during creation.
01208   E->Param.setPointer(ReadDeclAs<ParmVarDecl>(Record, Idx));
01209   E->Loc = ReadSourceLocation(Record, Idx);
01210 }
01211 
01212 void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
01213   VisitExpr(E);
01214   E->setTemporary(Reader.ReadCXXTemporary(F, Record, Idx));
01215   E->setSubExpr(Reader.ReadSubExpr());
01216 }
01217 
01218 void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
01219   VisitExpr(E);
01220   E->TypeInfo = GetTypeSourceInfo(Record, Idx);
01221   E->RParenLoc = ReadSourceLocation(Record, Idx);
01222 }
01223 
01224 void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
01225   VisitExpr(E);
01226   E->GlobalNew = Record[Idx++];
01227   bool isArray = Record[Idx++];
01228   E->UsualArrayDeleteWantsSize = Record[Idx++];
01229   unsigned NumPlacementArgs = Record[Idx++];
01230   E->StoredInitializationStyle = Record[Idx++];
01231   E->setOperatorNew(ReadDeclAs<FunctionDecl>(Record, Idx));
01232   E->setOperatorDelete(ReadDeclAs<FunctionDecl>(Record, Idx));
01233   E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx);
01234   E->TypeIdParens = ReadSourceRange(Record, Idx);
01235   E->StartLoc = ReadSourceLocation(Record, Idx);
01236   E->DirectInitRange = ReadSourceRange(Record, Idx);
01237 
01238   E->AllocateArgsArray(Reader.getContext(), isArray, NumPlacementArgs,
01239                        E->StoredInitializationStyle != 0);
01240 
01241   // Install all the subexpressions.
01242   for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
01243        I != e; ++I)
01244     *I = Reader.ReadSubStmt();
01245 }
01246 
01247 void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
01248   VisitExpr(E);
01249   E->GlobalDelete = Record[Idx++];
01250   E->ArrayForm = Record[Idx++];
01251   E->ArrayFormAsWritten = Record[Idx++];
01252   E->UsualArrayDeleteWantsSize = Record[Idx++];
01253   E->OperatorDelete = ReadDeclAs<FunctionDecl>(Record, Idx);
01254   E->Argument = Reader.ReadSubExpr();
01255   E->Loc = ReadSourceLocation(Record, Idx);
01256 }
01257 
01258 void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
01259   VisitExpr(E);
01260 
01261   E->Base = Reader.ReadSubExpr();
01262   E->IsArrow = Record[Idx++];
01263   E->OperatorLoc = ReadSourceLocation(Record, Idx);
01264   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
01265   E->ScopeType = GetTypeSourceInfo(Record, Idx);
01266   E->ColonColonLoc = ReadSourceLocation(Record, Idx);
01267   E->TildeLoc = ReadSourceLocation(Record, Idx);
01268   
01269   IdentifierInfo *II = Reader.GetIdentifierInfo(F, Record, Idx);
01270   if (II)
01271     E->setDestroyedType(II, ReadSourceLocation(Record, Idx));
01272   else
01273     E->setDestroyedType(GetTypeSourceInfo(Record, Idx));
01274 }
01275 
01276 void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) {
01277   VisitExpr(E);
01278 
01279   unsigned NumObjects = Record[Idx++];
01280   assert(NumObjects == E->getNumObjects());
01281   for (unsigned i = 0; i != NumObjects; ++i)
01282     E->getObjectsBuffer()[i] = ReadDeclAs<BlockDecl>(Record, Idx);
01283 
01284   E->SubExpr = Reader.ReadSubExpr();
01285 }
01286 
01287 void
01288 ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
01289   VisitExpr(E);
01290 
01291   if (Record[Idx++]) // HasTemplateKWAndArgsInfo
01292     ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(),
01293                               /*NumTemplateArgs=*/Record[Idx++]);
01294 
01295   E->Base = Reader.ReadSubExpr();
01296   E->BaseType = Reader.readType(F, Record, Idx);
01297   E->IsArrow = Record[Idx++];
01298   E->OperatorLoc = ReadSourceLocation(Record, Idx);
01299   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
01300   E->FirstQualifierFoundInScope = ReadDeclAs<NamedDecl>(Record, Idx);
01301   ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx);
01302 }
01303 
01304 void
01305 ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
01306   VisitExpr(E);
01307 
01308   if (Record[Idx++]) // HasTemplateKWAndArgsInfo
01309     ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(),
01310                               /*NumTemplateArgs=*/Record[Idx++]);
01311 
01312   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
01313   ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
01314 }
01315 
01316 void
01317 ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
01318   VisitExpr(E);
01319   assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
01320   ++Idx; // NumArgs;
01321   for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
01322     E->setArg(I, Reader.ReadSubExpr());
01323   E->Type = GetTypeSourceInfo(Record, Idx);
01324   E->setLParenLoc(ReadSourceLocation(Record, Idx));
01325   E->setRParenLoc(ReadSourceLocation(Record, Idx));
01326 }
01327 
01328 void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
01329   VisitExpr(E);
01330 
01331   if (Record[Idx++]) // HasTemplateKWAndArgsInfo
01332     ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(),
01333                               /*NumTemplateArgs=*/Record[Idx++]);
01334 
01335   unsigned NumDecls = Record[Idx++];
01336   UnresolvedSet<8> Decls;
01337   for (unsigned i = 0; i != NumDecls; ++i) {
01338     NamedDecl *D = ReadDeclAs<NamedDecl>(Record, Idx);
01339     AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
01340     Decls.addDecl(D, AS);
01341   }
01342   E->initializeResults(Reader.getContext(), Decls.begin(), Decls.end());
01343 
01344   ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
01345   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
01346 }
01347 
01348 void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
01349   VisitOverloadExpr(E);
01350   E->IsArrow = Record[Idx++];
01351   E->HasUnresolvedUsing = Record[Idx++];
01352   E->Base = Reader.ReadSubExpr();
01353   E->BaseType = Reader.readType(F, Record, Idx);
01354   E->OperatorLoc = ReadSourceLocation(Record, Idx);
01355 }
01356 
01357 void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
01358   VisitOverloadExpr(E);
01359   E->RequiresADL = Record[Idx++];
01360   if (E->RequiresADL)
01361     E->StdIsAssociatedNamespace = Record[Idx++];
01362   E->Overloaded = Record[Idx++];
01363   E->NamingClass = ReadDeclAs<CXXRecordDecl>(Record, Idx);
01364 }
01365 
01366 void ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
01367   VisitExpr(E);
01368   E->UTT = (UnaryTypeTrait)Record[Idx++];
01369   E->Value = (bool)Record[Idx++];
01370   SourceRange Range = ReadSourceRange(Record, Idx);
01371   E->Loc = Range.getBegin();
01372   E->RParen = Range.getEnd();
01373   E->QueriedType = GetTypeSourceInfo(Record, Idx);
01374 }
01375 
01376 void ASTStmtReader::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) {
01377   VisitExpr(E);
01378   E->BTT = (BinaryTypeTrait)Record[Idx++];
01379   E->Value = (bool)Record[Idx++];
01380   SourceRange Range = ReadSourceRange(Record, Idx);
01381   E->Loc = Range.getBegin();
01382   E->RParen = Range.getEnd();
01383   E->LhsType = GetTypeSourceInfo(Record, Idx);
01384   E->RhsType = GetTypeSourceInfo(Record, Idx);
01385 }
01386 
01387 void ASTStmtReader::VisitTypeTraitExpr(TypeTraitExpr *E) {
01388   VisitExpr(E);
01389   E->TypeTraitExprBits.NumArgs = Record[Idx++];
01390   E->TypeTraitExprBits.Kind = Record[Idx++];
01391   E->TypeTraitExprBits.Value = Record[Idx++];
01392   
01393   TypeSourceInfo **Args = E->getTypeSourceInfos();
01394   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
01395     Args[I] = GetTypeSourceInfo(Record, Idx);
01396 }
01397 
01398 void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
01399   VisitExpr(E);
01400   E->ATT = (ArrayTypeTrait)Record[Idx++];
01401   E->Value = (unsigned int)Record[Idx++];
01402   SourceRange Range = ReadSourceRange(Record, Idx);
01403   E->Loc = Range.getBegin();
01404   E->RParen = Range.getEnd();
01405   E->QueriedType = GetTypeSourceInfo(Record, Idx);
01406 }
01407 
01408 void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
01409   VisitExpr(E);
01410   E->ET = (ExpressionTrait)Record[Idx++];
01411   E->Value = (bool)Record[Idx++];
01412   SourceRange Range = ReadSourceRange(Record, Idx);
01413   E->QueriedExpression = Reader.ReadSubExpr();
01414   E->Loc = Range.getBegin();
01415   E->RParen = Range.getEnd();
01416 }
01417 
01418 void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
01419   VisitExpr(E);
01420   E->Value = (bool)Record[Idx++];
01421   E->Range = ReadSourceRange(Record, Idx);
01422   E->Operand = Reader.ReadSubExpr();
01423 }
01424 
01425 void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) {
01426   VisitExpr(E);
01427   E->EllipsisLoc = ReadSourceLocation(Record, Idx);
01428   E->NumExpansions = Record[Idx++];
01429   E->Pattern = Reader.ReadSubExpr();  
01430 }
01431 
01432 void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
01433   VisitExpr(E);
01434   E->OperatorLoc = ReadSourceLocation(Record, Idx);
01435   E->PackLoc = ReadSourceLocation(Record, Idx);
01436   E->RParenLoc = ReadSourceLocation(Record, Idx);
01437   E->Length = Record[Idx++];
01438   E->Pack = ReadDeclAs<NamedDecl>(Record, Idx);
01439 }
01440 
01441 void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr(
01442                                               SubstNonTypeTemplateParmExpr *E) {
01443   VisitExpr(E);
01444   E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
01445   E->NameLoc = ReadSourceLocation(Record, Idx);
01446   E->Replacement = Reader.ReadSubExpr();
01447 }
01448 
01449 void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(
01450                                           SubstNonTypeTemplateParmPackExpr *E) {
01451   VisitExpr(E);
01452   E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
01453   TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx);
01454   if (ArgPack.getKind() != TemplateArgument::Pack)
01455     return;
01456   
01457   E->Arguments = ArgPack.pack_begin();
01458   E->NumArguments = ArgPack.pack_size();
01459   E->NameLoc = ReadSourceLocation(Record, Idx);
01460 }
01461 
01462 void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
01463   VisitExpr(E);
01464   E->Temporary = Reader.ReadSubExpr();
01465 }
01466 
01467 void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
01468   VisitExpr(E);
01469   E->SourceExpr = Reader.ReadSubExpr();
01470   E->Loc = ReadSourceLocation(Record, Idx);
01471 }
01472 
01473 //===----------------------------------------------------------------------===//
01474 // Microsoft Expressions and Statements
01475 //===----------------------------------------------------------------------===//
01476 void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
01477   VisitExpr(E);
01478   E->setSourceRange(ReadSourceRange(Record, Idx));
01479   if (E->isTypeOperand()) { // __uuidof(ComType)
01480     E->setTypeOperandSourceInfo(
01481         GetTypeSourceInfo(Record, Idx));
01482     return;
01483   }
01484   
01485   // __uuidof(expr)
01486   E->setExprOperand(Reader.ReadSubExpr());
01487 }
01488 
01489 void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) {
01490   VisitStmt(S);
01491   S->Loc = ReadSourceLocation(Record, Idx);
01492   S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt();
01493   S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt();
01494 }
01495 
01496 void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
01497   VisitStmt(S);
01498   S->Loc = ReadSourceLocation(Record, Idx);
01499   S->Block = Reader.ReadSubStmt();
01500 }
01501 
01502 void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) {
01503   VisitStmt(S);
01504   S->IsCXXTry = Record[Idx++];
01505   S->TryLoc = ReadSourceLocation(Record, Idx);
01506   S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt();
01507   S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt();
01508 }
01509 
01510 //===----------------------------------------------------------------------===//
01511 // CUDA Expressions and Statements
01512 //===----------------------------------------------------------------------===//
01513 
01514 void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
01515   VisitCallExpr(E);
01516   E->setConfig(cast<CallExpr>(Reader.ReadSubExpr()));
01517 }
01518 
01519 //===----------------------------------------------------------------------===//
01520 // OpenCL Expressions and Statements.
01521 //===----------------------------------------------------------------------===//
01522 void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {
01523   VisitExpr(E);
01524   E->BuiltinLoc = ReadSourceLocation(Record, Idx);
01525   E->RParenLoc = ReadSourceLocation(Record, Idx);
01526   E->SrcExpr = Reader.ReadSubExpr();
01527 }
01528 
01529 //===----------------------------------------------------------------------===//
01530 // ASTReader Implementation
01531 //===----------------------------------------------------------------------===//
01532 
01533 Stmt *ASTReader::ReadStmt(ModuleFile &F) {
01534   switch (ReadingKind) {
01535   case Read_Decl:
01536   case Read_Type:
01537     return ReadStmtFromStream(F);
01538   case Read_Stmt:
01539     return ReadSubStmt();
01540   }
01541 
01542   llvm_unreachable("ReadingKind not set ?");
01543 }
01544 
01545 Expr *ASTReader::ReadExpr(ModuleFile &F) {
01546   return cast_or_null<Expr>(ReadStmt(F));
01547 }
01548 
01549 Expr *ASTReader::ReadSubExpr() {
01550   return cast_or_null<Expr>(ReadSubStmt());
01551 }
01552 
01553 // Within the bitstream, expressions are stored in Reverse Polish
01554 // Notation, with each of the subexpressions preceding the
01555 // expression they are stored in. Subexpressions are stored from last to first.
01556 // To evaluate expressions, we continue reading expressions and placing them on
01557 // the stack, with expressions having operands removing those operands from the
01558 // stack. Evaluation terminates when we see a STMT_STOP record, and
01559 // the single remaining expression on the stack is our result.
01560 Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
01561 
01562   ReadingKindTracker ReadingKind(Read_Stmt, *this);
01563   llvm::BitstreamCursor &Cursor = F.DeclsCursor;
01564   
01565   // Map of offset to previously deserialized stmt. The offset points
01566   /// just after the stmt record.
01567   llvm::DenseMap<uint64_t, Stmt *> StmtEntries;
01568 
01569 #ifndef NDEBUG
01570   unsigned PrevNumStmts = StmtStack.size();
01571 #endif
01572 
01573   RecordData Record;
01574   unsigned Idx;
01575   ASTStmtReader Reader(*this, F, Cursor, Record, Idx);
01576   Stmt::EmptyShell Empty;
01577 
01578   while (true) {
01579     unsigned Code = Cursor.ReadCode();
01580     if (Code == llvm::bitc::END_BLOCK) {
01581       if (Cursor.ReadBlockEnd()) {
01582         Error("error at end of block in AST file");
01583         return 0;
01584       }
01585       break;
01586     }
01587 
01588     if (Code == llvm::bitc::ENTER_SUBBLOCK) {
01589       // No known subblocks, always skip them.
01590       Cursor.ReadSubBlockID();
01591       if (Cursor.SkipBlock()) {
01592         Error("malformed block record in AST file");
01593         return 0;
01594       }
01595       continue;
01596     }
01597 
01598     if (Code == llvm::bitc::DEFINE_ABBREV) {
01599       Cursor.ReadAbbrevRecord();
01600       continue;
01601     }
01602 
01603     Stmt *S = 0;
01604     Idx = 0;
01605     Record.clear();
01606     bool Finished = false;
01607     bool IsStmtReference = false;
01608     switch ((StmtCode)Cursor.ReadRecord(Code, Record)) {
01609     case STMT_STOP:
01610       Finished = true;
01611       break;
01612 
01613     case STMT_REF_PTR:
01614       IsStmtReference = true;
01615       assert(StmtEntries.find(Record[0]) != StmtEntries.end() &&
01616              "No stmt was recorded for this offset reference!");
01617       S = StmtEntries[Record[Idx++]];
01618       break;
01619 
01620     case STMT_NULL_PTR:
01621       S = 0;
01622       break;
01623 
01624     case STMT_NULL:
01625       S = new (Context) NullStmt(Empty);
01626       break;
01627 
01628     case STMT_COMPOUND:
01629       S = new (Context) CompoundStmt(Empty);
01630       break;
01631 
01632     case STMT_CASE:
01633       S = new (Context) CaseStmt(Empty);
01634       break;
01635 
01636     case STMT_DEFAULT:
01637       S = new (Context) DefaultStmt(Empty);
01638       break;
01639 
01640     case STMT_LABEL:
01641       S = new (Context) LabelStmt(Empty);
01642       break;
01643 
01644     case STMT_ATTRIBUTED:
01645       S = new (Context) AttributedStmt(Empty);
01646       break;
01647 
01648     case STMT_IF:
01649       S = new (Context) IfStmt(Empty);
01650       break;
01651 
01652     case STMT_SWITCH:
01653       S = new (Context) SwitchStmt(Empty);
01654       break;
01655 
01656     case STMT_WHILE:
01657       S = new (Context) WhileStmt(Empty);
01658       break;
01659 
01660     case STMT_DO:
01661       S = new (Context) DoStmt(Empty);
01662       break;
01663 
01664     case STMT_FOR:
01665       S = new (Context) ForStmt(Empty);
01666       break;
01667 
01668     case STMT_GOTO:
01669       S = new (Context) GotoStmt(Empty);
01670       break;
01671 
01672     case STMT_INDIRECT_GOTO:
01673       S = new (Context) IndirectGotoStmt(Empty);
01674       break;
01675 
01676     case STMT_CONTINUE:
01677       S = new (Context) ContinueStmt(Empty);
01678       break;
01679 
01680     case STMT_BREAK:
01681       S = new (Context) BreakStmt(Empty);
01682       break;
01683 
01684     case STMT_RETURN:
01685       S = new (Context) ReturnStmt(Empty);
01686       break;
01687 
01688     case STMT_DECL:
01689       S = new (Context) DeclStmt(Empty);
01690       break;
01691 
01692     case STMT_ASM:
01693       S = new (Context) AsmStmt(Empty);
01694       break;
01695 
01696     case EXPR_PREDEFINED:
01697       S = new (Context) PredefinedExpr(Empty);
01698       break;
01699 
01700     case EXPR_DECL_REF:
01701       S = DeclRefExpr::CreateEmpty(
01702         Context,
01703         /*HasQualifier=*/Record[ASTStmtReader::NumExprFields],
01704         /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1],
01705         /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 2],
01706         /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ?
01707           Record[ASTStmtReader::NumExprFields + 5] : 0);
01708       break;
01709 
01710     case EXPR_INTEGER_LITERAL:
01711       S = IntegerLiteral::Create(Context, Empty);
01712       break;
01713 
01714     case EXPR_FLOATING_LITERAL:
01715       S = FloatingLiteral::Create(Context, Empty);
01716       break;
01717 
01718     case EXPR_IMAGINARY_LITERAL:
01719       S = new (Context) ImaginaryLiteral(Empty);
01720       break;
01721 
01722     case EXPR_STRING_LITERAL:
01723       S = StringLiteral::CreateEmpty(Context,
01724                                      Record[ASTStmtReader::NumExprFields + 1]);
01725       break;
01726 
01727     case EXPR_CHARACTER_LITERAL:
01728       S = new (Context) CharacterLiteral(Empty);
01729       break;
01730 
01731     case EXPR_PAREN:
01732       S = new (Context) ParenExpr(Empty);
01733       break;
01734 
01735     case EXPR_PAREN_LIST:
01736       S = new (Context) ParenListExpr(Empty);
01737       break;
01738 
01739     case EXPR_UNARY_OPERATOR:
01740       S = new (Context) UnaryOperator(Empty);
01741       break;
01742 
01743     case EXPR_OFFSETOF:
01744       S = OffsetOfExpr::CreateEmpty(Context, 
01745                                     Record[ASTStmtReader::NumExprFields],
01746                                     Record[ASTStmtReader::NumExprFields + 1]);
01747       break;
01748         
01749     case EXPR_SIZEOF_ALIGN_OF:
01750       S = new (Context) UnaryExprOrTypeTraitExpr(Empty);
01751       break;
01752 
01753     case EXPR_ARRAY_SUBSCRIPT:
01754       S = new (Context) ArraySubscriptExpr(Empty);
01755       break;
01756 
01757     case EXPR_CALL:
01758       S = new (Context) CallExpr(Context, Stmt::CallExprClass, Empty);
01759       break;
01760 
01761     case EXPR_MEMBER: {
01762       // We load everything here and fully initialize it at creation.
01763       // That way we can use MemberExpr::Create and don't have to duplicate its
01764       // logic with a MemberExpr::CreateEmpty.
01765 
01766       assert(Idx == 0);
01767       NestedNameSpecifierLoc QualifierLoc;
01768       if (Record[Idx++]) { // HasQualifier.
01769         QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
01770       }
01771 
01772       SourceLocation TemplateKWLoc;
01773       TemplateArgumentListInfo ArgInfo;
01774       bool HasTemplateKWAndArgsInfo = Record[Idx++];
01775       if (HasTemplateKWAndArgsInfo) {
01776         TemplateKWLoc = ReadSourceLocation(F, Record, Idx);
01777         unsigned NumTemplateArgs = Record[Idx++];
01778         ArgInfo.setLAngleLoc(ReadSourceLocation(F, Record, Idx));
01779         ArgInfo.setRAngleLoc(ReadSourceLocation(F, Record, Idx));
01780         for (unsigned i = 0; i != NumTemplateArgs; ++i)
01781           ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx));
01782       }
01783 
01784       bool HadMultipleCandidates = Record[Idx++];
01785 
01786       NamedDecl *FoundD = ReadDeclAs<NamedDecl>(F, Record, Idx);
01787       AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
01788       DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
01789 
01790       QualType T = readType(F, Record, Idx);
01791       ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]);
01792       ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]);
01793       Expr *Base = ReadSubExpr();
01794       ValueDecl *MemberD = ReadDeclAs<ValueDecl>(F, Record, Idx);
01795       SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx);
01796       DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);
01797       bool IsArrow = Record[Idx++];
01798 
01799       S = MemberExpr::Create(Context, Base, IsArrow, QualifierLoc,
01800                              TemplateKWLoc, MemberD, FoundDecl, MemberNameInfo,
01801                              HasTemplateKWAndArgsInfo ? &ArgInfo : 0,
01802                              T, VK, OK);
01803       ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc,
01804                              MemberD->getDeclName(), Record, Idx);
01805       if (HadMultipleCandidates)
01806         cast<MemberExpr>(S)->setHadMultipleCandidates(true);
01807       break;
01808     }
01809 
01810     case EXPR_BINARY_OPERATOR:
01811       S = new (Context) BinaryOperator(Empty);
01812       break;
01813 
01814     case EXPR_COMPOUND_ASSIGN_OPERATOR:
01815       S = new (Context) CompoundAssignOperator(Empty);
01816       break;
01817 
01818     case EXPR_CONDITIONAL_OPERATOR:
01819       S = new (Context) ConditionalOperator(Empty);
01820       break;
01821 
01822     case EXPR_BINARY_CONDITIONAL_OPERATOR:
01823       S = new (Context) BinaryConditionalOperator(Empty);
01824       break;
01825 
01826     case EXPR_IMPLICIT_CAST:
01827       S = ImplicitCastExpr::CreateEmpty(Context,
01828                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
01829       break;
01830 
01831     case EXPR_CSTYLE_CAST:
01832       S = CStyleCastExpr::CreateEmpty(Context,
01833                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
01834       break;
01835 
01836     case EXPR_COMPOUND_LITERAL:
01837       S = new (Context) CompoundLiteralExpr(Empty);
01838       break;
01839 
01840     case EXPR_EXT_VECTOR_ELEMENT:
01841       S = new (Context) ExtVectorElementExpr(Empty);
01842       break;
01843 
01844     case EXPR_INIT_LIST:
01845       S = new (Context) InitListExpr(getContext(), Empty);
01846       break;
01847 
01848     case EXPR_DESIGNATED_INIT:
01849       S = DesignatedInitExpr::CreateEmpty(Context,
01850                                      Record[ASTStmtReader::NumExprFields] - 1);
01851 
01852       break;
01853 
01854     case EXPR_IMPLICIT_VALUE_INIT:
01855       S = new (Context) ImplicitValueInitExpr(Empty);
01856       break;
01857 
01858     case EXPR_VA_ARG:
01859       S = new (Context) VAArgExpr(Empty);
01860       break;
01861 
01862     case EXPR_ADDR_LABEL:
01863       S = new (Context) AddrLabelExpr(Empty);
01864       break;
01865 
01866     case EXPR_STMT:
01867       S = new (Context) StmtExpr(Empty);
01868       break;
01869 
01870     case EXPR_CHOOSE:
01871       S = new (Context) ChooseExpr(Empty);
01872       break;
01873 
01874     case EXPR_GNU_NULL:
01875       S = new (Context) GNUNullExpr(Empty);
01876       break;
01877 
01878     case EXPR_SHUFFLE_VECTOR:
01879       S = new (Context) ShuffleVectorExpr(Empty);
01880       break;
01881 
01882     case EXPR_BLOCK:
01883       S = new (Context) BlockExpr(Empty);
01884       break;
01885 
01886     case EXPR_GENERIC_SELECTION:
01887       S = new (Context) GenericSelectionExpr(Empty);
01888       break;
01889 
01890     case EXPR_OBJC_STRING_LITERAL:
01891       S = new (Context) ObjCStringLiteral(Empty);
01892       break;
01893     case EXPR_OBJC_BOXED_EXPRESSION:
01894       S = new (Context) ObjCBoxedExpr(Empty);
01895       break;
01896     case EXPR_OBJC_ARRAY_LITERAL:
01897       S = ObjCArrayLiteral::CreateEmpty(Context,
01898                                         Record[ASTStmtReader::NumExprFields]);
01899       break;
01900     case EXPR_OBJC_DICTIONARY_LITERAL:
01901       S = ObjCDictionaryLiteral::CreateEmpty(Context,
01902             Record[ASTStmtReader::NumExprFields],
01903             Record[ASTStmtReader::NumExprFields + 1]);
01904       break;
01905     case EXPR_OBJC_ENCODE:
01906       S = new (Context) ObjCEncodeExpr(Empty);
01907       break;
01908     case EXPR_OBJC_SELECTOR_EXPR:
01909       S = new (Context) ObjCSelectorExpr(Empty);
01910       break;
01911     case EXPR_OBJC_PROTOCOL_EXPR:
01912       S = new (Context) ObjCProtocolExpr(Empty);
01913       break;
01914     case EXPR_OBJC_IVAR_REF_EXPR:
01915       S = new (Context) ObjCIvarRefExpr(Empty);
01916       break;
01917     case EXPR_OBJC_PROPERTY_REF_EXPR:
01918       S = new (Context) ObjCPropertyRefExpr(Empty);
01919       break;
01920     case EXPR_OBJC_SUBSCRIPT_REF_EXPR:
01921       S = new (Context) ObjCSubscriptRefExpr(Empty);
01922       break;
01923     case EXPR_OBJC_KVC_REF_EXPR:
01924       llvm_unreachable("mismatching AST file");
01925     case EXPR_OBJC_MESSAGE_EXPR:
01926       S = ObjCMessageExpr::CreateEmpty(Context,
01927                                      Record[ASTStmtReader::NumExprFields],
01928                                      Record[ASTStmtReader::NumExprFields + 1]);
01929       break;
01930     case EXPR_OBJC_ISA:
01931       S = new (Context) ObjCIsaExpr(Empty);
01932       break;
01933     case EXPR_OBJC_INDIRECT_COPY_RESTORE:
01934       S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);
01935       break;
01936     case EXPR_OBJC_BRIDGED_CAST:
01937       S = new (Context) ObjCBridgedCastExpr(Empty);
01938       break;
01939     case STMT_OBJC_FOR_COLLECTION:
01940       S = new (Context) ObjCForCollectionStmt(Empty);
01941       break;
01942     case STMT_OBJC_CATCH:
01943       S = new (Context) ObjCAtCatchStmt(Empty);
01944       break;
01945     case STMT_OBJC_FINALLY:
01946       S = new (Context) ObjCAtFinallyStmt(Empty);
01947       break;
01948     case STMT_OBJC_AT_TRY:
01949       S = ObjCAtTryStmt::CreateEmpty(Context, 
01950                                      Record[ASTStmtReader::NumStmtFields],
01951                                      Record[ASTStmtReader::NumStmtFields + 1]);
01952       break;
01953     case STMT_OBJC_AT_SYNCHRONIZED:
01954       S = new (Context) ObjCAtSynchronizedStmt(Empty);
01955       break;
01956     case STMT_OBJC_AT_THROW:
01957       S = new (Context) ObjCAtThrowStmt(Empty);
01958       break;
01959     case STMT_OBJC_AUTORELEASE_POOL:
01960       S = new (Context) ObjCAutoreleasePoolStmt(Empty);
01961       break;
01962     case EXPR_OBJC_BOOL_LITERAL:
01963       S = new (Context) ObjCBoolLiteralExpr(Empty);
01964       break;
01965     case STMT_SEH_EXCEPT:
01966       S = new (Context) SEHExceptStmt(Empty);
01967       break;
01968     case STMT_SEH_FINALLY:
01969       S = new (Context) SEHFinallyStmt(Empty);
01970       break;
01971     case STMT_SEH_TRY:
01972       S = new (Context) SEHTryStmt(Empty);
01973       break;
01974     case STMT_CXX_CATCH:
01975       S = new (Context) CXXCatchStmt(Empty);
01976       break;
01977 
01978     case STMT_CXX_TRY:
01979       S = CXXTryStmt::Create(Context, Empty,
01980              /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]);
01981       break;
01982 
01983     case STMT_CXX_FOR_RANGE:
01984       S = new (Context) CXXForRangeStmt(Empty);
01985       break;
01986 
01987     case STMT_MS_DEPENDENT_EXISTS:
01988       S = new (Context) MSDependentExistsStmt(SourceLocation(), true,
01989                                               NestedNameSpecifierLoc(),
01990                                               DeclarationNameInfo(),
01991                                               0);
01992       break;
01993         
01994     case EXPR_CXX_OPERATOR_CALL:
01995       S = new (Context) CXXOperatorCallExpr(Context, Empty);
01996       break;
01997 
01998     case EXPR_CXX_MEMBER_CALL:
01999       S = new (Context) CXXMemberCallExpr(Context, Empty);
02000       break;
02001         
02002     case EXPR_CXX_CONSTRUCT:
02003       S = new (Context) CXXConstructExpr(Empty);
02004       break;
02005       
02006     case EXPR_CXX_TEMPORARY_OBJECT:
02007       S = new (Context) CXXTemporaryObjectExpr(Empty);
02008       break;
02009 
02010     case EXPR_CXX_STATIC_CAST:
02011       S = CXXStaticCastExpr::CreateEmpty(Context,
02012                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
02013       break;
02014 
02015     case EXPR_CXX_DYNAMIC_CAST:
02016       S = CXXDynamicCastExpr::CreateEmpty(Context,
02017                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
02018       break;
02019 
02020     case EXPR_CXX_REINTERPRET_CAST:
02021       S = CXXReinterpretCastExpr::CreateEmpty(Context,
02022                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
02023       break;
02024 
02025     case EXPR_CXX_CONST_CAST:
02026       S = CXXConstCastExpr::CreateEmpty(Context);
02027       break;
02028 
02029     case EXPR_CXX_FUNCTIONAL_CAST:
02030       S = CXXFunctionalCastExpr::CreateEmpty(Context,
02031                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
02032       break;
02033 
02034     case EXPR_USER_DEFINED_LITERAL:
02035       S = new (Context) UserDefinedLiteral(Context, Empty);
02036       break;
02037 
02038     case EXPR_CXX_BOOL_LITERAL:
02039       S = new (Context) CXXBoolLiteralExpr(Empty);
02040       break;
02041 
02042     case EXPR_CXX_NULL_PTR_LITERAL:
02043       S = new (Context) CXXNullPtrLiteralExpr(Empty);
02044       break;
02045     case EXPR_CXX_TYPEID_EXPR:
02046       S = new (Context) CXXTypeidExpr(Empty, true);
02047       break;
02048     case EXPR_CXX_TYPEID_TYPE:
02049       S = new (Context) CXXTypeidExpr(Empty, false);
02050       break;
02051     case EXPR_CXX_UUIDOF_EXPR:
02052       S = new (Context) CXXUuidofExpr(Empty, true);
02053       break;
02054     case EXPR_CXX_UUIDOF_TYPE:
02055       S = new (Context) CXXUuidofExpr(Empty, false);
02056       break;
02057     case EXPR_CXX_THIS:
02058       S = new (Context) CXXThisExpr(Empty);
02059       break;
02060     case EXPR_CXX_THROW:
02061       S = new (Context) CXXThrowExpr(Empty);
02062       break;
02063     case EXPR_CXX_DEFAULT_ARG: {
02064       bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields];
02065       if (HasOtherExprStored) {
02066         Expr *SubExpr = ReadSubExpr();
02067         S = CXXDefaultArgExpr::Create(Context, SourceLocation(), 0, SubExpr);
02068       } else
02069         S = new (Context) CXXDefaultArgExpr(Empty);
02070       break;
02071     }
02072     case EXPR_CXX_BIND_TEMPORARY:
02073       S = new (Context) CXXBindTemporaryExpr(Empty);
02074       break;
02075         
02076     case EXPR_CXX_SCALAR_VALUE_INIT:
02077       S = new (Context) CXXScalarValueInitExpr(Empty);
02078       break;
02079     case EXPR_CXX_NEW:
02080       S = new (Context) CXXNewExpr(Empty);
02081       break;
02082     case EXPR_CXX_DELETE:
02083       S = new (Context) CXXDeleteExpr(Empty);
02084       break;
02085     case EXPR_CXX_PSEUDO_DESTRUCTOR:
02086       S = new (Context) CXXPseudoDestructorExpr(Empty);
02087       break;
02088         
02089     case EXPR_EXPR_WITH_CLEANUPS:
02090       S = ExprWithCleanups::Create(Context, Empty,
02091                                    Record[ASTStmtReader::NumExprFields]);
02092       break;
02093       
02094     case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
02095       S = CXXDependentScopeMemberExpr::CreateEmpty(Context,
02096          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
02097                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
02098                                    ? Record[ASTStmtReader::NumExprFields + 1] 
02099                                    : 0);
02100       break;
02101       
02102     case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
02103       S = DependentScopeDeclRefExpr::CreateEmpty(Context,
02104          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
02105                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
02106                                    ? Record[ASTStmtReader::NumExprFields + 1] 
02107                                    : 0);
02108       break;
02109       
02110     case EXPR_CXX_UNRESOLVED_CONSTRUCT:
02111       S = CXXUnresolvedConstructExpr::CreateEmpty(Context,
02112                               /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
02113       break;
02114       
02115     case EXPR_CXX_UNRESOLVED_MEMBER:
02116       S = UnresolvedMemberExpr::CreateEmpty(Context,
02117          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
02118                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
02119                                    ? Record[ASTStmtReader::NumExprFields + 1] 
02120                                    : 0);
02121       break;
02122       
02123     case EXPR_CXX_UNRESOLVED_LOOKUP:
02124       S = UnresolvedLookupExpr::CreateEmpty(Context,
02125          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
02126                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
02127                                    ? Record[ASTStmtReader::NumExprFields + 1] 
02128                                    : 0);
02129       break;
02130       
02131     case EXPR_CXX_UNARY_TYPE_TRAIT:
02132       S = new (Context) UnaryTypeTraitExpr(Empty);
02133       break;
02134 
02135     case EXPR_BINARY_TYPE_TRAIT:
02136       S = new (Context) BinaryTypeTraitExpr(Empty);
02137       break;
02138 
02139     case EXPR_TYPE_TRAIT:
02140       S = TypeTraitExpr::CreateDeserialized(Context, 
02141             Record[ASTStmtReader::NumExprFields]);
02142       break;
02143         
02144     case EXPR_ARRAY_TYPE_TRAIT:
02145       S = new (Context) ArrayTypeTraitExpr(Empty);
02146       break;
02147 
02148     case EXPR_CXX_EXPRESSION_TRAIT:
02149       S = new (Context) ExpressionTraitExpr(Empty);
02150       break;
02151 
02152     case EXPR_CXX_NOEXCEPT:
02153       S = new (Context) CXXNoexceptExpr(Empty);
02154       break;
02155 
02156     case EXPR_PACK_EXPANSION:
02157       S = new (Context) PackExpansionExpr(Empty);
02158       break;
02159         
02160     case EXPR_SIZEOF_PACK:
02161       S = new (Context) SizeOfPackExpr(Empty);
02162       break;
02163         
02164     case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:
02165       S = new (Context) SubstNonTypeTemplateParmExpr(Empty);
02166       break;
02167         
02168     case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:
02169       S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);
02170       break;
02171         
02172     case EXPR_MATERIALIZE_TEMPORARY:
02173       S = new (Context) MaterializeTemporaryExpr(Empty);
02174       break;
02175         
02176     case EXPR_OPAQUE_VALUE:
02177       S = new (Context) OpaqueValueExpr(Empty);
02178       break;
02179 
02180     case EXPR_CUDA_KERNEL_CALL:
02181       S = new (Context) CUDAKernelCallExpr(Context, Empty);
02182       break;
02183         
02184     case EXPR_ASTYPE:
02185       S = new (Context) AsTypeExpr(Empty);
02186       break;
02187 
02188     case EXPR_PSEUDO_OBJECT: {
02189       unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields];
02190       S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs);
02191       break;
02192     }
02193 
02194     case EXPR_ATOMIC:
02195       S = new (Context) AtomicExpr(Empty);
02196       break;
02197         
02198     case EXPR_LAMBDA: {
02199       unsigned NumCaptures = Record[ASTStmtReader::NumExprFields];
02200       unsigned NumArrayIndexVars = Record[ASTStmtReader::NumExprFields + 1];
02201       S = LambdaExpr::CreateDeserialized(Context, NumCaptures, 
02202                                          NumArrayIndexVars);
02203       break;
02204     }
02205     }
02206     
02207     // We hit a STMT_STOP, so we're done with this expression.
02208     if (Finished)
02209       break;
02210 
02211     ++NumStatementsRead;
02212 
02213     if (S && !IsStmtReference) {
02214       Reader.Visit(S);
02215       StmtEntries[Cursor.GetCurrentBitNo()] = S;
02216     }
02217 
02218 
02219     assert(Idx == Record.size() && "Invalid deserialization of statement");
02220     StmtStack.push_back(S);
02221   }
02222 
02223 #ifndef NDEBUG
02224   assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
02225   assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
02226 #endif
02227 
02228   return StmtStack.pop_back_val();
02229 }