ASTReaderStmt.cpp revision ebcb57a8d298862c65043e88b2429591ab3c58d3
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::VisitIfStmt(IfStmt *S) {
163  VisitStmt(S);
164  S->setConditionVariable(Reader.getContext(),
165                          ReadDeclAs<VarDecl>(Record, Idx));
166  S->setCond(Reader.ReadSubExpr());
167  S->setThen(Reader.ReadSubStmt());
168  S->setElse(Reader.ReadSubStmt());
169  S->setIfLoc(ReadSourceLocation(Record, Idx));
170  S->setElseLoc(ReadSourceLocation(Record, Idx));
171}
172
173void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) {
174  VisitStmt(S);
175  S->setConditionVariable(Reader.getContext(),
176                          ReadDeclAs<VarDecl>(Record, Idx));
177  S->setCond(Reader.ReadSubExpr());
178  S->setBody(Reader.ReadSubStmt());
179  S->setSwitchLoc(ReadSourceLocation(Record, Idx));
180  if (Record[Idx++])
181    S->setAllEnumCasesCovered();
182
183  SwitchCase *PrevSC = 0;
184  for (unsigned N = Record.size(); Idx != N; ++Idx) {
185    SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]);
186    if (PrevSC)
187      PrevSC->setNextSwitchCase(SC);
188    else
189      S->setSwitchCaseList(SC);
190
191    PrevSC = SC;
192  }
193}
194
195void ASTStmtReader::VisitWhileStmt(WhileStmt *S) {
196  VisitStmt(S);
197  S->setConditionVariable(Reader.getContext(),
198                          ReadDeclAs<VarDecl>(Record, Idx));
199
200  S->setCond(Reader.ReadSubExpr());
201  S->setBody(Reader.ReadSubStmt());
202  S->setWhileLoc(ReadSourceLocation(Record, Idx));
203}
204
205void ASTStmtReader::VisitDoStmt(DoStmt *S) {
206  VisitStmt(S);
207  S->setCond(Reader.ReadSubExpr());
208  S->setBody(Reader.ReadSubStmt());
209  S->setDoLoc(ReadSourceLocation(Record, Idx));
210  S->setWhileLoc(ReadSourceLocation(Record, Idx));
211  S->setRParenLoc(ReadSourceLocation(Record, Idx));
212}
213
214void ASTStmtReader::VisitForStmt(ForStmt *S) {
215  VisitStmt(S);
216  S->setInit(Reader.ReadSubStmt());
217  S->setCond(Reader.ReadSubExpr());
218  S->setConditionVariable(Reader.getContext(),
219                          ReadDeclAs<VarDecl>(Record, Idx));
220  S->setInc(Reader.ReadSubExpr());
221  S->setBody(Reader.ReadSubStmt());
222  S->setForLoc(ReadSourceLocation(Record, Idx));
223  S->setLParenLoc(ReadSourceLocation(Record, Idx));
224  S->setRParenLoc(ReadSourceLocation(Record, Idx));
225}
226
227void ASTStmtReader::VisitGotoStmt(GotoStmt *S) {
228  VisitStmt(S);
229  S->setLabel(ReadDeclAs<LabelDecl>(Record, Idx));
230  S->setGotoLoc(ReadSourceLocation(Record, Idx));
231  S->setLabelLoc(ReadSourceLocation(Record, Idx));
232}
233
234void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
235  VisitStmt(S);
236  S->setGotoLoc(ReadSourceLocation(Record, Idx));
237  S->setStarLoc(ReadSourceLocation(Record, Idx));
238  S->setTarget(Reader.ReadSubExpr());
239}
240
241void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {
242  VisitStmt(S);
243  S->setContinueLoc(ReadSourceLocation(Record, Idx));
244}
245
246void ASTStmtReader::VisitBreakStmt(BreakStmt *S) {
247  VisitStmt(S);
248  S->setBreakLoc(ReadSourceLocation(Record, Idx));
249}
250
251void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) {
252  VisitStmt(S);
253  S->setRetValue(Reader.ReadSubExpr());
254  S->setReturnLoc(ReadSourceLocation(Record, Idx));
255  S->setNRVOCandidate(ReadDeclAs<VarDecl>(Record, Idx));
256}
257
258void ASTStmtReader::VisitDeclStmt(DeclStmt *S) {
259  VisitStmt(S);
260  S->setStartLoc(ReadSourceLocation(Record, Idx));
261  S->setEndLoc(ReadSourceLocation(Record, Idx));
262
263  if (Idx + 1 == Record.size()) {
264    // Single declaration
265    S->setDeclGroup(DeclGroupRef(ReadDecl(Record, Idx)));
266  } else {
267    SmallVector<Decl *, 16> Decls;
268    Decls.reserve(Record.size() - Idx);
269    for (unsigned N = Record.size(); Idx != N; )
270      Decls.push_back(ReadDecl(Record, Idx));
271    S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Reader.getContext(),
272                                                   Decls.data(),
273                                                   Decls.size())));
274  }
275}
276
277void ASTStmtReader::VisitAsmStmt(AsmStmt *S) {
278  VisitStmt(S);
279  unsigned NumOutputs = Record[Idx++];
280  unsigned NumInputs = Record[Idx++];
281  unsigned NumClobbers = Record[Idx++];
282  S->setAsmLoc(ReadSourceLocation(Record, Idx));
283  S->setRParenLoc(ReadSourceLocation(Record, Idx));
284  S->setVolatile(Record[Idx++]);
285  S->setSimple(Record[Idx++]);
286  S->setMSAsm(Record[Idx++]);
287
288  S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
289
290  // Outputs and inputs
291  SmallVector<IdentifierInfo *, 16> Names;
292  SmallVector<StringLiteral*, 16> Constraints;
293  SmallVector<Stmt*, 16> Exprs;
294  for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {
295    Names.push_back(Reader.GetIdentifierInfo(F, Record, Idx));
296    Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
297    Exprs.push_back(Reader.ReadSubStmt());
298  }
299
300  // Constraints
301  SmallVector<StringLiteral*, 16> Clobbers;
302  for (unsigned I = 0; I != NumClobbers; ++I)
303    Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
304
305  S->setOutputsAndInputsAndClobbers(Reader.getContext(),
306                                    Names.data(), Constraints.data(),
307                                    Exprs.data(), NumOutputs, NumInputs,
308                                    Clobbers.data(), NumClobbers);
309}
310
311void ASTStmtReader::VisitExpr(Expr *E) {
312  VisitStmt(E);
313  E->setType(Reader.readType(F, Record, Idx));
314  E->setTypeDependent(Record[Idx++]);
315  E->setValueDependent(Record[Idx++]);
316  E->setInstantiationDependent(Record[Idx++]);
317  E->ExprBits.ContainsUnexpandedParameterPack = Record[Idx++];
318  E->setValueKind(static_cast<ExprValueKind>(Record[Idx++]));
319  E->setObjectKind(static_cast<ExprObjectKind>(Record[Idx++]));
320  assert(Idx == NumExprFields && "Incorrect expression field count");
321}
322
323void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {
324  VisitExpr(E);
325  E->setLocation(ReadSourceLocation(Record, Idx));
326  E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]);
327}
328
329void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {
330  VisitExpr(E);
331
332  E->DeclRefExprBits.HasQualifier = Record[Idx++];
333  E->DeclRefExprBits.HasFoundDecl = Record[Idx++];
334  E->DeclRefExprBits.HasTemplateKWAndArgsInfo = Record[Idx++];
335  E->DeclRefExprBits.HadMultipleCandidates = Record[Idx++];
336  unsigned NumTemplateArgs = 0;
337  if (E->hasTemplateKWAndArgsInfo())
338    NumTemplateArgs = Record[Idx++];
339
340  if (E->hasQualifier())
341    E->getInternalQualifierLoc()
342      = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
343
344  if (E->hasFoundDecl())
345    E->getInternalFoundDecl() = ReadDeclAs<NamedDecl>(Record, Idx);
346
347  if (E->hasTemplateKWAndArgsInfo())
348    ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(),
349                              NumTemplateArgs);
350
351  E->setDecl(ReadDeclAs<ValueDecl>(Record, Idx));
352  E->setLocation(ReadSourceLocation(Record, Idx));
353  ReadDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record, Idx);
354}
355
356void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
357  VisitExpr(E);
358  E->setLocation(ReadSourceLocation(Record, Idx));
359  E->setValue(Reader.getContext(), Reader.ReadAPInt(Record, Idx));
360}
361
362void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {
363  VisitExpr(E);
364  E->setValue(Reader.getContext(), Reader.ReadAPFloat(Record, Idx));
365  E->setExact(Record[Idx++]);
366  E->setLocation(ReadSourceLocation(Record, Idx));
367}
368
369void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
370  VisitExpr(E);
371  E->setSubExpr(Reader.ReadSubExpr());
372}
373
374void ASTStmtReader::VisitStringLiteral(StringLiteral *E) {
375  VisitExpr(E);
376  unsigned Len = Record[Idx++];
377  assert(Record[Idx] == E->getNumConcatenated() &&
378         "Wrong number of concatenated tokens!");
379  ++Idx;
380  StringLiteral::StringKind kind =
381        static_cast<StringLiteral::StringKind>(Record[Idx++]);
382  bool isPascal = Record[Idx++];
383
384  // Read string data
385  SmallString<16> Str(&Record[Idx], &Record[Idx] + Len);
386  E->setString(Reader.getContext(), Str.str(), kind, isPascal);
387  Idx += Len;
388
389  // Read source locations
390  for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
391    E->setStrTokenLoc(I, ReadSourceLocation(Record, Idx));
392}
393
394void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
395  VisitExpr(E);
396  E->setValue(Record[Idx++]);
397  E->setLocation(ReadSourceLocation(Record, Idx));
398  E->setKind(static_cast<CharacterLiteral::CharacterKind>(Record[Idx++]));
399}
400
401void ASTStmtReader::VisitParenExpr(ParenExpr *E) {
402  VisitExpr(E);
403  E->setLParen(ReadSourceLocation(Record, Idx));
404  E->setRParen(ReadSourceLocation(Record, Idx));
405  E->setSubExpr(Reader.ReadSubExpr());
406}
407
408void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {
409  VisitExpr(E);
410  unsigned NumExprs = Record[Idx++];
411  E->Exprs = new (Reader.getContext()) Stmt*[NumExprs];
412  for (unsigned i = 0; i != NumExprs; ++i)
413    E->Exprs[i] = Reader.ReadSubStmt();
414  E->NumExprs = NumExprs;
415  E->LParenLoc = ReadSourceLocation(Record, Idx);
416  E->RParenLoc = ReadSourceLocation(Record, Idx);
417}
418
419void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {
420  VisitExpr(E);
421  E->setSubExpr(Reader.ReadSubExpr());
422  E->setOpcode((UnaryOperator::Opcode)Record[Idx++]);
423  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
424}
425
426void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
427  typedef OffsetOfExpr::OffsetOfNode Node;
428  VisitExpr(E);
429  assert(E->getNumComponents() == Record[Idx]);
430  ++Idx;
431  assert(E->getNumExpressions() == Record[Idx]);
432  ++Idx;
433  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
434  E->setRParenLoc(ReadSourceLocation(Record, Idx));
435  E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
436  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
437    Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]);
438    SourceLocation Start = ReadSourceLocation(Record, Idx);
439    SourceLocation End = ReadSourceLocation(Record, Idx);
440    switch (Kind) {
441    case Node::Array:
442      E->setComponent(I, Node(Start, Record[Idx++], End));
443      break;
444
445    case Node::Field:
446      E->setComponent(I, Node(Start, ReadDeclAs<FieldDecl>(Record, Idx), End));
447      break;
448
449    case Node::Identifier:
450      E->setComponent(I,
451                      Node(Start,
452                           Reader.GetIdentifierInfo(F, Record, Idx),
453                           End));
454      break;
455
456    case Node::Base: {
457      CXXBaseSpecifier *Base = new (Reader.getContext()) CXXBaseSpecifier();
458      *Base = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
459      E->setComponent(I, Node(Base));
460      break;
461    }
462    }
463  }
464
465  for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
466    E->setIndexExpr(I, Reader.ReadSubExpr());
467}
468
469void ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
470  VisitExpr(E);
471  E->setKind(static_cast<UnaryExprOrTypeTrait>(Record[Idx++]));
472  if (Record[Idx] == 0) {
473    E->setArgument(Reader.ReadSubExpr());
474    ++Idx;
475  } else {
476    E->setArgument(GetTypeSourceInfo(Record, Idx));
477  }
478  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
479  E->setRParenLoc(ReadSourceLocation(Record, Idx));
480}
481
482void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
483  VisitExpr(E);
484  E->setLHS(Reader.ReadSubExpr());
485  E->setRHS(Reader.ReadSubExpr());
486  E->setRBracketLoc(ReadSourceLocation(Record, Idx));
487}
488
489void ASTStmtReader::VisitCallExpr(CallExpr *E) {
490  VisitExpr(E);
491  E->setNumArgs(Reader.getContext(), Record[Idx++]);
492  E->setRParenLoc(ReadSourceLocation(Record, Idx));
493  E->setCallee(Reader.ReadSubExpr());
494  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
495    E->setArg(I, Reader.ReadSubExpr());
496}
497
498void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
499  VisitCallExpr(E);
500}
501
502void ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
503  // Don't call VisitExpr, this is fully initialized at creation.
504  assert(E->getStmtClass() == Stmt::MemberExprClass &&
505         "It's a subclass, we must advance Idx!");
506}
507
508void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
509  VisitExpr(E);
510  E->setBase(Reader.ReadSubExpr());
511  E->setIsaMemberLoc(ReadSourceLocation(Record, Idx));
512  E->setArrow(Record[Idx++]);
513}
514
515void ASTStmtReader::
516VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
517  VisitExpr(E);
518  E->Operand = Reader.ReadSubExpr();
519  E->setShouldCopy(Record[Idx++]);
520}
521
522void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
523  VisitExplicitCastExpr(E);
524  E->LParenLoc = ReadSourceLocation(Record, Idx);
525  E->BridgeKeywordLoc = ReadSourceLocation(Record, Idx);
526  E->Kind = Record[Idx++];
527}
528
529void ASTStmtReader::VisitCastExpr(CastExpr *E) {
530  VisitExpr(E);
531  unsigned NumBaseSpecs = Record[Idx++];
532  assert(NumBaseSpecs == E->path_size());
533  E->setSubExpr(Reader.ReadSubExpr());
534  E->setCastKind((CastExpr::CastKind)Record[Idx++]);
535  CastExpr::path_iterator BaseI = E->path_begin();
536  while (NumBaseSpecs--) {
537    CXXBaseSpecifier *BaseSpec = new (Reader.getContext()) CXXBaseSpecifier;
538    *BaseSpec = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
539    *BaseI++ = BaseSpec;
540  }
541}
542
543void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {
544  VisitExpr(E);
545  E->setLHS(Reader.ReadSubExpr());
546  E->setRHS(Reader.ReadSubExpr());
547  E->setOpcode((BinaryOperator::Opcode)Record[Idx++]);
548  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
549}
550
551void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
552  VisitBinaryOperator(E);
553  E->setComputationLHSType(Reader.readType(F, Record, Idx));
554  E->setComputationResultType(Reader.readType(F, Record, Idx));
555}
556
557void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
558  VisitExpr(E);
559  E->SubExprs[ConditionalOperator::COND] = Reader.ReadSubExpr();
560  E->SubExprs[ConditionalOperator::LHS] = Reader.ReadSubExpr();
561  E->SubExprs[ConditionalOperator::RHS] = Reader.ReadSubExpr();
562  E->QuestionLoc = ReadSourceLocation(Record, Idx);
563  E->ColonLoc = ReadSourceLocation(Record, Idx);
564}
565
566void
567ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
568  VisitExpr(E);
569  E->OpaqueValue = cast<OpaqueValueExpr>(Reader.ReadSubExpr());
570  E->SubExprs[BinaryConditionalOperator::COMMON] = Reader.ReadSubExpr();
571  E->SubExprs[BinaryConditionalOperator::COND] = Reader.ReadSubExpr();
572  E->SubExprs[BinaryConditionalOperator::LHS] = Reader.ReadSubExpr();
573  E->SubExprs[BinaryConditionalOperator::RHS] = Reader.ReadSubExpr();
574  E->QuestionLoc = ReadSourceLocation(Record, Idx);
575  E->ColonLoc = ReadSourceLocation(Record, Idx);
576}
577
578void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
579  VisitCastExpr(E);
580}
581
582void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
583  VisitCastExpr(E);
584  E->setTypeInfoAsWritten(GetTypeSourceInfo(Record, Idx));
585}
586
587void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
588  VisitExplicitCastExpr(E);
589  E->setLParenLoc(ReadSourceLocation(Record, Idx));
590  E->setRParenLoc(ReadSourceLocation(Record, Idx));
591}
592
593void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
594  VisitExpr(E);
595  E->setLParenLoc(ReadSourceLocation(Record, Idx));
596  E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
597  E->setInitializer(Reader.ReadSubExpr());
598  E->setFileScope(Record[Idx++]);
599}
600
601void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
602  VisitExpr(E);
603  E->setBase(Reader.ReadSubExpr());
604  E->setAccessor(Reader.GetIdentifierInfo(F, Record, Idx));
605  E->setAccessorLoc(ReadSourceLocation(Record, Idx));
606}
607
608void ASTStmtReader::VisitInitListExpr(InitListExpr *E) {
609  VisitExpr(E);
610  E->setSyntacticForm(cast_or_null<InitListExpr>(Reader.ReadSubStmt()));
611  E->setLBraceLoc(ReadSourceLocation(Record, Idx));
612  E->setRBraceLoc(ReadSourceLocation(Record, Idx));
613  bool isArrayFiller = Record[Idx++];
614  Expr *filler = 0;
615  if (isArrayFiller) {
616    filler = Reader.ReadSubExpr();
617    E->ArrayFillerOrUnionFieldInit = filler;
618  } else
619    E->ArrayFillerOrUnionFieldInit = ReadDeclAs<FieldDecl>(Record, Idx);
620  E->sawArrayRangeDesignator(Record[Idx++]);
621  E->setInitializesStdInitializerList(Record[Idx++]);
622  unsigned NumInits = Record[Idx++];
623  E->reserveInits(Reader.getContext(), NumInits);
624  if (isArrayFiller) {
625    for (unsigned I = 0; I != NumInits; ++I) {
626      Expr *init = Reader.ReadSubExpr();
627      E->updateInit(Reader.getContext(), I, init ? init : filler);
628    }
629  } else {
630    for (unsigned I = 0; I != NumInits; ++I)
631      E->updateInit(Reader.getContext(), I, Reader.ReadSubExpr());
632  }
633}
634
635void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
636  typedef DesignatedInitExpr::Designator Designator;
637
638  VisitExpr(E);
639  unsigned NumSubExprs = Record[Idx++];
640  assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
641  for (unsigned I = 0; I != NumSubExprs; ++I)
642    E->setSubExpr(I, Reader.ReadSubExpr());
643  E->setEqualOrColonLoc(ReadSourceLocation(Record, Idx));
644  E->setGNUSyntax(Record[Idx++]);
645
646  SmallVector<Designator, 4> Designators;
647  while (Idx < Record.size()) {
648    switch ((DesignatorTypes)Record[Idx++]) {
649    case DESIG_FIELD_DECL: {
650      FieldDecl *Field = ReadDeclAs<FieldDecl>(Record, Idx);
651      SourceLocation DotLoc
652        = ReadSourceLocation(Record, Idx);
653      SourceLocation FieldLoc
654        = ReadSourceLocation(Record, Idx);
655      Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
656                                       FieldLoc));
657      Designators.back().setField(Field);
658      break;
659    }
660
661    case DESIG_FIELD_NAME: {
662      const IdentifierInfo *Name = Reader.GetIdentifierInfo(F, Record, Idx);
663      SourceLocation DotLoc
664        = ReadSourceLocation(Record, Idx);
665      SourceLocation FieldLoc
666        = ReadSourceLocation(Record, Idx);
667      Designators.push_back(Designator(Name, DotLoc, FieldLoc));
668      break;
669    }
670
671    case DESIG_ARRAY: {
672      unsigned Index = Record[Idx++];
673      SourceLocation LBracketLoc
674        = ReadSourceLocation(Record, Idx);
675      SourceLocation RBracketLoc
676        = ReadSourceLocation(Record, Idx);
677      Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
678      break;
679    }
680
681    case DESIG_ARRAY_RANGE: {
682      unsigned Index = Record[Idx++];
683      SourceLocation LBracketLoc
684        = ReadSourceLocation(Record, Idx);
685      SourceLocation EllipsisLoc
686        = ReadSourceLocation(Record, Idx);
687      SourceLocation RBracketLoc
688        = ReadSourceLocation(Record, Idx);
689      Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
690                                       RBracketLoc));
691      break;
692    }
693    }
694  }
695  E->setDesignators(Reader.getContext(),
696                    Designators.data(), Designators.size());
697}
698
699void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
700  VisitExpr(E);
701}
702
703void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {
704  VisitExpr(E);
705  E->setSubExpr(Reader.ReadSubExpr());
706  E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx));
707  E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
708  E->setRParenLoc(ReadSourceLocation(Record, Idx));
709}
710
711void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
712  VisitExpr(E);
713  E->setAmpAmpLoc(ReadSourceLocation(Record, Idx));
714  E->setLabelLoc(ReadSourceLocation(Record, Idx));
715  E->setLabel(ReadDeclAs<LabelDecl>(Record, Idx));
716}
717
718void ASTStmtReader::VisitStmtExpr(StmtExpr *E) {
719  VisitExpr(E);
720  E->setLParenLoc(ReadSourceLocation(Record, Idx));
721  E->setRParenLoc(ReadSourceLocation(Record, Idx));
722  E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt()));
723}
724
725void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {
726  VisitExpr(E);
727  E->setCond(Reader.ReadSubExpr());
728  E->setLHS(Reader.ReadSubExpr());
729  E->setRHS(Reader.ReadSubExpr());
730  E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
731  E->setRParenLoc(ReadSourceLocation(Record, Idx));
732}
733
734void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
735  VisitExpr(E);
736  E->setTokenLocation(ReadSourceLocation(Record, Idx));
737}
738
739void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
740  VisitExpr(E);
741  SmallVector<Expr *, 16> Exprs;
742  unsigned NumExprs = Record[Idx++];
743  while (NumExprs--)
744    Exprs.push_back(Reader.ReadSubExpr());
745  E->setExprs(Reader.getContext(), Exprs.data(), Exprs.size());
746  E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
747  E->setRParenLoc(ReadSourceLocation(Record, Idx));
748}
749
750void ASTStmtReader::VisitBlockExpr(BlockExpr *E) {
751  VisitExpr(E);
752  E->setBlockDecl(ReadDeclAs<BlockDecl>(Record, Idx));
753}
754
755void ASTStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
756  VisitExpr(E);
757  E->setDecl(ReadDeclAs<VarDecl>(Record, Idx));
758  E->setLocation(ReadSourceLocation(Record, Idx));
759  E->setByRef(Record[Idx++]);
760  E->setConstQualAdded(Record[Idx++]);
761}
762
763void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
764  VisitExpr(E);
765  E->NumAssocs = Record[Idx++];
766  E->AssocTypes = new (Reader.getContext()) TypeSourceInfo*[E->NumAssocs];
767  E->SubExprs =
768   new(Reader.getContext()) Stmt*[GenericSelectionExpr::END_EXPR+E->NumAssocs];
769
770  E->SubExprs[GenericSelectionExpr::CONTROLLING] = Reader.ReadSubExpr();
771  for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {
772    E->AssocTypes[I] = GetTypeSourceInfo(Record, Idx);
773    E->SubExprs[GenericSelectionExpr::END_EXPR+I] = Reader.ReadSubExpr();
774  }
775  E->ResultIndex = Record[Idx++];
776
777  E->GenericLoc = ReadSourceLocation(Record, Idx);
778  E->DefaultLoc = ReadSourceLocation(Record, Idx);
779  E->RParenLoc = ReadSourceLocation(Record, Idx);
780}
781
782void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
783  VisitExpr(E);
784  unsigned numSemanticExprs = Record[Idx++];
785  assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs);
786  E->PseudoObjectExprBits.ResultIndex = Record[Idx++];
787
788  // Read the syntactic expression.
789  E->getSubExprsBuffer()[0] = Reader.ReadSubExpr();
790
791  // Read all the semantic expressions.
792  for (unsigned i = 0; i != numSemanticExprs; ++i) {
793    Expr *subExpr = Reader.ReadSubExpr();
794    E->getSubExprsBuffer()[i+1] = subExpr;
795  }
796}
797
798void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) {
799  VisitExpr(E);
800  E->setOp(AtomicExpr::AtomicOp(Record[Idx++]));
801  E->setPtr(Reader.ReadSubExpr());
802  E->setOrder(Reader.ReadSubExpr());
803  E->setNumSubExprs(2);
804  if (E->getOp() != AtomicExpr::Load) {
805    E->setVal1(Reader.ReadSubExpr());
806    E->setNumSubExprs(3);
807  }
808  if (E->isCmpXChg()) {
809    E->setOrderFail(Reader.ReadSubExpr());
810    E->setVal2(Reader.ReadSubExpr());
811    E->setNumSubExprs(5);
812  }
813  E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
814  E->setRParenLoc(ReadSourceLocation(Record, Idx));
815}
816
817//===----------------------------------------------------------------------===//
818// Objective-C Expressions and Statements
819
820void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
821  VisitExpr(E);
822  E->setString(cast<StringLiteral>(Reader.ReadSubStmt()));
823  E->setAtLoc(ReadSourceLocation(Record, Idx));
824}
825
826void ASTStmtReader::VisitObjCNumericLiteral(ObjCNumericLiteral *E) {
827  VisitExpr(E);
828  // could be one of several IntegerLiteral, FloatLiteral, etc.
829  E->Number = Reader.ReadSubStmt();
830  E->ObjCNumericLiteralMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
831  E->AtLoc = ReadSourceLocation(Record, Idx);
832}
833
834void ASTStmtReader::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
835  VisitExpr(E);
836  unsigned NumElements = Record[Idx++];
837  assert(NumElements == E->getNumElements() && "Wrong number of elements");
838  Expr **Elements = E->getElements();
839  for (unsigned I = 0, N = NumElements; I != N; ++I)
840    Elements[I] = Reader.ReadSubExpr();
841  E->ArrayWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
842  E->Range = ReadSourceRange(Record, Idx);
843}
844
845void ASTStmtReader::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
846  VisitExpr(E);
847  unsigned NumElements = Record[Idx++];
848  assert(NumElements == E->getNumElements() && "Wrong number of elements");
849  bool HasPackExpansions = Record[Idx++];
850  assert(HasPackExpansions == E->HasPackExpansions &&"Pack expansion mismatch");
851  ObjCDictionaryLiteral::KeyValuePair *KeyValues = E->getKeyValues();
852  ObjCDictionaryLiteral::ExpansionData *Expansions = E->getExpansionData();
853  for (unsigned I = 0; I != NumElements; ++I) {
854    KeyValues[I].Key = Reader.ReadSubExpr();
855    KeyValues[I].Value = Reader.ReadSubExpr();
856    if (HasPackExpansions) {
857      Expansions[I].EllipsisLoc = ReadSourceLocation(Record, Idx);
858      Expansions[I].NumExpansionsPlusOne = Record[Idx++];
859    }
860  }
861  E->DictWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
862  E->Range = ReadSourceRange(Record, Idx);
863}
864
865void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
866  VisitExpr(E);
867  E->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
868  E->setAtLoc(ReadSourceLocation(Record, Idx));
869  E->setRParenLoc(ReadSourceLocation(Record, Idx));
870}
871
872void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
873  VisitExpr(E);
874  E->setSelector(Reader.ReadSelector(F, Record, Idx));
875  E->setAtLoc(ReadSourceLocation(Record, Idx));
876  E->setRParenLoc(ReadSourceLocation(Record, Idx));
877}
878
879void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
880  VisitExpr(E);
881  E->setProtocol(ReadDeclAs<ObjCProtocolDecl>(Record, Idx));
882  E->setAtLoc(ReadSourceLocation(Record, Idx));
883  E->setRParenLoc(ReadSourceLocation(Record, Idx));
884}
885
886void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
887  VisitExpr(E);
888  E->setDecl(ReadDeclAs<ObjCIvarDecl>(Record, Idx));
889  E->setLocation(ReadSourceLocation(Record, Idx));
890  E->setBase(Reader.ReadSubExpr());
891  E->setIsArrow(Record[Idx++]);
892  E->setIsFreeIvar(Record[Idx++]);
893}
894
895void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
896  VisitExpr(E);
897  bool Implicit = Record[Idx++] != 0;
898  if (Implicit) {
899    ObjCMethodDecl *Getter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
900    ObjCMethodDecl *Setter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
901    E->setImplicitProperty(Getter, Setter);
902  } else {
903    E->setExplicitProperty(ReadDeclAs<ObjCPropertyDecl>(Record, Idx));
904  }
905  E->setLocation(ReadSourceLocation(Record, Idx));
906  E->setReceiverLocation(ReadSourceLocation(Record, Idx));
907  switch (Record[Idx++]) {
908  case 0:
909    E->setBase(Reader.ReadSubExpr());
910    break;
911  case 1:
912    E->setSuperReceiver(Reader.readType(F, Record, Idx));
913    break;
914  case 2:
915    E->setClassReceiver(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx));
916    break;
917  }
918}
919
920void ASTStmtReader::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
921  VisitExpr(E);
922  E->setRBracket(ReadSourceLocation(Record, Idx));
923  E->setBaseExpr(Reader.ReadSubExpr());
924  E->setKeyExpr(Reader.ReadSubExpr());
925  E->GetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
926  E->SetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
927}
928
929void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
930  VisitExpr(E);
931  assert(Record[Idx] == E->getNumArgs());
932  ++Idx;
933  unsigned NumStoredSelLocs = Record[Idx++];
934  E->SelLocsKind = Record[Idx++];
935  E->setDelegateInitCall(Record[Idx++]);
936  E->IsImplicit = Record[Idx++];
937  ObjCMessageExpr::ReceiverKind Kind
938    = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
939  switch (Kind) {
940  case ObjCMessageExpr::Instance:
941    E->setInstanceReceiver(Reader.ReadSubExpr());
942    break;
943
944  case ObjCMessageExpr::Class:
945    E->setClassReceiver(GetTypeSourceInfo(Record, Idx));
946    break;
947
948  case ObjCMessageExpr::SuperClass:
949  case ObjCMessageExpr::SuperInstance: {
950    QualType T = Reader.readType(F, Record, Idx);
951    SourceLocation SuperLoc = ReadSourceLocation(Record, Idx);
952    E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
953    break;
954  }
955  }
956
957  assert(Kind == E->getReceiverKind());
958
959  if (Record[Idx++])
960    E->setMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx));
961  else
962    E->setSelector(Reader.ReadSelector(F, Record, Idx));
963
964  E->LBracLoc = ReadSourceLocation(Record, Idx);
965  E->RBracLoc = ReadSourceLocation(Record, Idx);
966
967  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
968    E->setArg(I, Reader.ReadSubExpr());
969
970  SourceLocation *Locs = E->getStoredSelLocs();
971  for (unsigned I = 0; I != NumStoredSelLocs; ++I)
972    Locs[I] = ReadSourceLocation(Record, Idx);
973}
974
975void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
976  VisitStmt(S);
977  S->setElement(Reader.ReadSubStmt());
978  S->setCollection(Reader.ReadSubExpr());
979  S->setBody(Reader.ReadSubStmt());
980  S->setForLoc(ReadSourceLocation(Record, Idx));
981  S->setRParenLoc(ReadSourceLocation(Record, Idx));
982}
983
984void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
985  VisitStmt(S);
986  S->setCatchBody(Reader.ReadSubStmt());
987  S->setCatchParamDecl(ReadDeclAs<VarDecl>(Record, Idx));
988  S->setAtCatchLoc(ReadSourceLocation(Record, Idx));
989  S->setRParenLoc(ReadSourceLocation(Record, Idx));
990}
991
992void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
993  VisitStmt(S);
994  S->setFinallyBody(Reader.ReadSubStmt());
995  S->setAtFinallyLoc(ReadSourceLocation(Record, Idx));
996}
997
998void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
999  VisitStmt(S);
1000  S->setSubStmt(Reader.ReadSubStmt());
1001  S->setAtLoc(ReadSourceLocation(Record, Idx));
1002}
1003
1004void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
1005  VisitStmt(S);
1006  assert(Record[Idx] == S->getNumCatchStmts());
1007  ++Idx;
1008  bool HasFinally = Record[Idx++];
1009  S->setTryBody(Reader.ReadSubStmt());
1010  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
1011    S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
1012
1013  if (HasFinally)
1014    S->setFinallyStmt(Reader.ReadSubStmt());
1015  S->setAtTryLoc(ReadSourceLocation(Record, Idx));
1016}
1017
1018void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
1019  VisitStmt(S);
1020  S->setSynchExpr(Reader.ReadSubStmt());
1021  S->setSynchBody(Reader.ReadSubStmt());
1022  S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx));
1023}
1024
1025void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
1026  VisitStmt(S);
1027  S->setThrowExpr(Reader.ReadSubStmt());
1028  S->setThrowLoc(ReadSourceLocation(Record, Idx));
1029}
1030
1031void ASTStmtReader::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
1032  VisitExpr(E);
1033  E->setValue(Record[Idx++]);
1034  E->setLocation(ReadSourceLocation(Record, Idx));
1035}
1036
1037//===----------------------------------------------------------------------===//
1038// C++ Expressions and Statements
1039//===----------------------------------------------------------------------===//
1040
1041void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
1042  VisitStmt(S);
1043  S->CatchLoc = ReadSourceLocation(Record, Idx);
1044  S->ExceptionDecl = ReadDeclAs<VarDecl>(Record, Idx);
1045  S->HandlerBlock = Reader.ReadSubStmt();
1046}
1047
1048void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
1049  VisitStmt(S);
1050  assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?");
1051  ++Idx;
1052  S->TryLoc = ReadSourceLocation(Record, Idx);
1053  S->getStmts()[0] = Reader.ReadSubStmt();
1054  for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
1055    S->getStmts()[i + 1] = Reader.ReadSubStmt();
1056}
1057
1058void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
1059  VisitStmt(S);
1060  S->setForLoc(ReadSourceLocation(Record, Idx));
1061  S->setColonLoc(ReadSourceLocation(Record, Idx));
1062  S->setRParenLoc(ReadSourceLocation(Record, Idx));
1063  S->setRangeStmt(Reader.ReadSubStmt());
1064  S->setBeginEndStmt(Reader.ReadSubStmt());
1065  S->setCond(Reader.ReadSubExpr());
1066  S->setInc(Reader.ReadSubExpr());
1067  S->setLoopVarStmt(Reader.ReadSubStmt());
1068  S->setBody(Reader.ReadSubStmt());
1069}
1070
1071void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
1072  VisitStmt(S);
1073  S->KeywordLoc = ReadSourceLocation(Record, Idx);
1074  S->IsIfExists = Record[Idx++];
1075  S->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1076  ReadDeclarationNameInfo(S->NameInfo, Record, Idx);
1077  S->SubStmt = Reader.ReadSubStmt();
1078}
1079
1080void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
1081  VisitCallExpr(E);
1082  E->setOperator((OverloadedOperatorKind)Record[Idx++]);
1083}
1084
1085void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
1086  VisitExpr(E);
1087  E->NumArgs = Record[Idx++];
1088  if (E->NumArgs)
1089    E->Args = new (Reader.getContext()) Stmt*[E->NumArgs];
1090  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1091    E->setArg(I, Reader.ReadSubExpr());
1092  E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx));
1093  E->setLocation(ReadSourceLocation(Record, Idx));
1094  E->setElidable(Record[Idx++]);
1095  E->setHadMultipleCandidates(Record[Idx++]);
1096  E->setRequiresZeroInitialization(Record[Idx++]);
1097  E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
1098  E->ParenRange = ReadSourceRange(Record, Idx);
1099}
1100
1101void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
1102  VisitCXXConstructExpr(E);
1103  E->Type = GetTypeSourceInfo(Record, Idx);
1104}
1105
1106void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) {
1107  VisitExpr(E);
1108  unsigned NumCaptures = Record[Idx++];
1109  assert(NumCaptures == E->NumCaptures);(void)NumCaptures;
1110  unsigned NumArrayIndexVars = Record[Idx++];
1111  E->IntroducerRange = ReadSourceRange(Record, Idx);
1112  E->CaptureDefault = static_cast<LambdaCaptureDefault>(Record[Idx++]);
1113  E->ExplicitParams = Record[Idx++];
1114  E->ExplicitResultType = Record[Idx++];
1115  E->ClosingBrace = ReadSourceLocation(Record, Idx);
1116
1117  // Read capture initializers.
1118  for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),
1119                                      CEnd = E->capture_init_end();
1120       C != CEnd; ++C)
1121    *C = Reader.ReadSubExpr();
1122
1123  // Read array capture index variables.
1124  if (NumArrayIndexVars > 0) {
1125    unsigned *ArrayIndexStarts = E->getArrayIndexStarts();
1126    for (unsigned I = 0; I != NumCaptures + 1; ++I)
1127      ArrayIndexStarts[I] = Record[Idx++];
1128
1129    VarDecl **ArrayIndexVars = E->getArrayIndexVars();
1130    for (unsigned I = 0; I != NumArrayIndexVars; ++I)
1131      ArrayIndexVars[I] = ReadDeclAs<VarDecl>(Record, Idx);
1132  }
1133}
1134
1135void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
1136  VisitExplicitCastExpr(E);
1137  SourceRange R = ReadSourceRange(Record, Idx);
1138  E->Loc = R.getBegin();
1139  E->RParenLoc = R.getEnd();
1140}
1141
1142void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1143  return VisitCXXNamedCastExpr(E);
1144}
1145
1146void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
1147  return VisitCXXNamedCastExpr(E);
1148}
1149
1150void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1151  return VisitCXXNamedCastExpr(E);
1152}
1153
1154void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1155  return VisitCXXNamedCastExpr(E);
1156}
1157
1158void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1159  VisitExplicitCastExpr(E);
1160  E->setTypeBeginLoc(ReadSourceLocation(Record, Idx));
1161  E->setRParenLoc(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_IF:
1643      S = new (Context) IfStmt(Empty);
1644      break;
1645
1646    case STMT_SWITCH:
1647      S = new (Context) SwitchStmt(Empty);
1648      break;
1649
1650    case STMT_WHILE:
1651      S = new (Context) WhileStmt(Empty);
1652      break;
1653
1654    case STMT_DO:
1655      S = new (Context) DoStmt(Empty);
1656      break;
1657
1658    case STMT_FOR:
1659      S = new (Context) ForStmt(Empty);
1660      break;
1661
1662    case STMT_GOTO:
1663      S = new (Context) GotoStmt(Empty);
1664      break;
1665
1666    case STMT_INDIRECT_GOTO:
1667      S = new (Context) IndirectGotoStmt(Empty);
1668      break;
1669
1670    case STMT_CONTINUE:
1671      S = new (Context) ContinueStmt(Empty);
1672      break;
1673
1674    case STMT_BREAK:
1675      S = new (Context) BreakStmt(Empty);
1676      break;
1677
1678    case STMT_RETURN:
1679      S = new (Context) ReturnStmt(Empty);
1680      break;
1681
1682    case STMT_DECL:
1683      S = new (Context) DeclStmt(Empty);
1684      break;
1685
1686    case STMT_ASM:
1687      S = new (Context) AsmStmt(Empty);
1688      break;
1689
1690    case EXPR_PREDEFINED:
1691      S = new (Context) PredefinedExpr(Empty);
1692      break;
1693
1694    case EXPR_DECL_REF:
1695      S = DeclRefExpr::CreateEmpty(
1696        Context,
1697        /*HasQualifier=*/Record[ASTStmtReader::NumExprFields],
1698        /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1],
1699        /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 2],
1700        /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ?
1701          Record[ASTStmtReader::NumExprFields + 4] : 0);
1702      break;
1703
1704    case EXPR_INTEGER_LITERAL:
1705      S = IntegerLiteral::Create(Context, Empty);
1706      break;
1707
1708    case EXPR_FLOATING_LITERAL:
1709      S = FloatingLiteral::Create(Context, Empty);
1710      break;
1711
1712    case EXPR_IMAGINARY_LITERAL:
1713      S = new (Context) ImaginaryLiteral(Empty);
1714      break;
1715
1716    case EXPR_STRING_LITERAL:
1717      S = StringLiteral::CreateEmpty(Context,
1718                                     Record[ASTStmtReader::NumExprFields + 1]);
1719      break;
1720
1721    case EXPR_CHARACTER_LITERAL:
1722      S = new (Context) CharacterLiteral(Empty);
1723      break;
1724
1725    case EXPR_PAREN:
1726      S = new (Context) ParenExpr(Empty);
1727      break;
1728
1729    case EXPR_PAREN_LIST:
1730      S = new (Context) ParenListExpr(Empty);
1731      break;
1732
1733    case EXPR_UNARY_OPERATOR:
1734      S = new (Context) UnaryOperator(Empty);
1735      break;
1736
1737    case EXPR_OFFSETOF:
1738      S = OffsetOfExpr::CreateEmpty(Context,
1739                                    Record[ASTStmtReader::NumExprFields],
1740                                    Record[ASTStmtReader::NumExprFields + 1]);
1741      break;
1742
1743    case EXPR_SIZEOF_ALIGN_OF:
1744      S = new (Context) UnaryExprOrTypeTraitExpr(Empty);
1745      break;
1746
1747    case EXPR_ARRAY_SUBSCRIPT:
1748      S = new (Context) ArraySubscriptExpr(Empty);
1749      break;
1750
1751    case EXPR_CALL:
1752      S = new (Context) CallExpr(Context, Stmt::CallExprClass, Empty);
1753      break;
1754
1755    case EXPR_MEMBER: {
1756      // We load everything here and fully initialize it at creation.
1757      // That way we can use MemberExpr::Create and don't have to duplicate its
1758      // logic with a MemberExpr::CreateEmpty.
1759
1760      assert(Idx == 0);
1761      NestedNameSpecifierLoc QualifierLoc;
1762      if (Record[Idx++]) { // HasQualifier.
1763        QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
1764      }
1765
1766      SourceLocation TemplateKWLoc;
1767      TemplateArgumentListInfo ArgInfo;
1768      bool HasTemplateKWAndArgsInfo = Record[Idx++];
1769      if (HasTemplateKWAndArgsInfo) {
1770        TemplateKWLoc = ReadSourceLocation(F, Record, Idx);
1771        unsigned NumTemplateArgs = Record[Idx++];
1772        ArgInfo.setLAngleLoc(ReadSourceLocation(F, Record, Idx));
1773        ArgInfo.setRAngleLoc(ReadSourceLocation(F, Record, Idx));
1774        for (unsigned i = 0; i != NumTemplateArgs; ++i)
1775          ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx));
1776      }
1777
1778      bool HadMultipleCandidates = Record[Idx++];
1779
1780      NamedDecl *FoundD = ReadDeclAs<NamedDecl>(F, Record, Idx);
1781      AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1782      DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
1783
1784      QualType T = readType(F, Record, Idx);
1785      ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]);
1786      ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]);
1787      Expr *Base = ReadSubExpr();
1788      ValueDecl *MemberD = ReadDeclAs<ValueDecl>(F, Record, Idx);
1789      SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx);
1790      DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);
1791      bool IsArrow = Record[Idx++];
1792
1793      S = MemberExpr::Create(Context, Base, IsArrow, QualifierLoc,
1794                             TemplateKWLoc, MemberD, FoundDecl, MemberNameInfo,
1795                             HasTemplateKWAndArgsInfo ? &ArgInfo : 0,
1796                             T, VK, OK);
1797      ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc,
1798                             MemberD->getDeclName(), Record, Idx);
1799      if (HadMultipleCandidates)
1800        cast<MemberExpr>(S)->setHadMultipleCandidates(true);
1801      break;
1802    }
1803
1804    case EXPR_BINARY_OPERATOR:
1805      S = new (Context) BinaryOperator(Empty);
1806      break;
1807
1808    case EXPR_COMPOUND_ASSIGN_OPERATOR:
1809      S = new (Context) CompoundAssignOperator(Empty);
1810      break;
1811
1812    case EXPR_CONDITIONAL_OPERATOR:
1813      S = new (Context) ConditionalOperator(Empty);
1814      break;
1815
1816    case EXPR_BINARY_CONDITIONAL_OPERATOR:
1817      S = new (Context) BinaryConditionalOperator(Empty);
1818      break;
1819
1820    case EXPR_IMPLICIT_CAST:
1821      S = ImplicitCastExpr::CreateEmpty(Context,
1822                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1823      break;
1824
1825    case EXPR_CSTYLE_CAST:
1826      S = CStyleCastExpr::CreateEmpty(Context,
1827                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1828      break;
1829
1830    case EXPR_COMPOUND_LITERAL:
1831      S = new (Context) CompoundLiteralExpr(Empty);
1832      break;
1833
1834    case EXPR_EXT_VECTOR_ELEMENT:
1835      S = new (Context) ExtVectorElementExpr(Empty);
1836      break;
1837
1838    case EXPR_INIT_LIST:
1839      S = new (Context) InitListExpr(getContext(), Empty);
1840      break;
1841
1842    case EXPR_DESIGNATED_INIT:
1843      S = DesignatedInitExpr::CreateEmpty(Context,
1844                                     Record[ASTStmtReader::NumExprFields] - 1);
1845
1846      break;
1847
1848    case EXPR_IMPLICIT_VALUE_INIT:
1849      S = new (Context) ImplicitValueInitExpr(Empty);
1850      break;
1851
1852    case EXPR_VA_ARG:
1853      S = new (Context) VAArgExpr(Empty);
1854      break;
1855
1856    case EXPR_ADDR_LABEL:
1857      S = new (Context) AddrLabelExpr(Empty);
1858      break;
1859
1860    case EXPR_STMT:
1861      S = new (Context) StmtExpr(Empty);
1862      break;
1863
1864    case EXPR_CHOOSE:
1865      S = new (Context) ChooseExpr(Empty);
1866      break;
1867
1868    case EXPR_GNU_NULL:
1869      S = new (Context) GNUNullExpr(Empty);
1870      break;
1871
1872    case EXPR_SHUFFLE_VECTOR:
1873      S = new (Context) ShuffleVectorExpr(Empty);
1874      break;
1875
1876    case EXPR_BLOCK:
1877      S = new (Context) BlockExpr(Empty);
1878      break;
1879
1880    case EXPR_BLOCK_DECL_REF:
1881      S = new (Context) BlockDeclRefExpr(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_NUMERIC_LITERAL:
1892      S = new (Context) ObjCNumericLiteral(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_CXX_BOOL_LITERAL:
2033      S = new (Context) CXXBoolLiteralExpr(Empty);
2034      break;
2035
2036    case EXPR_CXX_NULL_PTR_LITERAL:
2037      S = new (Context) CXXNullPtrLiteralExpr(Empty);
2038      break;
2039    case EXPR_CXX_TYPEID_EXPR:
2040      S = new (Context) CXXTypeidExpr(Empty, true);
2041      break;
2042    case EXPR_CXX_TYPEID_TYPE:
2043      S = new (Context) CXXTypeidExpr(Empty, false);
2044      break;
2045    case EXPR_CXX_UUIDOF_EXPR:
2046      S = new (Context) CXXUuidofExpr(Empty, true);
2047      break;
2048    case EXPR_CXX_UUIDOF_TYPE:
2049      S = new (Context) CXXUuidofExpr(Empty, false);
2050      break;
2051    case EXPR_CXX_THIS:
2052      S = new (Context) CXXThisExpr(Empty);
2053      break;
2054    case EXPR_CXX_THROW:
2055      S = new (Context) CXXThrowExpr(Empty);
2056      break;
2057    case EXPR_CXX_DEFAULT_ARG: {
2058      bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields];
2059      if (HasOtherExprStored) {
2060        Expr *SubExpr = ReadSubExpr();
2061        S = CXXDefaultArgExpr::Create(Context, SourceLocation(), 0, SubExpr);
2062      } else
2063        S = new (Context) CXXDefaultArgExpr(Empty);
2064      break;
2065    }
2066    case EXPR_CXX_BIND_TEMPORARY:
2067      S = new (Context) CXXBindTemporaryExpr(Empty);
2068      break;
2069
2070    case EXPR_CXX_SCALAR_VALUE_INIT:
2071      S = new (Context) CXXScalarValueInitExpr(Empty);
2072      break;
2073    case EXPR_CXX_NEW:
2074      S = new (Context) CXXNewExpr(Empty);
2075      break;
2076    case EXPR_CXX_DELETE:
2077      S = new (Context) CXXDeleteExpr(Empty);
2078      break;
2079    case EXPR_CXX_PSEUDO_DESTRUCTOR:
2080      S = new (Context) CXXPseudoDestructorExpr(Empty);
2081      break;
2082
2083    case EXPR_EXPR_WITH_CLEANUPS:
2084      S = ExprWithCleanups::Create(Context, Empty,
2085                                   Record[ASTStmtReader::NumExprFields]);
2086      break;
2087
2088    case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
2089      S = CXXDependentScopeMemberExpr::CreateEmpty(Context,
2090         /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
2091                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
2092                                   ? Record[ASTStmtReader::NumExprFields + 1]
2093                                   : 0);
2094      break;
2095
2096    case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
2097      S = DependentScopeDeclRefExpr::CreateEmpty(Context,
2098         /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
2099                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
2100                                   ? Record[ASTStmtReader::NumExprFields + 1]
2101                                   : 0);
2102      break;
2103
2104    case EXPR_CXX_UNRESOLVED_CONSTRUCT:
2105      S = CXXUnresolvedConstructExpr::CreateEmpty(Context,
2106                              /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
2107      break;
2108
2109    case EXPR_CXX_UNRESOLVED_MEMBER:
2110      S = UnresolvedMemberExpr::CreateEmpty(Context,
2111         /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
2112                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
2113                                   ? Record[ASTStmtReader::NumExprFields + 1]
2114                                   : 0);
2115      break;
2116
2117    case EXPR_CXX_UNRESOLVED_LOOKUP:
2118      S = UnresolvedLookupExpr::CreateEmpty(Context,
2119         /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
2120                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
2121                                   ? Record[ASTStmtReader::NumExprFields + 1]
2122                                   : 0);
2123      break;
2124
2125    case EXPR_CXX_UNARY_TYPE_TRAIT:
2126      S = new (Context) UnaryTypeTraitExpr(Empty);
2127      break;
2128
2129    case EXPR_BINARY_TYPE_TRAIT:
2130      S = new (Context) BinaryTypeTraitExpr(Empty);
2131      break;
2132
2133    case EXPR_TYPE_TRAIT:
2134      S = TypeTraitExpr::CreateDeserialized(Context,
2135            Record[ASTStmtReader::NumExprFields]);
2136      break;
2137
2138    case EXPR_ARRAY_TYPE_TRAIT:
2139      S = new (Context) ArrayTypeTraitExpr(Empty);
2140      break;
2141
2142    case EXPR_CXX_EXPRESSION_TRAIT:
2143      S = new (Context) ExpressionTraitExpr(Empty);
2144      break;
2145
2146    case EXPR_CXX_NOEXCEPT:
2147      S = new (Context) CXXNoexceptExpr(Empty);
2148      break;
2149
2150    case EXPR_PACK_EXPANSION:
2151      S = new (Context) PackExpansionExpr(Empty);
2152      break;
2153
2154    case EXPR_SIZEOF_PACK:
2155      S = new (Context) SizeOfPackExpr(Empty);
2156      break;
2157
2158    case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:
2159      S = new (Context) SubstNonTypeTemplateParmExpr(Empty);
2160      break;
2161
2162    case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:
2163      S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);
2164      break;
2165
2166    case EXPR_MATERIALIZE_TEMPORARY:
2167      S = new (Context) MaterializeTemporaryExpr(Empty);
2168      break;
2169
2170    case EXPR_OPAQUE_VALUE:
2171      S = new (Context) OpaqueValueExpr(Empty);
2172      break;
2173
2174    case EXPR_CUDA_KERNEL_CALL:
2175      S = new (Context) CUDAKernelCallExpr(Context, Empty);
2176      break;
2177
2178    case EXPR_ASTYPE:
2179      S = new (Context) AsTypeExpr(Empty);
2180      break;
2181
2182    case EXPR_PSEUDO_OBJECT: {
2183      unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields];
2184      S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs);
2185      break;
2186    }
2187
2188    case EXPR_ATOMIC:
2189      S = new (Context) AtomicExpr(Empty);
2190      break;
2191
2192    case EXPR_LAMBDA: {
2193      unsigned NumCaptures = Record[ASTStmtReader::NumExprFields];
2194      unsigned NumArrayIndexVars = Record[ASTStmtReader::NumExprFields + 1];
2195      S = LambdaExpr::CreateDeserialized(Context, NumCaptures,
2196                                         NumArrayIndexVars);
2197      break;
2198    }
2199    }
2200
2201    // We hit a STMT_STOP, so we're done with this expression.
2202    if (Finished)
2203      break;
2204
2205    ++NumStatementsRead;
2206
2207    if (S && !IsStmtReference) {
2208      Reader.Visit(S);
2209      StmtEntries[Cursor.GetCurrentBitNo()] = S;
2210    }
2211
2212
2213    assert(Idx == Record.size() && "Invalid deserialization of statement");
2214    StmtStack.push_back(S);
2215  }
2216
2217#ifndef NDEBUG
2218  assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
2219  assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
2220#endif
2221
2222  return StmtStack.pop_back_val();
2223}
2224