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