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"
20 using namespace clang;
21 using namespace clang::serialization;
22 
23 namespace 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 
97 void ASTStmtReader::
98 ReadTemplateKWAndArgsInfo(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 
110 void ASTStmtReader::VisitStmt(Stmt *S) {
111   assert(Idx == NumStmtFields && "Incorrect statement field count");
112 }
113 
114 void ASTStmtReader::VisitNullStmt(NullStmt *S) {
115   VisitStmt(S);
116   S->setSemiLoc(ReadSourceLocation(Record, Idx));
117   S->HasLeadingEmptyMacro = Record[Idx++];
118 }
119 
120 void 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 
131 void ASTStmtReader::VisitSwitchCase(SwitchCase *S) {
132   VisitStmt(S);
133   Reader.RecordSwitchCaseID(S, Record[Idx++]);
134 }
135 
136 void 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 
146 void 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 
153 void 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 
162 void 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 
173 void 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 
195 void 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 
205 void 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 
214 void 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 
227 void 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 
234 void 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 
241 void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {
242   VisitStmt(S);
243   S->setContinueLoc(ReadSourceLocation(Record, Idx));
244 }
245 
246 void ASTStmtReader::VisitBreakStmt(BreakStmt *S) {
247   VisitStmt(S);
248   S->setBreakLoc(ReadSourceLocation(Record, Idx));
249 }
250 
251 void 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 
258 void 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 
277 void 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 
311 void 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 
323 void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {
324   VisitExpr(E);
325   E->setLocation(ReadSourceLocation(Record, Idx));
326   E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]);
327 }
328 
329 void 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 
356 void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
357   VisitExpr(E);
358   E->setLocation(ReadSourceLocation(Record, Idx));
359   E->setValue(Reader.getContext(), Reader.ReadAPInt(Record, Idx));
360 }
361 
362 void 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 
369 void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
370   VisitExpr(E);
371   E->setSubExpr(Reader.ReadSubExpr());
372 }
373 
374 void 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 
394 void 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 
401 void 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 
408 void 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 
419 void 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 
426 void 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 
469 void 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 
482 void 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 
489 void 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 
498 void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
499   VisitCallExpr(E);
500 }
501 
502 void 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 
508 void 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 
515 void ASTStmtReader::
516 VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
517   VisitExpr(E);
518   E->Operand = Reader.ReadSubExpr();
519   E->setShouldCopy(Record[Idx++]);
520 }
521 
522 void 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 
529 void 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 
543 void 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 
551 void 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 
557 void 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 
566 void
567 ASTStmtReader::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 
578 void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
579   VisitCastExpr(E);
580 }
581 
582 void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
583   VisitCastExpr(E);
584   E->setTypeInfoAsWritten(GetTypeSourceInfo(Record, Idx));
585 }
586 
587 void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
588   VisitExplicitCastExpr(E);
589   E->setLParenLoc(ReadSourceLocation(Record, Idx));
590   E->setRParenLoc(ReadSourceLocation(Record, Idx));
591 }
592 
593 void 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 
601 void 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 
608 void 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   unsigned NumInits = Record[Idx++];
622   E->reserveInits(Reader.getContext(), NumInits);
623   if (isArrayFiller) {
624     for (unsigned I = 0; I != NumInits; ++I) {
625       Expr *init = Reader.ReadSubExpr();
626       E->updateInit(Reader.getContext(), I, init ? init : filler);
627     }
628   } else {
629     for (unsigned I = 0; I != NumInits; ++I)
630       E->updateInit(Reader.getContext(), I, Reader.ReadSubExpr());
631   }
632 }
633 
634 void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
635   typedef DesignatedInitExpr::Designator Designator;
636 
637   VisitExpr(E);
638   unsigned NumSubExprs = Record[Idx++];
639   assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
640   for (unsigned I = 0; I != NumSubExprs; ++I)
641     E->setSubExpr(I, Reader.ReadSubExpr());
642   E->setEqualOrColonLoc(ReadSourceLocation(Record, Idx));
643   E->setGNUSyntax(Record[Idx++]);
644 
645   SmallVector<Designator, 4> Designators;
646   while (Idx < Record.size()) {
647     switch ((DesignatorTypes)Record[Idx++]) {
648     case DESIG_FIELD_DECL: {
649       FieldDecl *Field = ReadDeclAs<FieldDecl>(Record, Idx);
650       SourceLocation DotLoc
651         = ReadSourceLocation(Record, Idx);
652       SourceLocation FieldLoc
653         = ReadSourceLocation(Record, Idx);
654       Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
655                                        FieldLoc));
656       Designators.back().setField(Field);
657       break;
658     }
659 
660     case DESIG_FIELD_NAME: {
661       const IdentifierInfo *Name = Reader.GetIdentifierInfo(F, Record, Idx);
662       SourceLocation DotLoc
663         = ReadSourceLocation(Record, Idx);
664       SourceLocation FieldLoc
665         = ReadSourceLocation(Record, Idx);
666       Designators.push_back(Designator(Name, DotLoc, FieldLoc));
667       break;
668     }
669 
670     case DESIG_ARRAY: {
671       unsigned Index = Record[Idx++];
672       SourceLocation LBracketLoc
673         = ReadSourceLocation(Record, Idx);
674       SourceLocation RBracketLoc
675         = ReadSourceLocation(Record, Idx);
676       Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
677       break;
678     }
679 
680     case DESIG_ARRAY_RANGE: {
681       unsigned Index = Record[Idx++];
682       SourceLocation LBracketLoc
683         = ReadSourceLocation(Record, Idx);
684       SourceLocation EllipsisLoc
685         = ReadSourceLocation(Record, Idx);
686       SourceLocation RBracketLoc
687         = ReadSourceLocation(Record, Idx);
688       Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
689                                        RBracketLoc));
690       break;
691     }
692     }
693   }
694   E->setDesignators(Reader.getContext(),
695                     Designators.data(), Designators.size());
696 }
697 
698 void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
699   VisitExpr(E);
700 }
701 
702 void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {
703   VisitExpr(E);
704   E->setSubExpr(Reader.ReadSubExpr());
705   E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx));
706   E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
707   E->setRParenLoc(ReadSourceLocation(Record, Idx));
708 }
709 
710 void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
711   VisitExpr(E);
712   E->setAmpAmpLoc(ReadSourceLocation(Record, Idx));
713   E->setLabelLoc(ReadSourceLocation(Record, Idx));
714   E->setLabel(ReadDeclAs<LabelDecl>(Record, Idx));
715 }
716 
717 void ASTStmtReader::VisitStmtExpr(StmtExpr *E) {
718   VisitExpr(E);
719   E->setLParenLoc(ReadSourceLocation(Record, Idx));
720   E->setRParenLoc(ReadSourceLocation(Record, Idx));
721   E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt()));
722 }
723 
724 void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {
725   VisitExpr(E);
726   E->setCond(Reader.ReadSubExpr());
727   E->setLHS(Reader.ReadSubExpr());
728   E->setRHS(Reader.ReadSubExpr());
729   E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
730   E->setRParenLoc(ReadSourceLocation(Record, Idx));
731 }
732 
733 void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
734   VisitExpr(E);
735   E->setTokenLocation(ReadSourceLocation(Record, Idx));
736 }
737 
738 void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
739   VisitExpr(E);
740   SmallVector<Expr *, 16> Exprs;
741   unsigned NumExprs = Record[Idx++];
742   while (NumExprs--)
743     Exprs.push_back(Reader.ReadSubExpr());
744   E->setExprs(Reader.getContext(), Exprs.data(), Exprs.size());
745   E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
746   E->setRParenLoc(ReadSourceLocation(Record, Idx));
747 }
748 
749 void ASTStmtReader::VisitBlockExpr(BlockExpr *E) {
750   VisitExpr(E);
751   E->setBlockDecl(ReadDeclAs<BlockDecl>(Record, Idx));
752 }
753 
754 void ASTStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
755   VisitExpr(E);
756   E->setDecl(ReadDeclAs<VarDecl>(Record, Idx));
757   E->setLocation(ReadSourceLocation(Record, Idx));
758   E->setByRef(Record[Idx++]);
759   E->setConstQualAdded(Record[Idx++]);
760 }
761 
762 void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
763   VisitExpr(E);
764   E->NumAssocs = Record[Idx++];
765   E->AssocTypes = new (Reader.getContext()) TypeSourceInfo*[E->NumAssocs];
766   E->SubExprs =
767    new(Reader.getContext()) Stmt*[GenericSelectionExpr::END_EXPR+E->NumAssocs];
768 
769   E->SubExprs[GenericSelectionExpr::CONTROLLING] = Reader.ReadSubExpr();
770   for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {
771     E->AssocTypes[I] = GetTypeSourceInfo(Record, Idx);
772     E->SubExprs[GenericSelectionExpr::END_EXPR+I] = Reader.ReadSubExpr();
773   }
774   E->ResultIndex = Record[Idx++];
775 
776   E->GenericLoc = ReadSourceLocation(Record, Idx);
777   E->DefaultLoc = ReadSourceLocation(Record, Idx);
778   E->RParenLoc = ReadSourceLocation(Record, Idx);
779 }
780 
781 void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
782   VisitExpr(E);
783   unsigned numSemanticExprs = Record[Idx++];
784   assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs);
785   E->PseudoObjectExprBits.ResultIndex = Record[Idx++];
786 
787   // Read the syntactic expression.
788   E->getSubExprsBuffer()[0] = Reader.ReadSubExpr();
789 
790   // Read all the semantic expressions.
791   for (unsigned i = 0; i != numSemanticExprs; ++i) {
792     Expr *subExpr = Reader.ReadSubExpr();
793     E->getSubExprsBuffer()[i+1] = subExpr;
794   }
795 }
796 
797 void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) {
798   VisitExpr(E);
799   E->setOp(AtomicExpr::AtomicOp(Record[Idx++]));
800   E->setPtr(Reader.ReadSubExpr());
801   E->setOrder(Reader.ReadSubExpr());
802   E->setNumSubExprs(2);
803   if (E->getOp() != AtomicExpr::Load) {
804     E->setVal1(Reader.ReadSubExpr());
805     E->setNumSubExprs(3);
806   }
807   if (E->isCmpXChg()) {
808     E->setOrderFail(Reader.ReadSubExpr());
809     E->setVal2(Reader.ReadSubExpr());
810     E->setNumSubExprs(5);
811   }
812   E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
813   E->setRParenLoc(ReadSourceLocation(Record, Idx));
814 }
815 
816 //===----------------------------------------------------------------------===//
817 // Objective-C Expressions and Statements
818 
819 void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
820   VisitExpr(E);
821   E->setString(cast<StringLiteral>(Reader.ReadSubStmt()));
822   E->setAtLoc(ReadSourceLocation(Record, Idx));
823 }
824 
825 void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
826   VisitExpr(E);
827   E->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
828   E->setAtLoc(ReadSourceLocation(Record, Idx));
829   E->setRParenLoc(ReadSourceLocation(Record, Idx));
830 }
831 
832 void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
833   VisitExpr(E);
834   E->setSelector(Reader.ReadSelector(F, Record, Idx));
835   E->setAtLoc(ReadSourceLocation(Record, Idx));
836   E->setRParenLoc(ReadSourceLocation(Record, Idx));
837 }
838 
839 void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
840   VisitExpr(E);
841   E->setProtocol(ReadDeclAs<ObjCProtocolDecl>(Record, Idx));
842   E->setAtLoc(ReadSourceLocation(Record, Idx));
843   E->setRParenLoc(ReadSourceLocation(Record, Idx));
844 }
845 
846 void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
847   VisitExpr(E);
848   E->setDecl(ReadDeclAs<ObjCIvarDecl>(Record, Idx));
849   E->setLocation(ReadSourceLocation(Record, Idx));
850   E->setBase(Reader.ReadSubExpr());
851   E->setIsArrow(Record[Idx++]);
852   E->setIsFreeIvar(Record[Idx++]);
853 }
854 
855 void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
856   VisitExpr(E);
857   bool Implicit = Record[Idx++] != 0;
858   if (Implicit) {
859     ObjCMethodDecl *Getter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
860     ObjCMethodDecl *Setter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
861     E->setImplicitProperty(Getter, Setter);
862   } else {
863     E->setExplicitProperty(ReadDeclAs<ObjCPropertyDecl>(Record, Idx));
864   }
865   E->setLocation(ReadSourceLocation(Record, Idx));
866   E->setReceiverLocation(ReadSourceLocation(Record, Idx));
867   switch (Record[Idx++]) {
868   case 0:
869     E->setBase(Reader.ReadSubExpr());
870     break;
871   case 1:
872     E->setSuperReceiver(Reader.readType(F, Record, Idx));
873     break;
874   case 2:
875     E->setClassReceiver(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx));
876     break;
877   }
878 }
879 
880 void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
881   VisitExpr(E);
882   assert(Record[Idx] == E->getNumArgs());
883   ++Idx;
884   unsigned NumStoredSelLocs = Record[Idx++];
885   E->SelLocsKind = Record[Idx++];
886   E->setDelegateInitCall(Record[Idx++]);
887   E->IsImplicit = Record[Idx++];
888   ObjCMessageExpr::ReceiverKind Kind
889     = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
890   switch (Kind) {
891   case ObjCMessageExpr::Instance:
892     E->setInstanceReceiver(Reader.ReadSubExpr());
893     break;
894 
895   case ObjCMessageExpr::Class:
896     E->setClassReceiver(GetTypeSourceInfo(Record, Idx));
897     break;
898 
899   case ObjCMessageExpr::SuperClass:
900   case ObjCMessageExpr::SuperInstance: {
901     QualType T = Reader.readType(F, Record, Idx);
902     SourceLocation SuperLoc = ReadSourceLocation(Record, Idx);
903     E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
904     break;
905   }
906   }
907 
908   assert(Kind == E->getReceiverKind());
909 
910   if (Record[Idx++])
911     E->setMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx));
912   else
913     E->setSelector(Reader.ReadSelector(F, Record, Idx));
914 
915   E->LBracLoc = ReadSourceLocation(Record, Idx);
916   E->RBracLoc = ReadSourceLocation(Record, Idx);
917 
918   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
919     E->setArg(I, Reader.ReadSubExpr());
920 
921   SourceLocation *Locs = E->getStoredSelLocs();
922   for (unsigned I = 0; I != NumStoredSelLocs; ++I)
923     Locs[I] = ReadSourceLocation(Record, Idx);
924 }
925 
926 void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
927   VisitStmt(S);
928   S->setElement(Reader.ReadSubStmt());
929   S->setCollection(Reader.ReadSubExpr());
930   S->setBody(Reader.ReadSubStmt());
931   S->setForLoc(ReadSourceLocation(Record, Idx));
932   S->setRParenLoc(ReadSourceLocation(Record, Idx));
933 }
934 
935 void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
936   VisitStmt(S);
937   S->setCatchBody(Reader.ReadSubStmt());
938   S->setCatchParamDecl(ReadDeclAs<VarDecl>(Record, Idx));
939   S->setAtCatchLoc(ReadSourceLocation(Record, Idx));
940   S->setRParenLoc(ReadSourceLocation(Record, Idx));
941 }
942 
943 void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
944   VisitStmt(S);
945   S->setFinallyBody(Reader.ReadSubStmt());
946   S->setAtFinallyLoc(ReadSourceLocation(Record, Idx));
947 }
948 
949 void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
950   VisitStmt(S);
951   S->setSubStmt(Reader.ReadSubStmt());
952   S->setAtLoc(ReadSourceLocation(Record, Idx));
953 }
954 
955 void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
956   VisitStmt(S);
957   assert(Record[Idx] == S->getNumCatchStmts());
958   ++Idx;
959   bool HasFinally = Record[Idx++];
960   S->setTryBody(Reader.ReadSubStmt());
961   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
962     S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
963 
964   if (HasFinally)
965     S->setFinallyStmt(Reader.ReadSubStmt());
966   S->setAtTryLoc(ReadSourceLocation(Record, Idx));
967 }
968 
969 void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
970   VisitStmt(S);
971   S->setSynchExpr(Reader.ReadSubStmt());
972   S->setSynchBody(Reader.ReadSubStmt());
973   S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx));
974 }
975 
976 void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
977   VisitStmt(S);
978   S->setThrowExpr(Reader.ReadSubStmt());
979   S->setThrowLoc(ReadSourceLocation(Record, Idx));
980 }
981 
982 //===----------------------------------------------------------------------===//
983 // C++ Expressions and Statements
984 //===----------------------------------------------------------------------===//
985 
986 void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
987   VisitStmt(S);
988   S->CatchLoc = ReadSourceLocation(Record, Idx);
989   S->ExceptionDecl = ReadDeclAs<VarDecl>(Record, Idx);
990   S->HandlerBlock = Reader.ReadSubStmt();
991 }
992 
993 void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
994   VisitStmt(S);
995   assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?");
996   ++Idx;
997   S->TryLoc = ReadSourceLocation(Record, Idx);
998   S->getStmts()[0] = Reader.ReadSubStmt();
999   for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
1000     S->getStmts()[i + 1] = Reader.ReadSubStmt();
1001 }
1002 
1003 void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
1004   VisitStmt(S);
1005   S->setForLoc(ReadSourceLocation(Record, Idx));
1006   S->setColonLoc(ReadSourceLocation(Record, Idx));
1007   S->setRParenLoc(ReadSourceLocation(Record, Idx));
1008   S->setRangeStmt(Reader.ReadSubStmt());
1009   S->setBeginEndStmt(Reader.ReadSubStmt());
1010   S->setCond(Reader.ReadSubExpr());
1011   S->setInc(Reader.ReadSubExpr());
1012   S->setLoopVarStmt(Reader.ReadSubStmt());
1013   S->setBody(Reader.ReadSubStmt());
1014 }
1015 
1016 void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
1017   VisitStmt(S);
1018   S->KeywordLoc = ReadSourceLocation(Record, Idx);
1019   S->IsIfExists = Record[Idx++];
1020   S->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1021   ReadDeclarationNameInfo(S->NameInfo, Record, Idx);
1022   S->SubStmt = Reader.ReadSubStmt();
1023 }
1024 
1025 void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
1026   VisitCallExpr(E);
1027   E->setOperator((OverloadedOperatorKind)Record[Idx++]);
1028 }
1029 
1030 void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
1031   VisitExpr(E);
1032   E->NumArgs = Record[Idx++];
1033   if (E->NumArgs)
1034     E->Args = new (Reader.getContext()) Stmt*[E->NumArgs];
1035   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1036     E->setArg(I, Reader.ReadSubExpr());
1037   E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx));
1038   E->setLocation(ReadSourceLocation(Record, Idx));
1039   E->setElidable(Record[Idx++]);
1040   E->setHadMultipleCandidates(Record[Idx++]);
1041   E->setRequiresZeroInitialization(Record[Idx++]);
1042   E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
1043   E->ParenRange = ReadSourceRange(Record, Idx);
1044 }
1045 
1046 void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
1047   VisitCXXConstructExpr(E);
1048   E->Type = GetTypeSourceInfo(Record, Idx);
1049 }
1050 
1051 void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) {
1052   VisitExpr(E);
1053   unsigned NumCaptures = Record[Idx++];
1054   assert(NumCaptures == E->NumCaptures);(void)NumCaptures;
1055   unsigned NumArrayIndexVars = Record[Idx++];
1056   E->IntroducerRange = ReadSourceRange(Record, Idx);
1057   E->CaptureDefault = static_cast<LambdaCaptureDefault>(Record[Idx++]);
1058   E->ExplicitParams = Record[Idx++];
1059   E->ExplicitResultType = Record[Idx++];
1060   E->ClosingBrace = ReadSourceLocation(Record, Idx);
1061 
1062   // Read capture initializers.
1063   for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),
1064                                       CEnd = E->capture_init_end();
1065        C != CEnd; ++C)
1066     *C = Reader.ReadSubExpr();
1067 
1068   // Read array capture index variables.
1069   if (NumArrayIndexVars > 0) {
1070     unsigned *ArrayIndexStarts = E->getArrayIndexStarts();
1071     for (unsigned I = 0; I != NumCaptures + 1; ++I)
1072       ArrayIndexStarts[I] = Record[Idx++];
1073 
1074     VarDecl **ArrayIndexVars = E->getArrayIndexVars();
1075     for (unsigned I = 0; I != NumArrayIndexVars; ++I)
1076       ArrayIndexVars[I] = ReadDeclAs<VarDecl>(Record, Idx);
1077   }
1078 }
1079 
1080 void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
1081   VisitExplicitCastExpr(E);
1082   SourceRange R = ReadSourceRange(Record, Idx);
1083   E->Loc = R.getBegin();
1084   E->RParenLoc = R.getEnd();
1085 }
1086 
1087 void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1088   return VisitCXXNamedCastExpr(E);
1089 }
1090 
1091 void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
1092   return VisitCXXNamedCastExpr(E);
1093 }
1094 
1095 void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1096   return VisitCXXNamedCastExpr(E);
1097 }
1098 
1099 void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1100   return VisitCXXNamedCastExpr(E);
1101 }
1102 
1103 void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1104   VisitExplicitCastExpr(E);
1105   E->setTypeBeginLoc(ReadSourceLocation(Record, Idx));
1106   E->setRParenLoc(ReadSourceLocation(Record, Idx));
1107 }
1108 
1109 void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1110   VisitExpr(E);
1111   E->setValue(Record[Idx++]);
1112   E->setLocation(ReadSourceLocation(Record, Idx));
1113 }
1114 
1115 void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1116   VisitExpr(E);
1117   E->setLocation(ReadSourceLocation(Record, Idx));
1118 }
1119 
1120 void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1121   VisitExpr(E);
1122   E->setSourceRange(ReadSourceRange(Record, Idx));
1123   if (E->isTypeOperand()) { // typeid(int)
1124     E->setTypeOperandSourceInfo(
1125         GetTypeSourceInfo(Record, Idx));
1126     return;
1127   }
1128 
1129   // typeid(42+2)
1130   E->setExprOperand(Reader.ReadSubExpr());
1131 }
1132 
1133 void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
1134   VisitExpr(E);
1135   E->setLocation(ReadSourceLocation(Record, Idx));
1136   E->setImplicit(Record[Idx++]);
1137 }
1138 
1139 void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
1140   VisitExpr(E);
1141   E->ThrowLoc = ReadSourceLocation(Record, Idx);
1142   E->Op = Reader.ReadSubExpr();
1143   E->IsThrownVariableInScope = Record[Idx++];
1144 }
1145 
1146 void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1147   VisitExpr(E);
1148 
1149   assert((bool)Record[Idx] == E->Param.getInt() && "We messed up at creation ?");
1150   ++Idx; // HasOtherExprStored and SubExpr was handled during creation.
1151   E->Param.setPointer(ReadDeclAs<ParmVarDecl>(Record, Idx));
1152   E->Loc = ReadSourceLocation(Record, Idx);
1153 }
1154 
1155 void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1156   VisitExpr(E);
1157   E->setTemporary(Reader.ReadCXXTemporary(F, Record, Idx));
1158   E->setSubExpr(Reader.ReadSubExpr());
1159 }
1160 
1161 void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
1162   VisitExpr(E);
1163   E->TypeInfo = GetTypeSourceInfo(Record, Idx);
1164   E->RParenLoc = ReadSourceLocation(Record, Idx);
1165 }
1166 
1167 void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
1168   VisitExpr(E);
1169   E->GlobalNew = Record[Idx++];
1170   bool isArray = Record[Idx++];
1171   E->UsualArrayDeleteWantsSize = Record[Idx++];
1172   unsigned NumPlacementArgs = Record[Idx++];
1173   E->StoredInitializationStyle = Record[Idx++];
1174   E->setOperatorNew(ReadDeclAs<FunctionDecl>(Record, Idx));
1175   E->setOperatorDelete(ReadDeclAs<FunctionDecl>(Record, Idx));
1176   E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx);
1177   E->TypeIdParens = ReadSourceRange(Record, Idx);
1178   E->StartLoc = ReadSourceLocation(Record, Idx);
1179   E->DirectInitRange = ReadSourceRange(Record, Idx);
1180 
1181   E->AllocateArgsArray(Reader.getContext(), isArray, NumPlacementArgs,
1182                        E->StoredInitializationStyle != 0);
1183 
1184   // Install all the subexpressions.
1185   for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
1186        I != e; ++I)
1187     *I = Reader.ReadSubStmt();
1188 }
1189 
1190 void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1191   VisitExpr(E);
1192   E->GlobalDelete = Record[Idx++];
1193   E->ArrayForm = Record[Idx++];
1194   E->ArrayFormAsWritten = Record[Idx++];
1195   E->UsualArrayDeleteWantsSize = Record[Idx++];
1196   E->OperatorDelete = ReadDeclAs<FunctionDecl>(Record, Idx);
1197   E->Argument = Reader.ReadSubExpr();
1198   E->Loc = ReadSourceLocation(Record, Idx);
1199 }
1200 
1201 void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1202   VisitExpr(E);
1203 
1204   E->Base = Reader.ReadSubExpr();
1205   E->IsArrow = Record[Idx++];
1206   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1207   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1208   E->ScopeType = GetTypeSourceInfo(Record, Idx);
1209   E->ColonColonLoc = ReadSourceLocation(Record, Idx);
1210   E->TildeLoc = ReadSourceLocation(Record, Idx);
1211 
1212   IdentifierInfo *II = Reader.GetIdentifierInfo(F, Record, Idx);
1213   if (II)
1214     E->setDestroyedType(II, ReadSourceLocation(Record, Idx));
1215   else
1216     E->setDestroyedType(GetTypeSourceInfo(Record, Idx));
1217 }
1218 
1219 void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) {
1220   VisitExpr(E);
1221 
1222   unsigned NumObjects = Record[Idx++];
1223   assert(NumObjects == E->getNumObjects());
1224   for (unsigned i = 0; i != NumObjects; ++i)
1225     E->getObjectsBuffer()[i] = ReadDeclAs<BlockDecl>(Record, Idx);
1226 
1227   E->SubExpr = Reader.ReadSubExpr();
1228 }
1229 
1230 void
1231 ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
1232   VisitExpr(E);
1233 
1234   if (Record[Idx++]) // HasTemplateKWAndArgsInfo
1235     ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(),
1236                               /*NumTemplateArgs=*/Record[Idx++]);
1237 
1238   E->Base = Reader.ReadSubExpr();
1239   E->BaseType = Reader.readType(F, Record, Idx);
1240   E->IsArrow = Record[Idx++];
1241   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1242   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1243   E->FirstQualifierFoundInScope = ReadDeclAs<NamedDecl>(Record, Idx);
1244   ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx);
1245 }
1246 
1247 void
1248 ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
1249   VisitExpr(E);
1250 
1251   if (Record[Idx++]) // HasTemplateKWAndArgsInfo
1252     ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(),
1253                               /*NumTemplateArgs=*/Record[Idx++]);
1254 
1255   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1256   ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
1257 }
1258 
1259 void
1260 ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1261   VisitExpr(E);
1262   assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
1263   ++Idx; // NumArgs;
1264   for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
1265     E->setArg(I, Reader.ReadSubExpr());
1266   E->Type = GetTypeSourceInfo(Record, Idx);
1267   E->setLParenLoc(ReadSourceLocation(Record, Idx));
1268   E->setRParenLoc(ReadSourceLocation(Record, Idx));
1269 }
1270 
1271 void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
1272   VisitExpr(E);
1273 
1274   if (Record[Idx++]) // HasTemplateKWAndArgsInfo
1275     ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(),
1276                               /*NumTemplateArgs=*/Record[Idx++]);
1277 
1278   unsigned NumDecls = Record[Idx++];
1279   UnresolvedSet<8> Decls;
1280   for (unsigned i = 0; i != NumDecls; ++i) {
1281     NamedDecl *D = ReadDeclAs<NamedDecl>(Record, Idx);
1282     AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1283     Decls.addDecl(D, AS);
1284   }
1285   E->initializeResults(Reader.getContext(), Decls.begin(), Decls.end());
1286 
1287   ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
1288   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1289 }
1290 
1291 void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1292   VisitOverloadExpr(E);
1293   E->IsArrow = Record[Idx++];
1294   E->HasUnresolvedUsing = Record[Idx++];
1295   E->Base = Reader.ReadSubExpr();
1296   E->BaseType = Reader.readType(F, Record, Idx);
1297   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1298 }
1299 
1300 void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1301   VisitOverloadExpr(E);
1302   E->RequiresADL = Record[Idx++];
1303   if (E->RequiresADL)
1304     E->StdIsAssociatedNamespace = Record[Idx++];
1305   E->Overloaded = Record[Idx++];
1306   E->NamingClass = ReadDeclAs<CXXRecordDecl>(Record, Idx);
1307 }
1308 
1309 void ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1310   VisitExpr(E);
1311   E->UTT = (UnaryTypeTrait)Record[Idx++];
1312   E->Value = (bool)Record[Idx++];
1313   SourceRange Range = ReadSourceRange(Record, Idx);
1314   E->Loc = Range.getBegin();
1315   E->RParen = Range.getEnd();
1316   E->QueriedType = GetTypeSourceInfo(Record, Idx);
1317 }
1318 
1319 void ASTStmtReader::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) {
1320   VisitExpr(E);
1321   E->BTT = (BinaryTypeTrait)Record[Idx++];
1322   E->Value = (bool)Record[Idx++];
1323   SourceRange Range = ReadSourceRange(Record, Idx);
1324   E->Loc = Range.getBegin();
1325   E->RParen = Range.getEnd();
1326   E->LhsType = GetTypeSourceInfo(Record, Idx);
1327   E->RhsType = GetTypeSourceInfo(Record, Idx);
1328 }
1329 
1330 void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
1331   VisitExpr(E);
1332   E->ATT = (ArrayTypeTrait)Record[Idx++];
1333   E->Value = (unsigned int)Record[Idx++];
1334   SourceRange Range = ReadSourceRange(Record, Idx);
1335   E->Loc = Range.getBegin();
1336   E->RParen = Range.getEnd();
1337   E->QueriedType = GetTypeSourceInfo(Record, Idx);
1338 }
1339 
1340 void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
1341   VisitExpr(E);
1342   E->ET = (ExpressionTrait)Record[Idx++];
1343   E->Value = (bool)Record[Idx++];
1344   SourceRange Range = ReadSourceRange(Record, Idx);
1345   E->QueriedExpression = Reader.ReadSubExpr();
1346   E->Loc = Range.getBegin();
1347   E->RParen = Range.getEnd();
1348 }
1349 
1350 void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
1351   VisitExpr(E);
1352   E->Value = (bool)Record[Idx++];
1353   E->Range = ReadSourceRange(Record, Idx);
1354   E->Operand = Reader.ReadSubExpr();
1355 }
1356 
1357 void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) {
1358   VisitExpr(E);
1359   E->EllipsisLoc = ReadSourceLocation(Record, Idx);
1360   E->NumExpansions = Record[Idx++];
1361   E->Pattern = Reader.ReadSubExpr();
1362 }
1363 
1364 void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
1365   VisitExpr(E);
1366   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1367   E->PackLoc = ReadSourceLocation(Record, Idx);
1368   E->RParenLoc = ReadSourceLocation(Record, Idx);
1369   E->Length = Record[Idx++];
1370   E->Pack = ReadDeclAs<NamedDecl>(Record, Idx);
1371 }
1372 
1373 void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr(
1374                                               SubstNonTypeTemplateParmExpr *E) {
1375   VisitExpr(E);
1376   E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
1377   E->NameLoc = ReadSourceLocation(Record, Idx);
1378   E->Replacement = Reader.ReadSubExpr();
1379 }
1380 
1381 void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(
1382                                           SubstNonTypeTemplateParmPackExpr *E) {
1383   VisitExpr(E);
1384   E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
1385   TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx);
1386   if (ArgPack.getKind() != TemplateArgument::Pack)
1387     return;
1388 
1389   E->Arguments = ArgPack.pack_begin();
1390   E->NumArguments = ArgPack.pack_size();
1391   E->NameLoc = ReadSourceLocation(Record, Idx);
1392 }
1393 
1394 void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
1395   VisitExpr(E);
1396   E->Temporary = Reader.ReadSubExpr();
1397 }
1398 
1399 void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
1400   VisitExpr(E);
1401   E->SourceExpr = Reader.ReadSubExpr();
1402   E->Loc = ReadSourceLocation(Record, Idx);
1403 }
1404 
1405 //===----------------------------------------------------------------------===//
1406 // Microsoft Expressions and Statements
1407 //===----------------------------------------------------------------------===//
1408 void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
1409   VisitExpr(E);
1410   E->setSourceRange(ReadSourceRange(Record, Idx));
1411   if (E->isTypeOperand()) { // __uuidof(ComType)
1412     E->setTypeOperandSourceInfo(
1413         GetTypeSourceInfo(Record, Idx));
1414     return;
1415   }
1416 
1417   // __uuidof(expr)
1418   E->setExprOperand(Reader.ReadSubExpr());
1419 }
1420 
1421 void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) {
1422   VisitStmt(S);
1423   S->Loc = ReadSourceLocation(Record, Idx);
1424   S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt();
1425   S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt();
1426 }
1427 
1428 void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
1429   VisitStmt(S);
1430   S->Loc = ReadSourceLocation(Record, Idx);
1431   S->Block = Reader.ReadSubStmt();
1432 }
1433 
1434 void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) {
1435   VisitStmt(S);
1436   S->IsCXXTry = Record[Idx++];
1437   S->TryLoc = ReadSourceLocation(Record, Idx);
1438   S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt();
1439   S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt();
1440 }
1441 
1442 //===----------------------------------------------------------------------===//
1443 // CUDA Expressions and Statements
1444 //===----------------------------------------------------------------------===//
1445 
1446 void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
1447   VisitCallExpr(E);
1448   E->setConfig(cast<CallExpr>(Reader.ReadSubExpr()));
1449 }
1450 
1451 //===----------------------------------------------------------------------===//
1452 // OpenCL Expressions and Statements.
1453 //===----------------------------------------------------------------------===//
1454 void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {
1455   VisitExpr(E);
1456   E->BuiltinLoc = ReadSourceLocation(Record, Idx);
1457   E->RParenLoc = ReadSourceLocation(Record, Idx);
1458   E->SrcExpr = Reader.ReadSubExpr();
1459 }
1460 
1461 //===----------------------------------------------------------------------===//
1462 // ASTReader Implementation
1463 //===----------------------------------------------------------------------===//
1464 
1465 Stmt *ASTReader::ReadStmt(ModuleFile &F) {
1466   switch (ReadingKind) {
1467   case Read_Decl:
1468   case Read_Type:
1469     return ReadStmtFromStream(F);
1470   case Read_Stmt:
1471     return ReadSubStmt();
1472   }
1473 
1474   llvm_unreachable("ReadingKind not set ?");
1475 }
1476 
1477 Expr *ASTReader::ReadExpr(ModuleFile &F) {
1478   return cast_or_null<Expr>(ReadStmt(F));
1479 }
1480 
1481 Expr *ASTReader::ReadSubExpr() {
1482   return cast_or_null<Expr>(ReadSubStmt());
1483 }
1484 
1485 // Within the bitstream, expressions are stored in Reverse Polish
1486 // Notation, with each of the subexpressions preceding the
1487 // expression they are stored in. Subexpressions are stored from last to first.
1488 // To evaluate expressions, we continue reading expressions and placing them on
1489 // the stack, with expressions having operands removing those operands from the
1490 // stack. Evaluation terminates when we see a STMT_STOP record, and
1491 // the single remaining expression on the stack is our result.
1492 Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
1493 
1494   ReadingKindTracker ReadingKind(Read_Stmt, *this);
1495   llvm::BitstreamCursor &Cursor = F.DeclsCursor;
1496 
1497   // Map of offset to previously deserialized stmt. The offset points
1498   /// just after the stmt record.
1499   llvm::DenseMap<uint64_t, Stmt *> StmtEntries;
1500 
1501 #ifndef NDEBUG
1502   unsigned PrevNumStmts = StmtStack.size();
1503 #endif
1504 
1505   RecordData Record;
1506   unsigned Idx;
1507   ASTStmtReader Reader(*this, F, Cursor, Record, Idx);
1508   Stmt::EmptyShell Empty;
1509 
1510   while (true) {
1511     unsigned Code = Cursor.ReadCode();
1512     if (Code == llvm::bitc::END_BLOCK) {
1513       if (Cursor.ReadBlockEnd()) {
1514         Error("error at end of block in AST file");
1515         return 0;
1516       }
1517       break;
1518     }
1519 
1520     if (Code == llvm::bitc::ENTER_SUBBLOCK) {
1521       // No known subblocks, always skip them.
1522       Cursor.ReadSubBlockID();
1523       if (Cursor.SkipBlock()) {
1524         Error("malformed block record in AST file");
1525         return 0;
1526       }
1527       continue;
1528     }
1529 
1530     if (Code == llvm::bitc::DEFINE_ABBREV) {
1531       Cursor.ReadAbbrevRecord();
1532       continue;
1533     }
1534 
1535     Stmt *S = 0;
1536     Idx = 0;
1537     Record.clear();
1538     bool Finished = false;
1539     bool IsStmtReference = false;
1540     switch ((StmtCode)Cursor.ReadRecord(Code, Record)) {
1541     case STMT_STOP:
1542       Finished = true;
1543       break;
1544 
1545     case STMT_REF_PTR:
1546       IsStmtReference = true;
1547       assert(StmtEntries.find(Record[0]) != StmtEntries.end() &&
1548              "No stmt was recorded for this offset reference!");
1549       S = StmtEntries[Record[Idx++]];
1550       break;
1551 
1552     case STMT_NULL_PTR:
1553       S = 0;
1554       break;
1555 
1556     case STMT_NULL:
1557       S = new (Context) NullStmt(Empty);
1558       break;
1559 
1560     case STMT_COMPOUND:
1561       S = new (Context) CompoundStmt(Empty);
1562       break;
1563 
1564     case STMT_CASE:
1565       S = new (Context) CaseStmt(Empty);
1566       break;
1567 
1568     case STMT_DEFAULT:
1569       S = new (Context) DefaultStmt(Empty);
1570       break;
1571 
1572     case STMT_LABEL:
1573       S = new (Context) LabelStmt(Empty);
1574       break;
1575 
1576     case STMT_IF:
1577       S = new (Context) IfStmt(Empty);
1578       break;
1579 
1580     case STMT_SWITCH:
1581       S = new (Context) SwitchStmt(Empty);
1582       break;
1583 
1584     case STMT_WHILE:
1585       S = new (Context) WhileStmt(Empty);
1586       break;
1587 
1588     case STMT_DO:
1589       S = new (Context) DoStmt(Empty);
1590       break;
1591 
1592     case STMT_FOR:
1593       S = new (Context) ForStmt(Empty);
1594       break;
1595 
1596     case STMT_GOTO:
1597       S = new (Context) GotoStmt(Empty);
1598       break;
1599 
1600     case STMT_INDIRECT_GOTO:
1601       S = new (Context) IndirectGotoStmt(Empty);
1602       break;
1603 
1604     case STMT_CONTINUE:
1605       S = new (Context) ContinueStmt(Empty);
1606       break;
1607 
1608     case STMT_BREAK:
1609       S = new (Context) BreakStmt(Empty);
1610       break;
1611 
1612     case STMT_RETURN:
1613       S = new (Context) ReturnStmt(Empty);
1614       break;
1615 
1616     case STMT_DECL:
1617       S = new (Context) DeclStmt(Empty);
1618       break;
1619 
1620     case STMT_ASM:
1621       S = new (Context) AsmStmt(Empty);
1622       break;
1623 
1624     case EXPR_PREDEFINED:
1625       S = new (Context) PredefinedExpr(Empty);
1626       break;
1627 
1628     case EXPR_DECL_REF:
1629       S = DeclRefExpr::CreateEmpty(
1630         Context,
1631         /*HasQualifier=*/Record[ASTStmtReader::NumExprFields],
1632         /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1],
1633         /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 2],
1634         /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ?
1635           Record[ASTStmtReader::NumExprFields + 4] : 0);
1636       break;
1637 
1638     case EXPR_INTEGER_LITERAL:
1639       S = IntegerLiteral::Create(Context, Empty);
1640       break;
1641 
1642     case EXPR_FLOATING_LITERAL:
1643       S = FloatingLiteral::Create(Context, Empty);
1644       break;
1645 
1646     case EXPR_IMAGINARY_LITERAL:
1647       S = new (Context) ImaginaryLiteral(Empty);
1648       break;
1649 
1650     case EXPR_STRING_LITERAL:
1651       S = StringLiteral::CreateEmpty(Context,
1652                                      Record[ASTStmtReader::NumExprFields + 1]);
1653       break;
1654 
1655     case EXPR_CHARACTER_LITERAL:
1656       S = new (Context) CharacterLiteral(Empty);
1657       break;
1658 
1659     case EXPR_PAREN:
1660       S = new (Context) ParenExpr(Empty);
1661       break;
1662 
1663     case EXPR_PAREN_LIST:
1664       S = new (Context) ParenListExpr(Empty);
1665       break;
1666 
1667     case EXPR_UNARY_OPERATOR:
1668       S = new (Context) UnaryOperator(Empty);
1669       break;
1670 
1671     case EXPR_OFFSETOF:
1672       S = OffsetOfExpr::CreateEmpty(Context,
1673                                     Record[ASTStmtReader::NumExprFields],
1674                                     Record[ASTStmtReader::NumExprFields + 1]);
1675       break;
1676 
1677     case EXPR_SIZEOF_ALIGN_OF:
1678       S = new (Context) UnaryExprOrTypeTraitExpr(Empty);
1679       break;
1680 
1681     case EXPR_ARRAY_SUBSCRIPT:
1682       S = new (Context) ArraySubscriptExpr(Empty);
1683       break;
1684 
1685     case EXPR_CALL:
1686       S = new (Context) CallExpr(Context, Stmt::CallExprClass, Empty);
1687       break;
1688 
1689     case EXPR_MEMBER: {
1690       // We load everything here and fully initialize it at creation.
1691       // That way we can use MemberExpr::Create and don't have to duplicate its
1692       // logic with a MemberExpr::CreateEmpty.
1693 
1694       assert(Idx == 0);
1695       NestedNameSpecifierLoc QualifierLoc;
1696       if (Record[Idx++]) { // HasQualifier.
1697         QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
1698       }
1699 
1700       SourceLocation TemplateKWLoc;
1701       TemplateArgumentListInfo ArgInfo;
1702       bool HasTemplateKWAndArgsInfo = Record[Idx++];
1703       if (HasTemplateKWAndArgsInfo) {
1704         TemplateKWLoc = ReadSourceLocation(F, Record, Idx);
1705         unsigned NumTemplateArgs = Record[Idx++];
1706         ArgInfo.setLAngleLoc(ReadSourceLocation(F, Record, Idx));
1707         ArgInfo.setRAngleLoc(ReadSourceLocation(F, Record, Idx));
1708         for (unsigned i = 0; i != NumTemplateArgs; ++i)
1709           ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx));
1710       }
1711 
1712       bool HadMultipleCandidates = Record[Idx++];
1713 
1714       NamedDecl *FoundD = ReadDeclAs<NamedDecl>(F, Record, Idx);
1715       AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1716       DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
1717 
1718       QualType T = readType(F, Record, Idx);
1719       ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]);
1720       ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]);
1721       Expr *Base = ReadSubExpr();
1722       ValueDecl *MemberD = ReadDeclAs<ValueDecl>(F, Record, Idx);
1723       SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx);
1724       DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);
1725       bool IsArrow = Record[Idx++];
1726 
1727       S = MemberExpr::Create(Context, Base, IsArrow, QualifierLoc,
1728                              TemplateKWLoc, MemberD, FoundDecl, MemberNameInfo,
1729                              HasTemplateKWAndArgsInfo ? &ArgInfo : 0,
1730                              T, VK, OK);
1731       ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc,
1732                              MemberD->getDeclName(), Record, Idx);
1733       if (HadMultipleCandidates)
1734         cast<MemberExpr>(S)->setHadMultipleCandidates(true);
1735       break;
1736     }
1737 
1738     case EXPR_BINARY_OPERATOR:
1739       S = new (Context) BinaryOperator(Empty);
1740       break;
1741 
1742     case EXPR_COMPOUND_ASSIGN_OPERATOR:
1743       S = new (Context) CompoundAssignOperator(Empty);
1744       break;
1745 
1746     case EXPR_CONDITIONAL_OPERATOR:
1747       S = new (Context) ConditionalOperator(Empty);
1748       break;
1749 
1750     case EXPR_BINARY_CONDITIONAL_OPERATOR:
1751       S = new (Context) BinaryConditionalOperator(Empty);
1752       break;
1753 
1754     case EXPR_IMPLICIT_CAST:
1755       S = ImplicitCastExpr::CreateEmpty(Context,
1756                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1757       break;
1758 
1759     case EXPR_CSTYLE_CAST:
1760       S = CStyleCastExpr::CreateEmpty(Context,
1761                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1762       break;
1763 
1764     case EXPR_COMPOUND_LITERAL:
1765       S = new (Context) CompoundLiteralExpr(Empty);
1766       break;
1767 
1768     case EXPR_EXT_VECTOR_ELEMENT:
1769       S = new (Context) ExtVectorElementExpr(Empty);
1770       break;
1771 
1772     case EXPR_INIT_LIST:
1773       S = new (Context) InitListExpr(getContext(), Empty);
1774       break;
1775 
1776     case EXPR_DESIGNATED_INIT:
1777       S = DesignatedInitExpr::CreateEmpty(Context,
1778                                      Record[ASTStmtReader::NumExprFields] - 1);
1779 
1780       break;
1781 
1782     case EXPR_IMPLICIT_VALUE_INIT:
1783       S = new (Context) ImplicitValueInitExpr(Empty);
1784       break;
1785 
1786     case EXPR_VA_ARG:
1787       S = new (Context) VAArgExpr(Empty);
1788       break;
1789 
1790     case EXPR_ADDR_LABEL:
1791       S = new (Context) AddrLabelExpr(Empty);
1792       break;
1793 
1794     case EXPR_STMT:
1795       S = new (Context) StmtExpr(Empty);
1796       break;
1797 
1798     case EXPR_CHOOSE:
1799       S = new (Context) ChooseExpr(Empty);
1800       break;
1801 
1802     case EXPR_GNU_NULL:
1803       S = new (Context) GNUNullExpr(Empty);
1804       break;
1805 
1806     case EXPR_SHUFFLE_VECTOR:
1807       S = new (Context) ShuffleVectorExpr(Empty);
1808       break;
1809 
1810     case EXPR_BLOCK:
1811       S = new (Context) BlockExpr(Empty);
1812       break;
1813 
1814     case EXPR_BLOCK_DECL_REF:
1815       S = new (Context) BlockDeclRefExpr(Empty);
1816       break;
1817 
1818     case EXPR_GENERIC_SELECTION:
1819       S = new (Context) GenericSelectionExpr(Empty);
1820       break;
1821 
1822     case EXPR_OBJC_STRING_LITERAL:
1823       S = new (Context) ObjCStringLiteral(Empty);
1824       break;
1825     case EXPR_OBJC_ENCODE:
1826       S = new (Context) ObjCEncodeExpr(Empty);
1827       break;
1828     case EXPR_OBJC_SELECTOR_EXPR:
1829       S = new (Context) ObjCSelectorExpr(Empty);
1830       break;
1831     case EXPR_OBJC_PROTOCOL_EXPR:
1832       S = new (Context) ObjCProtocolExpr(Empty);
1833       break;
1834     case EXPR_OBJC_IVAR_REF_EXPR:
1835       S = new (Context) ObjCIvarRefExpr(Empty);
1836       break;
1837     case EXPR_OBJC_PROPERTY_REF_EXPR:
1838       S = new (Context) ObjCPropertyRefExpr(Empty);
1839       break;
1840     case EXPR_OBJC_KVC_REF_EXPR:
1841       llvm_unreachable("mismatching AST file");
1842     case EXPR_OBJC_MESSAGE_EXPR:
1843       S = ObjCMessageExpr::CreateEmpty(Context,
1844                                      Record[ASTStmtReader::NumExprFields],
1845                                      Record[ASTStmtReader::NumExprFields + 1]);
1846       break;
1847     case EXPR_OBJC_ISA:
1848       S = new (Context) ObjCIsaExpr(Empty);
1849       break;
1850     case EXPR_OBJC_INDIRECT_COPY_RESTORE:
1851       S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);
1852       break;
1853     case EXPR_OBJC_BRIDGED_CAST:
1854       S = new (Context) ObjCBridgedCastExpr(Empty);
1855       break;
1856     case STMT_OBJC_FOR_COLLECTION:
1857       S = new (Context) ObjCForCollectionStmt(Empty);
1858       break;
1859     case STMT_OBJC_CATCH:
1860       S = new (Context) ObjCAtCatchStmt(Empty);
1861       break;
1862     case STMT_OBJC_FINALLY:
1863       S = new (Context) ObjCAtFinallyStmt(Empty);
1864       break;
1865     case STMT_OBJC_AT_TRY:
1866       S = ObjCAtTryStmt::CreateEmpty(Context,
1867                                      Record[ASTStmtReader::NumStmtFields],
1868                                      Record[ASTStmtReader::NumStmtFields + 1]);
1869       break;
1870     case STMT_OBJC_AT_SYNCHRONIZED:
1871       S = new (Context) ObjCAtSynchronizedStmt(Empty);
1872       break;
1873     case STMT_OBJC_AT_THROW:
1874       S = new (Context) ObjCAtThrowStmt(Empty);
1875       break;
1876     case STMT_OBJC_AUTORELEASE_POOL:
1877       S = new (Context) ObjCAutoreleasePoolStmt(Empty);
1878       break;
1879     case STMT_SEH_EXCEPT:
1880       S = new (Context) SEHExceptStmt(Empty);
1881       break;
1882     case STMT_SEH_FINALLY:
1883       S = new (Context) SEHFinallyStmt(Empty);
1884       break;
1885     case STMT_SEH_TRY:
1886       S = new (Context) SEHTryStmt(Empty);
1887       break;
1888     case STMT_CXX_CATCH:
1889       S = new (Context) CXXCatchStmt(Empty);
1890       break;
1891 
1892     case STMT_CXX_TRY:
1893       S = CXXTryStmt::Create(Context, Empty,
1894              /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]);
1895       break;
1896 
1897     case STMT_CXX_FOR_RANGE:
1898       S = new (Context) CXXForRangeStmt(Empty);
1899       break;
1900 
1901     case STMT_MS_DEPENDENT_EXISTS:
1902       S = new (Context) MSDependentExistsStmt(SourceLocation(), true,
1903                                               NestedNameSpecifierLoc(),
1904                                               DeclarationNameInfo(),
1905                                               0);
1906       break;
1907 
1908     case EXPR_CXX_OPERATOR_CALL:
1909       S = new (Context) CXXOperatorCallExpr(Context, Empty);
1910       break;
1911 
1912     case EXPR_CXX_MEMBER_CALL:
1913       S = new (Context) CXXMemberCallExpr(Context, Empty);
1914       break;
1915 
1916     case EXPR_CXX_CONSTRUCT:
1917       S = new (Context) CXXConstructExpr(Empty);
1918       break;
1919 
1920     case EXPR_CXX_TEMPORARY_OBJECT:
1921       S = new (Context) CXXTemporaryObjectExpr(Empty);
1922       break;
1923 
1924     case EXPR_CXX_STATIC_CAST:
1925       S = CXXStaticCastExpr::CreateEmpty(Context,
1926                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1927       break;
1928 
1929     case EXPR_CXX_DYNAMIC_CAST:
1930       S = CXXDynamicCastExpr::CreateEmpty(Context,
1931                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1932       break;
1933 
1934     case EXPR_CXX_REINTERPRET_CAST:
1935       S = CXXReinterpretCastExpr::CreateEmpty(Context,
1936                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1937       break;
1938 
1939     case EXPR_CXX_CONST_CAST:
1940       S = CXXConstCastExpr::CreateEmpty(Context);
1941       break;
1942 
1943     case EXPR_CXX_FUNCTIONAL_CAST:
1944       S = CXXFunctionalCastExpr::CreateEmpty(Context,
1945                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1946       break;
1947 
1948     case EXPR_CXX_BOOL_LITERAL:
1949       S = new (Context) CXXBoolLiteralExpr(Empty);
1950       break;
1951 
1952     case EXPR_CXX_NULL_PTR_LITERAL:
1953       S = new (Context) CXXNullPtrLiteralExpr(Empty);
1954       break;
1955     case EXPR_CXX_TYPEID_EXPR:
1956       S = new (Context) CXXTypeidExpr(Empty, true);
1957       break;
1958     case EXPR_CXX_TYPEID_TYPE:
1959       S = new (Context) CXXTypeidExpr(Empty, false);
1960       break;
1961     case EXPR_CXX_UUIDOF_EXPR:
1962       S = new (Context) CXXUuidofExpr(Empty, true);
1963       break;
1964     case EXPR_CXX_UUIDOF_TYPE:
1965       S = new (Context) CXXUuidofExpr(Empty, false);
1966       break;
1967     case EXPR_CXX_THIS:
1968       S = new (Context) CXXThisExpr(Empty);
1969       break;
1970     case EXPR_CXX_THROW:
1971       S = new (Context) CXXThrowExpr(Empty);
1972       break;
1973     case EXPR_CXX_DEFAULT_ARG: {
1974       bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields];
1975       if (HasOtherExprStored) {
1976         Expr *SubExpr = ReadSubExpr();
1977         S = CXXDefaultArgExpr::Create(Context, SourceLocation(), 0, SubExpr);
1978       } else
1979         S = new (Context) CXXDefaultArgExpr(Empty);
1980       break;
1981     }
1982     case EXPR_CXX_BIND_TEMPORARY:
1983       S = new (Context) CXXBindTemporaryExpr(Empty);
1984       break;
1985 
1986     case EXPR_CXX_SCALAR_VALUE_INIT:
1987       S = new (Context) CXXScalarValueInitExpr(Empty);
1988       break;
1989     case EXPR_CXX_NEW:
1990       S = new (Context) CXXNewExpr(Empty);
1991       break;
1992     case EXPR_CXX_DELETE:
1993       S = new (Context) CXXDeleteExpr(Empty);
1994       break;
1995     case EXPR_CXX_PSEUDO_DESTRUCTOR:
1996       S = new (Context) CXXPseudoDestructorExpr(Empty);
1997       break;
1998 
1999     case EXPR_EXPR_WITH_CLEANUPS:
2000       S = ExprWithCleanups::Create(Context, Empty,
2001                                    Record[ASTStmtReader::NumExprFields]);
2002       break;
2003 
2004     case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
2005       S = CXXDependentScopeMemberExpr::CreateEmpty(Context,
2006          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
2007                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
2008                                    ? Record[ASTStmtReader::NumExprFields + 1]
2009                                    : 0);
2010       break;
2011 
2012     case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
2013       S = DependentScopeDeclRefExpr::CreateEmpty(Context,
2014          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
2015                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
2016                                    ? Record[ASTStmtReader::NumExprFields + 1]
2017                                    : 0);
2018       break;
2019 
2020     case EXPR_CXX_UNRESOLVED_CONSTRUCT:
2021       S = CXXUnresolvedConstructExpr::CreateEmpty(Context,
2022                               /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
2023       break;
2024 
2025     case EXPR_CXX_UNRESOLVED_MEMBER:
2026       S = UnresolvedMemberExpr::CreateEmpty(Context,
2027          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
2028                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
2029                                    ? Record[ASTStmtReader::NumExprFields + 1]
2030                                    : 0);
2031       break;
2032 
2033     case EXPR_CXX_UNRESOLVED_LOOKUP:
2034       S = UnresolvedLookupExpr::CreateEmpty(Context,
2035          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
2036                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
2037                                    ? Record[ASTStmtReader::NumExprFields + 1]
2038                                    : 0);
2039       break;
2040 
2041     case EXPR_CXX_UNARY_TYPE_TRAIT:
2042       S = new (Context) UnaryTypeTraitExpr(Empty);
2043       break;
2044 
2045     case EXPR_BINARY_TYPE_TRAIT:
2046       S = new (Context) BinaryTypeTraitExpr(Empty);
2047       break;
2048 
2049     case EXPR_ARRAY_TYPE_TRAIT:
2050       S = new (Context) ArrayTypeTraitExpr(Empty);
2051       break;
2052 
2053     case EXPR_CXX_EXPRESSION_TRAIT:
2054       S = new (Context) ExpressionTraitExpr(Empty);
2055       break;
2056 
2057     case EXPR_CXX_NOEXCEPT:
2058       S = new (Context) CXXNoexceptExpr(Empty);
2059       break;
2060 
2061     case EXPR_PACK_EXPANSION:
2062       S = new (Context) PackExpansionExpr(Empty);
2063       break;
2064 
2065     case EXPR_SIZEOF_PACK:
2066       S = new (Context) SizeOfPackExpr(Empty);
2067       break;
2068 
2069     case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:
2070       S = new (Context) SubstNonTypeTemplateParmExpr(Empty);
2071       break;
2072 
2073     case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:
2074       S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);
2075       break;
2076 
2077     case EXPR_MATERIALIZE_TEMPORARY:
2078       S = new (Context) MaterializeTemporaryExpr(Empty);
2079       break;
2080 
2081     case EXPR_OPAQUE_VALUE:
2082       S = new (Context) OpaqueValueExpr(Empty);
2083       break;
2084 
2085     case EXPR_CUDA_KERNEL_CALL:
2086       S = new (Context) CUDAKernelCallExpr(Context, Empty);
2087       break;
2088 
2089     case EXPR_ASTYPE:
2090       S = new (Context) AsTypeExpr(Empty);
2091       break;
2092 
2093     case EXPR_PSEUDO_OBJECT: {
2094       unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields];
2095       S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs);
2096       break;
2097     }
2098 
2099     case EXPR_ATOMIC:
2100       S = new (Context) AtomicExpr(Empty);
2101       break;
2102 
2103     case EXPR_LAMBDA: {
2104       unsigned NumCaptures = Record[ASTStmtReader::NumExprFields];
2105       unsigned NumArrayIndexVars = Record[ASTStmtReader::NumExprFields + 1];
2106       S = LambdaExpr::CreateDeserialized(Context, NumCaptures,
2107                                          NumArrayIndexVars);
2108       break;
2109     }
2110     }
2111 
2112     // We hit a STMT_STOP, so we're done with this expression.
2113     if (Finished)
2114       break;
2115 
2116     ++NumStatementsRead;
2117 
2118     if (S && !IsStmtReference) {
2119       Reader.Visit(S);
2120       StmtEntries[Cursor.GetCurrentBitNo()] = S;
2121     }
2122 
2123 
2124     assert(Idx == Record.size() && "Invalid deserialization of statement");
2125     StmtStack.push_back(S);
2126   }
2127 
2128 #ifndef NDEBUG
2129   assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
2130   assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
2131 #endif
2132 
2133   return StmtStack.pop_back_val();
2134 }
2135