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