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