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