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