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