ASTReaderStmt.cpp revision 8538e8d43a3a9bd439c987c0de37bcbf035dd391
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/StmtVisitor.h"
18using namespace clang;
19using namespace clang::serialization;
20
21namespace clang {
22
23  class ASTStmtReader : public StmtVisitor<ASTStmtReader> {
24    ASTReader &Reader;
25    llvm::BitstreamCursor &DeclsCursor;
26    const ASTReader::RecordData &Record;
27    unsigned &Idx;
28
29  public:
30    ASTStmtReader(ASTReader &Reader, llvm::BitstreamCursor &Cursor,
31                  const ASTReader::RecordData &Record, unsigned &Idx)
32      : Reader(Reader), DeclsCursor(Cursor), Record(Record), Idx(Idx) { }
33
34    /// \brief The number of record fields required for the Stmt class
35    /// itself.
36    static const unsigned NumStmtFields = 0;
37
38    /// \brief The number of record fields required for the Expr class
39    /// itself.
40    static const unsigned NumExprFields = NumStmtFields + 3;
41
42    /// \brief Read and initialize a ExplicitTemplateArgumentList structure.
43    void ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
44                                          unsigned NumTemplateArgs);
45
46    void VisitStmt(Stmt *S);
47    void VisitNullStmt(NullStmt *S);
48    void VisitCompoundStmt(CompoundStmt *S);
49    void VisitSwitchCase(SwitchCase *S);
50    void VisitCaseStmt(CaseStmt *S);
51    void VisitDefaultStmt(DefaultStmt *S);
52    void VisitLabelStmt(LabelStmt *S);
53    void VisitIfStmt(IfStmt *S);
54    void VisitSwitchStmt(SwitchStmt *S);
55    void VisitWhileStmt(WhileStmt *S);
56    void VisitDoStmt(DoStmt *S);
57    void VisitForStmt(ForStmt *S);
58    void VisitGotoStmt(GotoStmt *S);
59    void VisitIndirectGotoStmt(IndirectGotoStmt *S);
60    void VisitContinueStmt(ContinueStmt *S);
61    void VisitBreakStmt(BreakStmt *S);
62    void VisitReturnStmt(ReturnStmt *S);
63    void VisitDeclStmt(DeclStmt *S);
64    void VisitAsmStmt(AsmStmt *S);
65    void VisitExpr(Expr *E);
66    void VisitPredefinedExpr(PredefinedExpr *E);
67    void VisitDeclRefExpr(DeclRefExpr *E);
68    void VisitIntegerLiteral(IntegerLiteral *E);
69    void VisitFloatingLiteral(FloatingLiteral *E);
70    void VisitImaginaryLiteral(ImaginaryLiteral *E);
71    void VisitStringLiteral(StringLiteral *E);
72    void VisitCharacterLiteral(CharacterLiteral *E);
73    void VisitParenExpr(ParenExpr *E);
74    void VisitParenListExpr(ParenListExpr *E);
75    void VisitUnaryOperator(UnaryOperator *E);
76    void VisitOffsetOfExpr(OffsetOfExpr *E);
77    void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
78    void VisitArraySubscriptExpr(ArraySubscriptExpr *E);
79    void VisitCallExpr(CallExpr *E);
80    void VisitMemberExpr(MemberExpr *E);
81    void VisitCastExpr(CastExpr *E);
82    void VisitBinaryOperator(BinaryOperator *E);
83    void VisitCompoundAssignOperator(CompoundAssignOperator *E);
84    void VisitConditionalOperator(ConditionalOperator *E);
85    void VisitImplicitCastExpr(ImplicitCastExpr *E);
86    void VisitExplicitCastExpr(ExplicitCastExpr *E);
87    void VisitCStyleCastExpr(CStyleCastExpr *E);
88    void VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
89    void VisitExtVectorElementExpr(ExtVectorElementExpr *E);
90    void VisitInitListExpr(InitListExpr *E);
91    void VisitDesignatedInitExpr(DesignatedInitExpr *E);
92    void VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
93    void VisitVAArgExpr(VAArgExpr *E);
94    void VisitAddrLabelExpr(AddrLabelExpr *E);
95    void VisitStmtExpr(StmtExpr *E);
96    void VisitTypesCompatibleExpr(TypesCompatibleExpr *E);
97    void VisitChooseExpr(ChooseExpr *E);
98    void VisitGNUNullExpr(GNUNullExpr *E);
99    void VisitShuffleVectorExpr(ShuffleVectorExpr *E);
100    void VisitBlockExpr(BlockExpr *E);
101    void VisitBlockDeclRefExpr(BlockDeclRefExpr *E);
102    void VisitObjCStringLiteral(ObjCStringLiteral *E);
103    void VisitObjCEncodeExpr(ObjCEncodeExpr *E);
104    void VisitObjCSelectorExpr(ObjCSelectorExpr *E);
105    void VisitObjCProtocolExpr(ObjCProtocolExpr *E);
106    void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E);
107    void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E);
108    void VisitObjCImplicitSetterGetterRefExpr(
109                            ObjCImplicitSetterGetterRefExpr *E);
110    void VisitObjCMessageExpr(ObjCMessageExpr *E);
111    void VisitObjCSuperExpr(ObjCSuperExpr *E);
112    void VisitObjCIsaExpr(ObjCIsaExpr *E);
113
114    void VisitObjCForCollectionStmt(ObjCForCollectionStmt *);
115    void VisitObjCAtCatchStmt(ObjCAtCatchStmt *);
116    void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *);
117    void VisitObjCAtTryStmt(ObjCAtTryStmt *);
118    void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *);
119    void VisitObjCAtThrowStmt(ObjCAtThrowStmt *);
120
121    // C++ Statements
122    void VisitCXXCatchStmt(CXXCatchStmt *S);
123    void VisitCXXTryStmt(CXXTryStmt *S);
124
125    void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
126    void VisitCXXConstructExpr(CXXConstructExpr *E);
127    void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
128    void VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
129    void VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
130    void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
131    void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
132    void VisitCXXConstCastExpr(CXXConstCastExpr *E);
133    void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
134    void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
135    void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
136    void VisitCXXTypeidExpr(CXXTypeidExpr *E);
137    void VisitCXXThisExpr(CXXThisExpr *E);
138    void VisitCXXThrowExpr(CXXThrowExpr *E);
139    void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
140    void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
141    void VisitCXXBindReferenceExpr(CXXBindReferenceExpr *E);
142
143    void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
144    void VisitCXXNewExpr(CXXNewExpr *E);
145    void VisitCXXDeleteExpr(CXXDeleteExpr *E);
146    void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
147
148    void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
149
150    void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
151    void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
152    void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
153
154    void VisitOverloadExpr(OverloadExpr *E);
155    void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
156    void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
157
158    void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E);
159  };
160}
161
162void ASTStmtReader::
163ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
164                                 unsigned NumTemplateArgs) {
165  TemplateArgumentListInfo ArgInfo;
166  ArgInfo.setLAngleLoc(Reader.ReadSourceLocation(Record, Idx));
167  ArgInfo.setRAngleLoc(Reader.ReadSourceLocation(Record, Idx));
168  for (unsigned i = 0; i != NumTemplateArgs; ++i)
169    ArgInfo.addArgument(
170        Reader.ReadTemplateArgumentLoc(DeclsCursor, Record, Idx));
171  ArgList.initializeFrom(ArgInfo);
172}
173
174void ASTStmtReader::VisitStmt(Stmt *S) {
175  assert(Idx == NumStmtFields && "Incorrect statement field count");
176}
177
178void ASTStmtReader::VisitNullStmt(NullStmt *S) {
179  VisitStmt(S);
180  S->setSemiLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
181}
182
183void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) {
184  VisitStmt(S);
185  llvm::SmallVector<Stmt *, 16> Stmts;
186  unsigned NumStmts = Record[Idx++];
187  while (NumStmts--)
188    Stmts.push_back(Reader.ReadSubStmt());
189  S->setStmts(*Reader.getContext(), Stmts.data(), Stmts.size());
190  S->setLBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
191  S->setRBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
192}
193
194void ASTStmtReader::VisitSwitchCase(SwitchCase *S) {
195  VisitStmt(S);
196  Reader.RecordSwitchCaseID(S, Record[Idx++]);
197}
198
199void ASTStmtReader::VisitCaseStmt(CaseStmt *S) {
200  VisitSwitchCase(S);
201  S->setLHS(Reader.ReadSubExpr());
202  S->setRHS(Reader.ReadSubExpr());
203  S->setSubStmt(Reader.ReadSubStmt());
204  S->setCaseLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
205  S->setEllipsisLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
206  S->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
207}
208
209void ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) {
210  VisitSwitchCase(S);
211  S->setSubStmt(Reader.ReadSubStmt());
212  S->setDefaultLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
213  S->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
214}
215
216void ASTStmtReader::VisitLabelStmt(LabelStmt *S) {
217  VisitStmt(S);
218  S->setID(Reader.GetIdentifierInfo(Record, Idx));
219  S->setSubStmt(Reader.ReadSubStmt());
220  S->setIdentLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
221  Reader.RecordLabelStmt(S, Record[Idx++]);
222}
223
224void ASTStmtReader::VisitIfStmt(IfStmt *S) {
225  VisitStmt(S);
226  S->setConditionVariable(*Reader.getContext(),
227                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
228  S->setCond(Reader.ReadSubExpr());
229  S->setThen(Reader.ReadSubStmt());
230  S->setElse(Reader.ReadSubStmt());
231  S->setIfLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
232  S->setElseLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
233}
234
235void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) {
236  VisitStmt(S);
237  S->setConditionVariable(*Reader.getContext(),
238                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
239  S->setCond(Reader.ReadSubExpr());
240  S->setBody(Reader.ReadSubStmt());
241  S->setSwitchLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
242  SwitchCase *PrevSC = 0;
243  for (unsigned N = Record.size(); Idx != N; ++Idx) {
244    SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]);
245    if (PrevSC)
246      PrevSC->setNextSwitchCase(SC);
247    else
248      S->setSwitchCaseList(SC);
249
250    // Retain this SwitchCase, since SwitchStmt::addSwitchCase() would
251    // normally retain it (but we aren't calling addSwitchCase).
252    SC->Retain();
253    PrevSC = SC;
254  }
255}
256
257void ASTStmtReader::VisitWhileStmt(WhileStmt *S) {
258  VisitStmt(S);
259  S->setConditionVariable(*Reader.getContext(),
260                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
261  S->setCond(Reader.ReadSubExpr());
262  S->setBody(Reader.ReadSubStmt());
263  S->setWhileLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
264}
265
266void ASTStmtReader::VisitDoStmt(DoStmt *S) {
267  VisitStmt(S);
268  S->setCond(Reader.ReadSubExpr());
269  S->setBody(Reader.ReadSubStmt());
270  S->setDoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
271  S->setWhileLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
272  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
273}
274
275void ASTStmtReader::VisitForStmt(ForStmt *S) {
276  VisitStmt(S);
277  S->setInit(Reader.ReadSubStmt());
278  S->setCond(Reader.ReadSubExpr());
279  S->setConditionVariable(*Reader.getContext(),
280                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
281  S->setInc(Reader.ReadSubExpr());
282  S->setBody(Reader.ReadSubStmt());
283  S->setForLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
284  S->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
285  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
286}
287
288void ASTStmtReader::VisitGotoStmt(GotoStmt *S) {
289  VisitStmt(S);
290  Reader.SetLabelOf(S, Record[Idx++]);
291  S->setGotoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
292  S->setLabelLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
293}
294
295void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
296  VisitStmt(S);
297  S->setGotoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
298  S->setStarLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
299  S->setTarget(Reader.ReadSubExpr());
300}
301
302void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {
303  VisitStmt(S);
304  S->setContinueLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
305}
306
307void ASTStmtReader::VisitBreakStmt(BreakStmt *S) {
308  VisitStmt(S);
309  S->setBreakLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
310}
311
312void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) {
313  VisitStmt(S);
314  S->setRetValue(Reader.ReadSubExpr());
315  S->setReturnLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
316  S->setNRVOCandidate(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
317}
318
319void ASTStmtReader::VisitDeclStmt(DeclStmt *S) {
320  VisitStmt(S);
321  S->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
322  S->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
323
324  if (Idx + 1 == Record.size()) {
325    // Single declaration
326    S->setDeclGroup(DeclGroupRef(Reader.GetDecl(Record[Idx++])));
327  } else {
328    llvm::SmallVector<Decl *, 16> Decls;
329    Decls.reserve(Record.size() - Idx);
330    for (unsigned N = Record.size(); Idx != N; ++Idx)
331      Decls.push_back(Reader.GetDecl(Record[Idx]));
332    S->setDeclGroup(DeclGroupRef(DeclGroup::Create(*Reader.getContext(),
333                                                   Decls.data(),
334                                                   Decls.size())));
335  }
336}
337
338void ASTStmtReader::VisitAsmStmt(AsmStmt *S) {
339  VisitStmt(S);
340  unsigned NumOutputs = Record[Idx++];
341  unsigned NumInputs = Record[Idx++];
342  unsigned NumClobbers = Record[Idx++];
343  S->setAsmLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
344  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
345  S->setVolatile(Record[Idx++]);
346  S->setSimple(Record[Idx++]);
347  S->setMSAsm(Record[Idx++]);
348
349  S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
350
351  // Outputs and inputs
352  llvm::SmallVector<IdentifierInfo *, 16> Names;
353  llvm::SmallVector<StringLiteral*, 16> Constraints;
354  llvm::SmallVector<Stmt*, 16> Exprs;
355  for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {
356    Names.push_back(Reader.GetIdentifierInfo(Record, Idx));
357    Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
358    Exprs.push_back(Reader.ReadSubStmt());
359  }
360
361  // Constraints
362  llvm::SmallVector<StringLiteral*, 16> Clobbers;
363  for (unsigned I = 0; I != NumClobbers; ++I)
364    Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
365
366  S->setOutputsAndInputsAndClobbers(*Reader.getContext(),
367                                    Names.data(), Constraints.data(),
368                                    Exprs.data(), NumOutputs, NumInputs,
369                                    Clobbers.data(), NumClobbers);
370}
371
372void ASTStmtReader::VisitExpr(Expr *E) {
373  VisitStmt(E);
374  E->setType(Reader.GetType(Record[Idx++]));
375  E->setTypeDependent(Record[Idx++]);
376  E->setValueDependent(Record[Idx++]);
377  assert(Idx == NumExprFields && "Incorrect expression field count");
378}
379
380void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {
381  VisitExpr(E);
382  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
383  E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]);
384}
385
386void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {
387  VisitExpr(E);
388
389  bool HasQualifier = Record[Idx++];
390  unsigned NumTemplateArgs = Record[Idx++];
391
392  E->DecoratedD.setInt((HasQualifier? DeclRefExpr::HasQualifierFlag : 0) |
393      (NumTemplateArgs ? DeclRefExpr::HasExplicitTemplateArgumentListFlag : 0));
394
395  if (HasQualifier) {
396    E->getNameQualifier()->NNS = Reader.ReadNestedNameSpecifier(Record, Idx);
397    E->getNameQualifier()->Range = Reader.ReadSourceRange(Record, Idx);
398  }
399
400  if (NumTemplateArgs)
401    ReadExplicitTemplateArgumentList(*E->getExplicitTemplateArgumentList(),
402                                     NumTemplateArgs);
403
404  E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++])));
405  // FIXME: read DeclarationNameLoc.
406  E->setLocation(Reader.ReadSourceLocation(Record, Idx));
407}
408
409void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
410  VisitExpr(E);
411  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
412  E->setValue(Reader.ReadAPInt(Record, Idx));
413}
414
415void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {
416  VisitExpr(E);
417  E->setValue(Reader.ReadAPFloat(Record, Idx));
418  E->setExact(Record[Idx++]);
419  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
420}
421
422void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
423  VisitExpr(E);
424  E->setSubExpr(Reader.ReadSubExpr());
425}
426
427void ASTStmtReader::VisitStringLiteral(StringLiteral *E) {
428  VisitExpr(E);
429  unsigned Len = Record[Idx++];
430  assert(Record[Idx] == E->getNumConcatenated() &&
431         "Wrong number of concatenated tokens!");
432  ++Idx;
433  E->setWide(Record[Idx++]);
434
435  // Read string data
436  llvm::SmallString<16> Str(&Record[Idx], &Record[Idx] + Len);
437  E->setString(*Reader.getContext(), Str.str());
438  Idx += Len;
439
440  // Read source locations
441  for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
442    E->setStrTokenLoc(I, SourceLocation::getFromRawEncoding(Record[Idx++]));
443}
444
445void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
446  VisitExpr(E);
447  E->setValue(Record[Idx++]);
448  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
449  E->setWide(Record[Idx++]);
450}
451
452void ASTStmtReader::VisitParenExpr(ParenExpr *E) {
453  VisitExpr(E);
454  E->setLParen(SourceLocation::getFromRawEncoding(Record[Idx++]));
455  E->setRParen(SourceLocation::getFromRawEncoding(Record[Idx++]));
456  E->setSubExpr(Reader.ReadSubExpr());
457}
458
459void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {
460  VisitExpr(E);
461  unsigned NumExprs = Record[Idx++];
462  E->Exprs = new (*Reader.getContext()) Stmt*[NumExprs];
463  for (unsigned i = 0; i != NumExprs; ++i)
464    E->Exprs[i] = Reader.ReadSubStmt();
465  E->NumExprs = NumExprs;
466  E->LParenLoc = Reader.ReadSourceLocation(Record, Idx);
467  E->RParenLoc = Reader.ReadSourceLocation(Record, Idx);
468}
469
470void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {
471  VisitExpr(E);
472  E->setSubExpr(Reader.ReadSubExpr());
473  E->setOpcode((UnaryOperator::Opcode)Record[Idx++]);
474  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
475}
476
477void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
478  typedef OffsetOfExpr::OffsetOfNode Node;
479  VisitExpr(E);
480  assert(E->getNumComponents() == Record[Idx]);
481  ++Idx;
482  assert(E->getNumExpressions() == Record[Idx]);
483  ++Idx;
484  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
485  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
486  E->setTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
487  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
488    Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]);
489    SourceLocation Start = SourceLocation::getFromRawEncoding(Record[Idx++]);
490    SourceLocation End = SourceLocation::getFromRawEncoding(Record[Idx++]);
491    switch (Kind) {
492    case Node::Array:
493      E->setComponent(I, Node(Start, Record[Idx++], End));
494      break;
495
496    case Node::Field:
497      E->setComponent(I,
498             Node(Start,
499                  dyn_cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])),
500                  End));
501      break;
502
503    case Node::Identifier:
504      E->setComponent(I, Node(Start, Reader.GetIdentifier(Record[Idx++]), End));
505      break;
506
507    case Node::Base: {
508      CXXBaseSpecifier *Base = new (*Reader.getContext()) CXXBaseSpecifier();
509      *Base = Reader.ReadCXXBaseSpecifier(DeclsCursor, Record, Idx);
510      E->setComponent(I, Node(Base));
511      break;
512    }
513    }
514  }
515
516  for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
517    E->setIndexExpr(I, Reader.ReadSubExpr());
518}
519
520void ASTStmtReader::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
521  VisitExpr(E);
522  E->setSizeof(Record[Idx++]);
523  if (Record[Idx] == 0) {
524    E->setArgument(Reader.ReadSubExpr());
525    ++Idx;
526  } else {
527    E->setArgument(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
528  }
529  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
530  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
531}
532
533void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
534  VisitExpr(E);
535  E->setLHS(Reader.ReadSubExpr());
536  E->setRHS(Reader.ReadSubExpr());
537  E->setRBracketLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
538}
539
540void ASTStmtReader::VisitCallExpr(CallExpr *E) {
541  VisitExpr(E);
542  E->setNumArgs(*Reader.getContext(), Record[Idx++]);
543  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
544  E->setCallee(Reader.ReadSubExpr());
545  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
546    E->setArg(I, Reader.ReadSubExpr());
547}
548
549void ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
550  // Don't call VisitExpr, this is fully initialized at creation.
551  assert(E->getStmtClass() == Stmt::MemberExprClass &&
552         "It's a subclass, we must advance Idx!");
553}
554
555void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
556  VisitExpr(E);
557  E->setBase(Reader.ReadSubExpr());
558  E->setIsaMemberLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
559  E->setArrow(Record[Idx++]);
560}
561
562void ASTStmtReader::VisitCastExpr(CastExpr *E) {
563  VisitExpr(E);
564  unsigned NumBaseSpecs = Record[Idx++];
565  assert(NumBaseSpecs == E->path_size());
566  E->setSubExpr(Reader.ReadSubExpr());
567  E->setCastKind((CastExpr::CastKind)Record[Idx++]);
568  CastExpr::path_iterator BaseI = E->path_begin();
569  while (NumBaseSpecs--) {
570    CXXBaseSpecifier *BaseSpec = new (*Reader.getContext()) CXXBaseSpecifier;
571    *BaseSpec = Reader.ReadCXXBaseSpecifier(DeclsCursor, Record, Idx);
572    *BaseI++ = BaseSpec;
573  }
574}
575
576void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {
577  VisitExpr(E);
578  E->setLHS(Reader.ReadSubExpr());
579  E->setRHS(Reader.ReadSubExpr());
580  E->setOpcode((BinaryOperator::Opcode)Record[Idx++]);
581  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
582}
583
584void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
585  VisitBinaryOperator(E);
586  E->setComputationLHSType(Reader.GetType(Record[Idx++]));
587  E->setComputationResultType(Reader.GetType(Record[Idx++]));
588}
589
590void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
591  VisitExpr(E);
592  E->setCond(Reader.ReadSubExpr());
593  E->setLHS(Reader.ReadSubExpr());
594  E->setRHS(Reader.ReadSubExpr());
595  E->setQuestionLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
596  E->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
597}
598
599void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
600  VisitCastExpr(E);
601  E->setCategory(static_cast<ImplicitCastExpr::ResultCategory>(Record[Idx++]));
602}
603
604void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
605  VisitCastExpr(E);
606  E->setTypeInfoAsWritten(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
607}
608
609void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
610  VisitExplicitCastExpr(E);
611  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
612  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
613}
614
615void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
616  VisitExpr(E);
617  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
618  E->setTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
619  E->setInitializer(Reader.ReadSubExpr());
620  E->setFileScope(Record[Idx++]);
621}
622
623void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
624  VisitExpr(E);
625  E->setBase(Reader.ReadSubExpr());
626  E->setAccessor(Reader.GetIdentifierInfo(Record, Idx));
627  E->setAccessorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
628}
629
630void ASTStmtReader::VisitInitListExpr(InitListExpr *E) {
631  VisitExpr(E);
632  unsigned NumInits = Record[Idx++];
633  E->reserveInits(*Reader.getContext(), NumInits);
634  for (unsigned I = 0; I != NumInits; ++I)
635    E->updateInit(*Reader.getContext(), I, Reader.ReadSubExpr());
636  E->setSyntacticForm(cast_or_null<InitListExpr>(Reader.ReadSubStmt()));
637  E->setLBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
638  E->setRBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
639  E->setInitializedFieldInUnion(
640                      cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])));
641  E->sawArrayRangeDesignator(Record[Idx++]);
642}
643
644void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
645  typedef DesignatedInitExpr::Designator Designator;
646
647  VisitExpr(E);
648  unsigned NumSubExprs = Record[Idx++];
649  assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
650  for (unsigned I = 0; I != NumSubExprs; ++I)
651    E->setSubExpr(I, Reader.ReadSubExpr());
652  E->setEqualOrColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
653  E->setGNUSyntax(Record[Idx++]);
654
655  llvm::SmallVector<Designator, 4> Designators;
656  while (Idx < Record.size()) {
657    switch ((DesignatorTypes)Record[Idx++]) {
658    case DESIG_FIELD_DECL: {
659      FieldDecl *Field = cast<FieldDecl>(Reader.GetDecl(Record[Idx++]));
660      SourceLocation DotLoc
661        = SourceLocation::getFromRawEncoding(Record[Idx++]);
662      SourceLocation FieldLoc
663        = SourceLocation::getFromRawEncoding(Record[Idx++]);
664      Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
665                                       FieldLoc));
666      Designators.back().setField(Field);
667      break;
668    }
669
670    case DESIG_FIELD_NAME: {
671      const IdentifierInfo *Name = Reader.GetIdentifierInfo(Record, Idx);
672      SourceLocation DotLoc
673        = SourceLocation::getFromRawEncoding(Record[Idx++]);
674      SourceLocation FieldLoc
675        = SourceLocation::getFromRawEncoding(Record[Idx++]);
676      Designators.push_back(Designator(Name, DotLoc, FieldLoc));
677      break;
678    }
679
680    case DESIG_ARRAY: {
681      unsigned Index = Record[Idx++];
682      SourceLocation LBracketLoc
683        = SourceLocation::getFromRawEncoding(Record[Idx++]);
684      SourceLocation RBracketLoc
685        = SourceLocation::getFromRawEncoding(Record[Idx++]);
686      Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
687      break;
688    }
689
690    case DESIG_ARRAY_RANGE: {
691      unsigned Index = Record[Idx++];
692      SourceLocation LBracketLoc
693        = SourceLocation::getFromRawEncoding(Record[Idx++]);
694      SourceLocation EllipsisLoc
695        = SourceLocation::getFromRawEncoding(Record[Idx++]);
696      SourceLocation RBracketLoc
697        = SourceLocation::getFromRawEncoding(Record[Idx++]);
698      Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
699                                       RBracketLoc));
700      break;
701    }
702    }
703  }
704  E->setDesignators(*Reader.getContext(),
705                    Designators.data(), Designators.size());
706}
707
708void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
709  VisitExpr(E);
710}
711
712void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {
713  VisitExpr(E);
714  E->setSubExpr(Reader.ReadSubExpr());
715  E->setWrittenTypeInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
716  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
717  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
718}
719
720void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
721  VisitExpr(E);
722  E->setAmpAmpLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
723  E->setLabelLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
724  Reader.SetLabelOf(E, Record[Idx++]);
725}
726
727void ASTStmtReader::VisitStmtExpr(StmtExpr *E) {
728  VisitExpr(E);
729  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
730  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
731  E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt()));
732}
733
734void ASTStmtReader::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
735  VisitExpr(E);
736  E->setArgTInfo1(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
737  E->setArgTInfo2(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
738  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
739  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
740}
741
742void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {
743  VisitExpr(E);
744  E->setCond(Reader.ReadSubExpr());
745  E->setLHS(Reader.ReadSubExpr());
746  E->setRHS(Reader.ReadSubExpr());
747  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
748  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
749}
750
751void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
752  VisitExpr(E);
753  E->setTokenLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
754}
755
756void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
757  VisitExpr(E);
758  llvm::SmallVector<Expr *, 16> Exprs;
759  unsigned NumExprs = Record[Idx++];
760  while (NumExprs--)
761    Exprs.push_back(Reader.ReadSubExpr());
762  E->setExprs(*Reader.getContext(), Exprs.data(), Exprs.size());
763  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
764  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
765}
766
767void ASTStmtReader::VisitBlockExpr(BlockExpr *E) {
768  VisitExpr(E);
769  E->setBlockDecl(cast_or_null<BlockDecl>(Reader.GetDecl(Record[Idx++])));
770  E->setHasBlockDeclRefExprs(Record[Idx++]);
771}
772
773void ASTStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
774  VisitExpr(E);
775  E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++])));
776  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
777  E->setByRef(Record[Idx++]);
778  E->setConstQualAdded(Record[Idx++]);
779  E->setCopyConstructorExpr(Reader.ReadSubExpr());
780}
781
782//===----------------------------------------------------------------------===//
783// Objective-C Expressions and Statements
784
785void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
786  VisitExpr(E);
787  E->setString(cast<StringLiteral>(Reader.ReadSubStmt()));
788  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
789}
790
791void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
792  VisitExpr(E);
793  E->setEncodedTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor,Record,Idx));
794  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
795  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
796}
797
798void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
799  VisitExpr(E);
800  E->setSelector(Reader.GetSelector(Record, Idx));
801  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
802  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
803}
804
805void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
806  VisitExpr(E);
807  E->setProtocol(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
808  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
809  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
810}
811
812void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
813  VisitExpr(E);
814  E->setDecl(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
815  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
816  E->setBase(Reader.ReadSubExpr());
817  E->setIsArrow(Record[Idx++]);
818  E->setIsFreeIvar(Record[Idx++]);
819}
820
821void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
822  VisitExpr(E);
823  E->setProperty(cast<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++])));
824  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
825  E->setBase(Reader.ReadSubExpr());
826}
827
828void ASTStmtReader::VisitObjCImplicitSetterGetterRefExpr(
829                                      ObjCImplicitSetterGetterRefExpr *E) {
830  VisitExpr(E);
831  E->setGetterMethod(
832                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
833  E->setSetterMethod(
834                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
835  E->setInterfaceDecl(
836              cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
837  E->setBase(Reader.ReadSubExpr());
838  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
839  E->setClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
840}
841
842void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
843  VisitExpr(E);
844  assert(Record[Idx] == E->getNumArgs());
845  ++Idx;
846  ObjCMessageExpr::ReceiverKind Kind
847    = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
848  switch (Kind) {
849  case ObjCMessageExpr::Instance:
850    E->setInstanceReceiver(Reader.ReadSubExpr());
851    break;
852
853  case ObjCMessageExpr::Class:
854    E->setClassReceiver(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
855    break;
856
857  case ObjCMessageExpr::SuperClass:
858  case ObjCMessageExpr::SuperInstance: {
859    QualType T = Reader.GetType(Record[Idx++]);
860    SourceLocation SuperLoc = SourceLocation::getFromRawEncoding(Record[Idx++]);
861    E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
862    break;
863  }
864  }
865
866  assert(Kind == E->getReceiverKind());
867
868  if (Record[Idx++])
869    E->setMethodDecl(cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
870  else
871    E->setSelector(Reader.GetSelector(Record, Idx));
872
873  E->setLeftLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
874  E->setRightLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
875
876  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
877    E->setArg(I, Reader.ReadSubExpr());
878}
879
880void ASTStmtReader::VisitObjCSuperExpr(ObjCSuperExpr *E) {
881  VisitExpr(E);
882  E->setLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
883}
884
885void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
886  VisitStmt(S);
887  S->setElement(Reader.ReadSubStmt());
888  S->setCollection(Reader.ReadSubExpr());
889  S->setBody(Reader.ReadSubStmt());
890  S->setForLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
891  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
892}
893
894void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
895  VisitStmt(S);
896  S->setCatchBody(Reader.ReadSubStmt());
897  S->setCatchParamDecl(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
898  S->setAtCatchLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
899  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
900}
901
902void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
903  VisitStmt(S);
904  S->setFinallyBody(Reader.ReadSubStmt());
905  S->setAtFinallyLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
906}
907
908void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
909  VisitStmt(S);
910  assert(Record[Idx] == S->getNumCatchStmts());
911  ++Idx;
912  bool HasFinally = Record[Idx++];
913  S->setTryBody(Reader.ReadSubStmt());
914  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
915    S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
916
917  if (HasFinally)
918    S->setFinallyStmt(Reader.ReadSubStmt());
919  S->setAtTryLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
920}
921
922void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
923  VisitStmt(S);
924  S->setSynchExpr(Reader.ReadSubStmt());
925  S->setSynchBody(Reader.ReadSubStmt());
926  S->setAtSynchronizedLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
927}
928
929void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
930  VisitStmt(S);
931  S->setThrowExpr(Reader.ReadSubStmt());
932  S->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
933}
934
935//===----------------------------------------------------------------------===//
936// C++ Expressions and Statements
937//===----------------------------------------------------------------------===//
938
939void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
940  VisitStmt(S);
941  S->CatchLoc = Reader.ReadSourceLocation(Record, Idx);
942  S->ExceptionDecl = cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++]));
943  S->HandlerBlock = Reader.ReadSubStmt();
944}
945
946void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
947  VisitStmt(S);
948  assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?");
949  ++Idx;
950  S->TryLoc = Reader.ReadSourceLocation(Record, Idx);
951  S->getStmts()[0] = Reader.ReadSubStmt();
952  for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
953    S->getStmts()[i + 1] = Reader.ReadSubStmt();
954}
955
956void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
957  VisitCallExpr(E);
958  E->setOperator((OverloadedOperatorKind)Record[Idx++]);
959}
960
961void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
962  VisitExpr(E);
963  E->NumArgs = Record[Idx++];
964  if (E->NumArgs)
965    E->Args = new (*Reader.getContext()) Stmt*[E->NumArgs];
966  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
967    E->setArg(I, Reader.ReadSubExpr());
968  E->setConstructor(cast<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
969  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
970  E->setElidable(Record[Idx++]);
971  E->setRequiresZeroInitialization(Record[Idx++]);
972  E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
973}
974
975void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
976  VisitCXXConstructExpr(E);
977  E->TyBeginLoc = Reader.ReadSourceLocation(Record, Idx);
978  E->RParenLoc = Reader.ReadSourceLocation(Record, Idx);
979}
980
981void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
982  VisitExplicitCastExpr(E);
983  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
984}
985
986void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
987  return VisitCXXNamedCastExpr(E);
988}
989
990void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
991  return VisitCXXNamedCastExpr(E);
992}
993
994void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
995  return VisitCXXNamedCastExpr(E);
996}
997
998void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
999  return VisitCXXNamedCastExpr(E);
1000}
1001
1002void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1003  VisitExplicitCastExpr(E);
1004  E->setTypeBeginLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1005  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1006}
1007
1008void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1009  VisitExpr(E);
1010  E->setValue(Record[Idx++]);
1011  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
1012}
1013
1014void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1015  VisitExpr(E);
1016  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
1017}
1018
1019void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1020  VisitExpr(E);
1021  E->setSourceRange(Reader.ReadSourceRange(Record, Idx));
1022  if (E->isTypeOperand()) { // typeid(int)
1023    E->setTypeOperandSourceInfo(
1024        Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1025    return;
1026  }
1027
1028  // typeid(42+2)
1029  E->setExprOperand(Reader.ReadSubExpr());
1030}
1031
1032void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
1033  VisitExpr(E);
1034  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
1035  E->setImplicit(Record[Idx++]);
1036}
1037
1038void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
1039  VisitExpr(E);
1040  E->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1041  E->setSubExpr(Reader.ReadSubExpr());
1042}
1043
1044void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1045  VisitExpr(E);
1046
1047  assert(Record[Idx] == E->Param.getInt() && "We messed up at creation ?");
1048  ++Idx; // HasOtherExprStored and SubExpr was handled during creation.
1049  E->Param.setPointer(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
1050  E->Loc = Reader.ReadSourceLocation(Record, Idx);
1051}
1052
1053void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1054  VisitExpr(E);
1055  E->setTemporary(Reader.ReadCXXTemporary(Record, Idx));
1056  E->setSubExpr(Reader.ReadSubExpr());
1057}
1058
1059void ASTStmtReader::VisitCXXBindReferenceExpr(CXXBindReferenceExpr *E) {
1060  VisitExpr(E);
1061  E->SubExpr = Reader.ReadSubExpr();
1062  E->ExtendsLifetime = Record[Idx++];
1063  E->RequiresTemporaryCopy = Record[Idx++];
1064}
1065
1066void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
1067  VisitExpr(E);
1068  E->setTypeBeginLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1069  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1070}
1071
1072void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
1073  VisitExpr(E);
1074  E->setGlobalNew(Record[Idx++]);
1075  E->setHasInitializer(Record[Idx++]);
1076  bool isArray = Record[Idx++];
1077  unsigned NumPlacementArgs = Record[Idx++];
1078  unsigned NumCtorArgs = Record[Idx++];
1079  E->setOperatorNew(cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
1080  E->setOperatorDelete(
1081                    cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
1082  E->setConstructor(
1083               cast_or_null<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
1084  SourceRange TypeIdParens;
1085  TypeIdParens.setBegin(SourceLocation::getFromRawEncoding(Record[Idx++]));
1086  TypeIdParens.setEnd(SourceLocation::getFromRawEncoding(Record[Idx++]));
1087  E->TypeIdParens = TypeIdParens;
1088  E->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1089  E->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1090
1091  E->AllocateArgsArray(*Reader.getContext(), isArray, NumPlacementArgs,
1092                       NumCtorArgs);
1093
1094  // Install all the subexpressions.
1095  for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
1096       I != e; ++I)
1097    *I = Reader.ReadSubStmt();
1098}
1099
1100void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1101  VisitExpr(E);
1102  E->setGlobalDelete(Record[Idx++]);
1103  E->setArrayForm(Record[Idx++]);
1104  E->setOperatorDelete(
1105                     cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
1106  E->setArgument(Reader.ReadSubExpr());
1107  E->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1108}
1109
1110void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1111  VisitExpr(E);
1112
1113  E->setBase(Reader.ReadSubExpr());
1114  E->setArrow(Record[Idx++]);
1115  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1116  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1117  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1118  E->setScopeTypeInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1119  E->setColonColonLoc(Reader.ReadSourceLocation(Record, Idx));
1120  E->setTildeLoc(Reader.ReadSourceLocation(Record, Idx));
1121
1122  IdentifierInfo *II = Reader.GetIdentifierInfo(Record, Idx);
1123  if (II)
1124    E->setDestroyedType(II, Reader.ReadSourceLocation(Record, Idx));
1125  else
1126    E->setDestroyedType(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1127}
1128
1129void ASTStmtReader::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
1130  VisitExpr(E);
1131  unsigned NumTemps = Record[Idx++];
1132  if (NumTemps) {
1133    E->setNumTemporaries(*Reader.getContext(), NumTemps);
1134    for (unsigned i = 0; i != NumTemps; ++i)
1135      E->setTemporary(i, Reader.ReadCXXTemporary(Record, Idx));
1136  }
1137  E->setSubExpr(Reader.ReadSubExpr());
1138}
1139
1140void
1141ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
1142  VisitExpr(E);
1143
1144  unsigned NumTemplateArgs = Record[Idx++];
1145  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1146         "Read wrong record during creation ?");
1147  if (E->hasExplicitTemplateArgs())
1148    ReadExplicitTemplateArgumentList(*E->getExplicitTemplateArgumentList(),
1149                                     NumTemplateArgs);
1150
1151  E->setBase(Reader.ReadSubExpr());
1152  E->setBaseType(Reader.GetType(Record[Idx++]));
1153  E->setArrow(Record[Idx++]);
1154  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1155  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1156  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1157  E->setFirstQualifierFoundInScope(
1158                        cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])));
1159  // FIXME: read whole DeclarationNameInfo.
1160  E->setMember(Reader.ReadDeclarationName(Record, Idx));
1161  E->setMemberLoc(Reader.ReadSourceLocation(Record, Idx));
1162}
1163
1164void
1165ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
1166  VisitExpr(E);
1167
1168  unsigned NumTemplateArgs = Record[Idx++];
1169  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1170         "Read wrong record during creation ?");
1171  if (E->hasExplicitTemplateArgs())
1172    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1173                                     NumTemplateArgs);
1174
1175  // FIXME: read whole DeclarationNameInfo.
1176  E->setDeclName(Reader.ReadDeclarationName(Record, Idx));
1177  E->setLocation(Reader.ReadSourceLocation(Record, Idx));
1178  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1179  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1180}
1181
1182void
1183ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1184  VisitExpr(E);
1185  assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
1186  ++Idx; // NumArgs;
1187  for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
1188    E->setArg(I, Reader.ReadSubExpr());
1189  E->setTypeBeginLoc(Reader.ReadSourceLocation(Record, Idx));
1190  E->setTypeAsWritten(Reader.GetType(Record[Idx++]));
1191  E->setLParenLoc(Reader.ReadSourceLocation(Record, Idx));
1192  E->setRParenLoc(Reader.ReadSourceLocation(Record, Idx));
1193}
1194
1195void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
1196  VisitExpr(E);
1197
1198  unsigned NumTemplateArgs = Record[Idx++];
1199  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1200         "Read wrong record during creation ?");
1201  if (E->hasExplicitTemplateArgs())
1202    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1203                                     NumTemplateArgs);
1204
1205  unsigned NumDecls = Record[Idx++];
1206  UnresolvedSet<8> Decls;
1207  for (unsigned i = 0; i != NumDecls; ++i) {
1208    NamedDecl *D = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
1209    AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1210    Decls.addDecl(D, AS);
1211  }
1212  E->initializeResults(*Reader.getContext(), Decls.begin(), Decls.end());
1213
1214  // FIXME: read whole DeclarationNameInfo.
1215  E->setName(Reader.ReadDeclarationName(Record, Idx));
1216  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1217  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1218  E->setNameLoc(Reader.ReadSourceLocation(Record, Idx));
1219}
1220
1221void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1222  VisitOverloadExpr(E);
1223  E->setArrow(Record[Idx++]);
1224  E->setHasUnresolvedUsing(Record[Idx++]);
1225  E->setBase(Reader.ReadSubExpr());
1226  E->setBaseType(Reader.GetType(Record[Idx++]));
1227  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1228}
1229
1230void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1231  VisitOverloadExpr(E);
1232  E->setRequiresADL(Record[Idx++]);
1233  E->setOverloaded(Record[Idx++]);
1234  E->setNamingClass(cast_or_null<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])));
1235}
1236
1237void ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1238  VisitExpr(E);
1239  E->UTT = (UnaryTypeTrait)Record[Idx++];
1240  SourceRange Range = Reader.ReadSourceRange(Record, Idx);
1241  E->Loc = Range.getBegin();
1242  E->RParen = Range.getEnd();
1243  E->QueriedType = Reader.GetType(Record[Idx++]);
1244}
1245
1246Stmt *ASTReader::ReadStmt(llvm::BitstreamCursor &Cursor) {
1247  switch (ReadingKind) {
1248  case Read_Decl:
1249  case Read_Type:
1250    return ReadStmtFromStream(Cursor);
1251  case Read_Stmt:
1252    return ReadSubStmt();
1253  }
1254
1255  llvm_unreachable("ReadingKind not set ?");
1256  return 0;
1257}
1258
1259Expr *ASTReader::ReadExpr(llvm::BitstreamCursor &Cursor) {
1260  return cast_or_null<Expr>(ReadStmt(Cursor));
1261}
1262
1263Expr *ASTReader::ReadSubExpr() {
1264  return cast_or_null<Expr>(ReadSubStmt());
1265}
1266
1267// Within the bitstream, expressions are stored in Reverse Polish
1268// Notation, with each of the subexpressions preceding the
1269// expression they are stored in. Subexpressions are stored from last to first.
1270// To evaluate expressions, we continue reading expressions and placing them on
1271// the stack, with expressions having operands removing those operands from the
1272// stack. Evaluation terminates when we see a STMT_STOP record, and
1273// the single remaining expression on the stack is our result.
1274Stmt *ASTReader::ReadStmtFromStream(llvm::BitstreamCursor &Cursor) {
1275
1276  ReadingKindTracker ReadingKind(Read_Stmt, *this);
1277
1278#ifndef NDEBUG
1279  unsigned PrevNumStmts = StmtStack.size();
1280#endif
1281
1282  RecordData Record;
1283  unsigned Idx;
1284  ASTStmtReader Reader(*this, Cursor, Record, Idx);
1285  Stmt::EmptyShell Empty;
1286
1287  while (true) {
1288    unsigned Code = Cursor.ReadCode();
1289    if (Code == llvm::bitc::END_BLOCK) {
1290      if (Cursor.ReadBlockEnd()) {
1291        Error("error at end of block in AST file");
1292        return 0;
1293      }
1294      break;
1295    }
1296
1297    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
1298      // No known subblocks, always skip them.
1299      Cursor.ReadSubBlockID();
1300      if (Cursor.SkipBlock()) {
1301        Error("malformed block record in AST file");
1302        return 0;
1303      }
1304      continue;
1305    }
1306
1307    if (Code == llvm::bitc::DEFINE_ABBREV) {
1308      Cursor.ReadAbbrevRecord();
1309      continue;
1310    }
1311
1312    Stmt *S = 0;
1313    Idx = 0;
1314    Record.clear();
1315    bool Finished = false;
1316    switch ((StmtCode)Cursor.ReadRecord(Code, Record)) {
1317    case STMT_STOP:
1318      Finished = true;
1319      break;
1320
1321    case STMT_NULL_PTR:
1322      S = 0;
1323      break;
1324
1325    case STMT_NULL:
1326      S = new (Context) NullStmt(Empty);
1327      break;
1328
1329    case STMT_COMPOUND:
1330      S = new (Context) CompoundStmt(Empty);
1331      break;
1332
1333    case STMT_CASE:
1334      S = new (Context) CaseStmt(Empty);
1335      break;
1336
1337    case STMT_DEFAULT:
1338      S = new (Context) DefaultStmt(Empty);
1339      break;
1340
1341    case STMT_LABEL:
1342      S = new (Context) LabelStmt(Empty);
1343      break;
1344
1345    case STMT_IF:
1346      S = new (Context) IfStmt(Empty);
1347      break;
1348
1349    case STMT_SWITCH:
1350      S = new (Context) SwitchStmt(Empty);
1351      break;
1352
1353    case STMT_WHILE:
1354      S = new (Context) WhileStmt(Empty);
1355      break;
1356
1357    case STMT_DO:
1358      S = new (Context) DoStmt(Empty);
1359      break;
1360
1361    case STMT_FOR:
1362      S = new (Context) ForStmt(Empty);
1363      break;
1364
1365    case STMT_GOTO:
1366      S = new (Context) GotoStmt(Empty);
1367      break;
1368
1369    case STMT_INDIRECT_GOTO:
1370      S = new (Context) IndirectGotoStmt(Empty);
1371      break;
1372
1373    case STMT_CONTINUE:
1374      S = new (Context) ContinueStmt(Empty);
1375      break;
1376
1377    case STMT_BREAK:
1378      S = new (Context) BreakStmt(Empty);
1379      break;
1380
1381    case STMT_RETURN:
1382      S = new (Context) ReturnStmt(Empty);
1383      break;
1384
1385    case STMT_DECL:
1386      S = new (Context) DeclStmt(Empty);
1387      break;
1388
1389    case STMT_ASM:
1390      S = new (Context) AsmStmt(Empty);
1391      break;
1392
1393    case EXPR_PREDEFINED:
1394      S = new (Context) PredefinedExpr(Empty);
1395      break;
1396
1397    case EXPR_DECL_REF:
1398      S = DeclRefExpr::CreateEmpty(*Context,
1399                         /*HasQualifier=*/Record[ASTStmtReader::NumExprFields],
1400                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 1]);
1401      break;
1402
1403    case EXPR_INTEGER_LITERAL:
1404      S = new (Context) IntegerLiteral(Empty);
1405      break;
1406
1407    case EXPR_FLOATING_LITERAL:
1408      S = new (Context) FloatingLiteral(Empty);
1409      break;
1410
1411    case EXPR_IMAGINARY_LITERAL:
1412      S = new (Context) ImaginaryLiteral(Empty);
1413      break;
1414
1415    case EXPR_STRING_LITERAL:
1416      S = StringLiteral::CreateEmpty(*Context,
1417                                     Record[ASTStmtReader::NumExprFields + 1]);
1418      break;
1419
1420    case EXPR_CHARACTER_LITERAL:
1421      S = new (Context) CharacterLiteral(Empty);
1422      break;
1423
1424    case EXPR_PAREN:
1425      S = new (Context) ParenExpr(Empty);
1426      break;
1427
1428    case EXPR_PAREN_LIST:
1429      S = new (Context) ParenListExpr(Empty);
1430      break;
1431
1432    case EXPR_UNARY_OPERATOR:
1433      S = new (Context) UnaryOperator(Empty);
1434      break;
1435
1436    case EXPR_OFFSETOF:
1437      S = OffsetOfExpr::CreateEmpty(*Context,
1438                                    Record[ASTStmtReader::NumExprFields],
1439                                    Record[ASTStmtReader::NumExprFields + 1]);
1440      break;
1441
1442    case EXPR_SIZEOF_ALIGN_OF:
1443      S = new (Context) SizeOfAlignOfExpr(Empty);
1444      break;
1445
1446    case EXPR_ARRAY_SUBSCRIPT:
1447      S = new (Context) ArraySubscriptExpr(Empty);
1448      break;
1449
1450    case EXPR_CALL:
1451      S = new (Context) CallExpr(*Context, Stmt::CallExprClass, Empty);
1452      break;
1453
1454    case EXPR_MEMBER: {
1455      // We load everything here and fully initialize it at creation.
1456      // That way we can use MemberExpr::Create and don't have to duplicate its
1457      // logic with a MemberExpr::CreateEmpty.
1458
1459      assert(Idx == 0);
1460      NestedNameSpecifier *NNS = 0;
1461      SourceRange QualifierRange;
1462      if (Record[Idx++]) { // HasQualifier.
1463        NNS = ReadNestedNameSpecifier(Record, Idx);
1464        QualifierRange = ReadSourceRange(Record, Idx);
1465      }
1466
1467      TemplateArgumentListInfo ArgInfo;
1468      unsigned NumTemplateArgs = Record[Idx++];
1469      if (NumTemplateArgs) {
1470        ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx));
1471        ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx));
1472        for (unsigned i = 0; i != NumTemplateArgs; ++i)
1473          ArgInfo.addArgument(ReadTemplateArgumentLoc(Cursor, Record, Idx));
1474      }
1475
1476      NamedDecl *FoundD = cast_or_null<NamedDecl>(GetDecl(Record[Idx++]));
1477      AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1478      DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
1479
1480      QualType T = GetType(Record[Idx++]);
1481      Expr *Base = ReadSubExpr();
1482      ValueDecl *MemberD = cast<ValueDecl>(GetDecl(Record[Idx++]));
1483      // FIXME: read DeclarationNameLoc.
1484      SourceLocation MemberLoc = ReadSourceLocation(Record, Idx);
1485      DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);
1486      bool IsArrow = Record[Idx++];
1487
1488      S = MemberExpr::Create(*Context, Base, IsArrow, NNS, QualifierRange,
1489                             MemberD, FoundDecl, MemberNameInfo,
1490                             NumTemplateArgs ? &ArgInfo : 0, T);
1491      break;
1492    }
1493
1494    case EXPR_BINARY_OPERATOR:
1495      S = new (Context) BinaryOperator(Empty);
1496      break;
1497
1498    case EXPR_COMPOUND_ASSIGN_OPERATOR:
1499      S = new (Context) CompoundAssignOperator(Empty);
1500      break;
1501
1502    case EXPR_CONDITIONAL_OPERATOR:
1503      S = new (Context) ConditionalOperator(Empty);
1504      break;
1505
1506    case EXPR_IMPLICIT_CAST:
1507      S = ImplicitCastExpr::CreateEmpty(*Context,
1508                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1509      break;
1510
1511    case EXPR_CSTYLE_CAST:
1512      S = CStyleCastExpr::CreateEmpty(*Context,
1513                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1514      break;
1515
1516    case EXPR_COMPOUND_LITERAL:
1517      S = new (Context) CompoundLiteralExpr(Empty);
1518      break;
1519
1520    case EXPR_EXT_VECTOR_ELEMENT:
1521      S = new (Context) ExtVectorElementExpr(Empty);
1522      break;
1523
1524    case EXPR_INIT_LIST:
1525      S = new (Context) InitListExpr(*getContext(), Empty);
1526      break;
1527
1528    case EXPR_DESIGNATED_INIT:
1529      S = DesignatedInitExpr::CreateEmpty(*Context,
1530                                     Record[ASTStmtReader::NumExprFields] - 1);
1531
1532      break;
1533
1534    case EXPR_IMPLICIT_VALUE_INIT:
1535      S = new (Context) ImplicitValueInitExpr(Empty);
1536      break;
1537
1538    case EXPR_VA_ARG:
1539      S = new (Context) VAArgExpr(Empty);
1540      break;
1541
1542    case EXPR_ADDR_LABEL:
1543      S = new (Context) AddrLabelExpr(Empty);
1544      break;
1545
1546    case EXPR_STMT:
1547      S = new (Context) StmtExpr(Empty);
1548      break;
1549
1550    case EXPR_TYPES_COMPATIBLE:
1551      S = new (Context) TypesCompatibleExpr(Empty);
1552      break;
1553
1554    case EXPR_CHOOSE:
1555      S = new (Context) ChooseExpr(Empty);
1556      break;
1557
1558    case EXPR_GNU_NULL:
1559      S = new (Context) GNUNullExpr(Empty);
1560      break;
1561
1562    case EXPR_SHUFFLE_VECTOR:
1563      S = new (Context) ShuffleVectorExpr(Empty);
1564      break;
1565
1566    case EXPR_BLOCK:
1567      S = new (Context) BlockExpr(Empty);
1568      break;
1569
1570    case EXPR_BLOCK_DECL_REF:
1571      S = new (Context) BlockDeclRefExpr(Empty);
1572      break;
1573
1574    case EXPR_OBJC_STRING_LITERAL:
1575      S = new (Context) ObjCStringLiteral(Empty);
1576      break;
1577    case EXPR_OBJC_ENCODE:
1578      S = new (Context) ObjCEncodeExpr(Empty);
1579      break;
1580    case EXPR_OBJC_SELECTOR_EXPR:
1581      S = new (Context) ObjCSelectorExpr(Empty);
1582      break;
1583    case EXPR_OBJC_PROTOCOL_EXPR:
1584      S = new (Context) ObjCProtocolExpr(Empty);
1585      break;
1586    case EXPR_OBJC_IVAR_REF_EXPR:
1587      S = new (Context) ObjCIvarRefExpr(Empty);
1588      break;
1589    case EXPR_OBJC_PROPERTY_REF_EXPR:
1590      S = new (Context) ObjCPropertyRefExpr(Empty);
1591      break;
1592    case EXPR_OBJC_KVC_REF_EXPR:
1593      S = new (Context) ObjCImplicitSetterGetterRefExpr(Empty);
1594      break;
1595    case EXPR_OBJC_MESSAGE_EXPR:
1596      S = ObjCMessageExpr::CreateEmpty(*Context,
1597                                     Record[ASTStmtReader::NumExprFields]);
1598      break;
1599    case EXPR_OBJC_SUPER_EXPR:
1600      S = new (Context) ObjCSuperExpr(Empty);
1601      break;
1602    case EXPR_OBJC_ISA:
1603      S = new (Context) ObjCIsaExpr(Empty);
1604      break;
1605    case STMT_OBJC_FOR_COLLECTION:
1606      S = new (Context) ObjCForCollectionStmt(Empty);
1607      break;
1608    case STMT_OBJC_CATCH:
1609      S = new (Context) ObjCAtCatchStmt(Empty);
1610      break;
1611    case STMT_OBJC_FINALLY:
1612      S = new (Context) ObjCAtFinallyStmt(Empty);
1613      break;
1614    case STMT_OBJC_AT_TRY:
1615      S = ObjCAtTryStmt::CreateEmpty(*Context,
1616                                     Record[ASTStmtReader::NumStmtFields],
1617                                     Record[ASTStmtReader::NumStmtFields + 1]);
1618      break;
1619    case STMT_OBJC_AT_SYNCHRONIZED:
1620      S = new (Context) ObjCAtSynchronizedStmt(Empty);
1621      break;
1622    case STMT_OBJC_AT_THROW:
1623      S = new (Context) ObjCAtThrowStmt(Empty);
1624      break;
1625
1626    case STMT_CXX_CATCH:
1627      S = new (Context) CXXCatchStmt(Empty);
1628      break;
1629
1630    case STMT_CXX_TRY:
1631      S = CXXTryStmt::Create(*Context, Empty,
1632             /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]);
1633      break;
1634
1635    case EXPR_CXX_OPERATOR_CALL:
1636      S = new (Context) CXXOperatorCallExpr(*Context, Empty);
1637      break;
1638
1639    case EXPR_CXX_MEMBER_CALL:
1640      S = new (Context) CXXMemberCallExpr(*Context, Empty);
1641      break;
1642
1643    case EXPR_CXX_CONSTRUCT:
1644      S = new (Context) CXXConstructExpr(Empty);
1645      break;
1646
1647    case EXPR_CXX_TEMPORARY_OBJECT:
1648      S = new (Context) CXXTemporaryObjectExpr(Empty);
1649      break;
1650
1651    case EXPR_CXX_STATIC_CAST:
1652      S = CXXStaticCastExpr::CreateEmpty(*Context,
1653                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1654      break;
1655
1656    case EXPR_CXX_DYNAMIC_CAST:
1657      S = CXXDynamicCastExpr::CreateEmpty(*Context,
1658                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1659      break;
1660
1661    case EXPR_CXX_REINTERPRET_CAST:
1662      S = CXXReinterpretCastExpr::CreateEmpty(*Context,
1663                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1664      break;
1665
1666    case EXPR_CXX_CONST_CAST:
1667      S = CXXConstCastExpr::CreateEmpty(*Context);
1668      break;
1669
1670    case EXPR_CXX_FUNCTIONAL_CAST:
1671      S = CXXFunctionalCastExpr::CreateEmpty(*Context,
1672                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1673      break;
1674
1675    case EXPR_CXX_BOOL_LITERAL:
1676      S = new (Context) CXXBoolLiteralExpr(Empty);
1677      break;
1678
1679    case EXPR_CXX_NULL_PTR_LITERAL:
1680      S = new (Context) CXXNullPtrLiteralExpr(Empty);
1681      break;
1682    case EXPR_CXX_TYPEID_EXPR:
1683      S = new (Context) CXXTypeidExpr(Empty, true);
1684      break;
1685    case EXPR_CXX_TYPEID_TYPE:
1686      S = new (Context) CXXTypeidExpr(Empty, false);
1687      break;
1688    case EXPR_CXX_THIS:
1689      S = new (Context) CXXThisExpr(Empty);
1690      break;
1691    case EXPR_CXX_THROW:
1692      S = new (Context) CXXThrowExpr(Empty);
1693      break;
1694    case EXPR_CXX_DEFAULT_ARG: {
1695      bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields];
1696      if (HasOtherExprStored) {
1697        Expr *SubExpr = ReadSubExpr();
1698        S = CXXDefaultArgExpr::Create(*Context, SourceLocation(), 0, SubExpr);
1699      } else
1700        S = new (Context) CXXDefaultArgExpr(Empty);
1701      break;
1702    }
1703    case EXPR_CXX_BIND_TEMPORARY:
1704      S = new (Context) CXXBindTemporaryExpr(Empty);
1705      break;
1706    case EXPR_CXX_BIND_REFERENCE:
1707      S = new (Context) CXXBindReferenceExpr(Empty);
1708      break;
1709
1710    case EXPR_CXX_SCALAR_VALUE_INIT:
1711      S = new (Context) CXXScalarValueInitExpr(Empty);
1712      break;
1713    case EXPR_CXX_NEW:
1714      S = new (Context) CXXNewExpr(Empty);
1715      break;
1716    case EXPR_CXX_DELETE:
1717      S = new (Context) CXXDeleteExpr(Empty);
1718      break;
1719    case EXPR_CXX_PSEUDO_DESTRUCTOR:
1720      S = new (Context) CXXPseudoDestructorExpr(Empty);
1721      break;
1722
1723    case EXPR_CXX_EXPR_WITH_TEMPORARIES:
1724      S = new (Context) CXXExprWithTemporaries(Empty);
1725      break;
1726
1727    case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
1728      S = CXXDependentScopeMemberExpr::CreateEmpty(*Context,
1729                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
1730      break;
1731
1732    case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
1733      S = DependentScopeDeclRefExpr::CreateEmpty(*Context,
1734                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
1735      break;
1736
1737    case EXPR_CXX_UNRESOLVED_CONSTRUCT:
1738      S = CXXUnresolvedConstructExpr::CreateEmpty(*Context,
1739                              /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
1740      break;
1741
1742    case EXPR_CXX_UNRESOLVED_MEMBER:
1743      S = UnresolvedMemberExpr::CreateEmpty(*Context,
1744                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
1745      break;
1746
1747    case EXPR_CXX_UNRESOLVED_LOOKUP:
1748      S = UnresolvedLookupExpr::CreateEmpty(*Context,
1749                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
1750      break;
1751
1752    case EXPR_CXX_UNARY_TYPE_TRAIT:
1753      S = new (Context) UnaryTypeTraitExpr(Empty);
1754      break;
1755    }
1756
1757    // We hit a STMT_STOP, so we're done with this expression.
1758    if (Finished)
1759      break;
1760
1761    ++NumStatementsRead;
1762
1763    if (S)
1764      Reader.Visit(S);
1765
1766    assert(Idx == Record.size() && "Invalid deserialization of statement");
1767    StmtStack.push_back(S);
1768  }
1769
1770#ifndef NDEBUG
1771  assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
1772  assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
1773#endif
1774
1775  return StmtStack.pop_back_val();
1776}
1777