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   E->IsImplicit = Record[Idx++];
883   ObjCMessageExpr::ReceiverKind Kind
884     = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
885   switch (Kind) {
886   case ObjCMessageExpr::Instance:
887     E->setInstanceReceiver(Reader.ReadSubExpr());
888     break;
889 
890   case ObjCMessageExpr::Class:
891     E->setClassReceiver(GetTypeSourceInfo(Record, Idx));
892     break;
893 
894   case ObjCMessageExpr::SuperClass:
895   case ObjCMessageExpr::SuperInstance: {
896     QualType T = Reader.readType(F, Record, Idx);
897     SourceLocation SuperLoc = ReadSourceLocation(Record, Idx);
898     E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
899     break;
900   }
901   }
902 
903   assert(Kind == E->getReceiverKind());
904 
905   if (Record[Idx++])
906     E->setMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx));
907   else
908     E->setSelector(Reader.ReadSelector(F, Record, Idx));
909 
910   E->LBracLoc = ReadSourceLocation(Record, Idx);
911   E->RBracLoc = ReadSourceLocation(Record, Idx);
912 
913   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
914     E->setArg(I, Reader.ReadSubExpr());
915 
916   SourceLocation *Locs = E->getStoredSelLocs();
917   for (unsigned I = 0; I != NumStoredSelLocs; ++I)
918     Locs[I] = ReadSourceLocation(Record, Idx);
919 }
920 
921 void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
922   VisitStmt(S);
923   S->setElement(Reader.ReadSubStmt());
924   S->setCollection(Reader.ReadSubExpr());
925   S->setBody(Reader.ReadSubStmt());
926   S->setForLoc(ReadSourceLocation(Record, Idx));
927   S->setRParenLoc(ReadSourceLocation(Record, Idx));
928 }
929 
930 void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
931   VisitStmt(S);
932   S->setCatchBody(Reader.ReadSubStmt());
933   S->setCatchParamDecl(ReadDeclAs<VarDecl>(Record, Idx));
934   S->setAtCatchLoc(ReadSourceLocation(Record, Idx));
935   S->setRParenLoc(ReadSourceLocation(Record, Idx));
936 }
937 
938 void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
939   VisitStmt(S);
940   S->setFinallyBody(Reader.ReadSubStmt());
941   S->setAtFinallyLoc(ReadSourceLocation(Record, Idx));
942 }
943 
944 void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
945   VisitStmt(S);
946   S->setSubStmt(Reader.ReadSubStmt());
947   S->setAtLoc(ReadSourceLocation(Record, Idx));
948 }
949 
950 void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
951   VisitStmt(S);
952   assert(Record[Idx] == S->getNumCatchStmts());
953   ++Idx;
954   bool HasFinally = Record[Idx++];
955   S->setTryBody(Reader.ReadSubStmt());
956   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
957     S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
958 
959   if (HasFinally)
960     S->setFinallyStmt(Reader.ReadSubStmt());
961   S->setAtTryLoc(ReadSourceLocation(Record, Idx));
962 }
963 
964 void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
965   VisitStmt(S);
966   S->setSynchExpr(Reader.ReadSubStmt());
967   S->setSynchBody(Reader.ReadSubStmt());
968   S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx));
969 }
970 
971 void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
972   VisitStmt(S);
973   S->setThrowExpr(Reader.ReadSubStmt());
974   S->setThrowLoc(ReadSourceLocation(Record, Idx));
975 }
976 
977 //===----------------------------------------------------------------------===//
978 // C++ Expressions and Statements
979 //===----------------------------------------------------------------------===//
980 
981 void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
982   VisitStmt(S);
983   S->CatchLoc = ReadSourceLocation(Record, Idx);
984   S->ExceptionDecl = ReadDeclAs<VarDecl>(Record, Idx);
985   S->HandlerBlock = Reader.ReadSubStmt();
986 }
987 
988 void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
989   VisitStmt(S);
990   assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?");
991   ++Idx;
992   S->TryLoc = ReadSourceLocation(Record, Idx);
993   S->getStmts()[0] = Reader.ReadSubStmt();
994   for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
995     S->getStmts()[i + 1] = Reader.ReadSubStmt();
996 }
997 
998 void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
999   VisitStmt(S);
1000   S->setForLoc(ReadSourceLocation(Record, Idx));
1001   S->setColonLoc(ReadSourceLocation(Record, Idx));
1002   S->setRParenLoc(ReadSourceLocation(Record, Idx));
1003   S->setRangeStmt(Reader.ReadSubStmt());
1004   S->setBeginEndStmt(Reader.ReadSubStmt());
1005   S->setCond(Reader.ReadSubExpr());
1006   S->setInc(Reader.ReadSubExpr());
1007   S->setLoopVarStmt(Reader.ReadSubStmt());
1008   S->setBody(Reader.ReadSubStmt());
1009 }
1010 
1011 void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
1012   VisitStmt(S);
1013   S->KeywordLoc = ReadSourceLocation(Record, Idx);
1014   S->IsIfExists = Record[Idx++];
1015   S->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1016   ReadDeclarationNameInfo(S->NameInfo, Record, Idx);
1017   S->SubStmt = Reader.ReadSubStmt();
1018 }
1019 
1020 void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
1021   VisitCallExpr(E);
1022   E->setOperator((OverloadedOperatorKind)Record[Idx++]);
1023 }
1024 
1025 void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
1026   VisitExpr(E);
1027   E->NumArgs = Record[Idx++];
1028   if (E->NumArgs)
1029     E->Args = new (Reader.getContext()) Stmt*[E->NumArgs];
1030   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1031     E->setArg(I, Reader.ReadSubExpr());
1032   E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx));
1033   E->setLocation(ReadSourceLocation(Record, Idx));
1034   E->setElidable(Record[Idx++]);
1035   E->setHadMultipleCandidates(Record[Idx++]);
1036   E->setRequiresZeroInitialization(Record[Idx++]);
1037   E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
1038   E->ParenRange = ReadSourceRange(Record, Idx);
1039 }
1040 
1041 void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
1042   VisitCXXConstructExpr(E);
1043   E->Type = GetTypeSourceInfo(Record, Idx);
1044 }
1045 
1046 void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
1047   VisitExplicitCastExpr(E);
1048   SourceRange R = ReadSourceRange(Record, Idx);
1049   E->Loc = R.getBegin();
1050   E->RParenLoc = R.getEnd();
1051 }
1052 
1053 void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1054   return VisitCXXNamedCastExpr(E);
1055 }
1056 
1057 void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
1058   return VisitCXXNamedCastExpr(E);
1059 }
1060 
1061 void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1062   return VisitCXXNamedCastExpr(E);
1063 }
1064 
1065 void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1066   return VisitCXXNamedCastExpr(E);
1067 }
1068 
1069 void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1070   VisitExplicitCastExpr(E);
1071   E->setTypeBeginLoc(ReadSourceLocation(Record, Idx));
1072   E->setRParenLoc(ReadSourceLocation(Record, Idx));
1073 }
1074 
1075 void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1076   VisitExpr(E);
1077   E->setValue(Record[Idx++]);
1078   E->setLocation(ReadSourceLocation(Record, Idx));
1079 }
1080 
1081 void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1082   VisitExpr(E);
1083   E->setLocation(ReadSourceLocation(Record, Idx));
1084 }
1085 
1086 void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1087   VisitExpr(E);
1088   E->setSourceRange(ReadSourceRange(Record, Idx));
1089   if (E->isTypeOperand()) { // typeid(int)
1090     E->setTypeOperandSourceInfo(
1091         GetTypeSourceInfo(Record, Idx));
1092     return;
1093   }
1094 
1095   // typeid(42+2)
1096   E->setExprOperand(Reader.ReadSubExpr());
1097 }
1098 
1099 void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
1100   VisitExpr(E);
1101   E->setLocation(ReadSourceLocation(Record, Idx));
1102   E->setImplicit(Record[Idx++]);
1103 }
1104 
1105 void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
1106   VisitExpr(E);
1107   E->ThrowLoc = ReadSourceLocation(Record, Idx);
1108   E->Op = Reader.ReadSubExpr();
1109   E->IsThrownVariableInScope = Record[Idx++];
1110 }
1111 
1112 void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1113   VisitExpr(E);
1114 
1115   assert((bool)Record[Idx] == E->Param.getInt() && "We messed up at creation ?");
1116   ++Idx; // HasOtherExprStored and SubExpr was handled during creation.
1117   E->Param.setPointer(ReadDeclAs<ParmVarDecl>(Record, Idx));
1118   E->Loc = ReadSourceLocation(Record, Idx);
1119 }
1120 
1121 void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1122   VisitExpr(E);
1123   E->setTemporary(Reader.ReadCXXTemporary(F, Record, Idx));
1124   E->setSubExpr(Reader.ReadSubExpr());
1125 }
1126 
1127 void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
1128   VisitExpr(E);
1129   E->TypeInfo = GetTypeSourceInfo(Record, Idx);
1130   E->RParenLoc = ReadSourceLocation(Record, Idx);
1131 }
1132 
1133 void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
1134   VisitExpr(E);
1135   E->GlobalNew = Record[Idx++];
1136   E->Initializer = Record[Idx++];
1137   E->UsualArrayDeleteWantsSize = Record[Idx++];
1138   bool isArray = Record[Idx++];
1139   E->setHadMultipleCandidates(Record[Idx++]);
1140   unsigned NumPlacementArgs = Record[Idx++];
1141   unsigned NumCtorArgs = Record[Idx++];
1142   E->setOperatorNew(ReadDeclAs<FunctionDecl>(Record, Idx));
1143   E->setOperatorDelete(ReadDeclAs<FunctionDecl>(Record, Idx));
1144   E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx));
1145   E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx);
1146   SourceRange TypeIdParens;
1147   TypeIdParens.setBegin(ReadSourceLocation(Record, Idx));
1148   TypeIdParens.setEnd(ReadSourceLocation(Record, Idx));
1149   E->TypeIdParens = TypeIdParens;
1150   E->StartLoc = ReadSourceLocation(Record, Idx);
1151   E->EndLoc = ReadSourceLocation(Record, Idx);
1152   E->ConstructorLParen = ReadSourceLocation(Record, Idx);
1153   E->ConstructorRParen = ReadSourceLocation(Record, Idx);
1154 
1155   E->AllocateArgsArray(Reader.getContext(), isArray, NumPlacementArgs,
1156                        NumCtorArgs);
1157 
1158   // Install all the subexpressions.
1159   for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
1160        I != e; ++I)
1161     *I = Reader.ReadSubStmt();
1162 }
1163 
1164 void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1165   VisitExpr(E);
1166   E->GlobalDelete = Record[Idx++];
1167   E->ArrayForm = Record[Idx++];
1168   E->ArrayFormAsWritten = Record[Idx++];
1169   E->UsualArrayDeleteWantsSize = Record[Idx++];
1170   E->OperatorDelete = ReadDeclAs<FunctionDecl>(Record, Idx);
1171   E->Argument = Reader.ReadSubExpr();
1172   E->Loc = ReadSourceLocation(Record, Idx);
1173 }
1174 
1175 void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1176   VisitExpr(E);
1177 
1178   E->Base = Reader.ReadSubExpr();
1179   E->IsArrow = Record[Idx++];
1180   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1181   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1182   E->ScopeType = GetTypeSourceInfo(Record, Idx);
1183   E->ColonColonLoc = ReadSourceLocation(Record, Idx);
1184   E->TildeLoc = ReadSourceLocation(Record, Idx);
1185 
1186   IdentifierInfo *II = Reader.GetIdentifierInfo(F, Record, Idx);
1187   if (II)
1188     E->setDestroyedType(II, ReadSourceLocation(Record, Idx));
1189   else
1190     E->setDestroyedType(GetTypeSourceInfo(Record, Idx));
1191 }
1192 
1193 void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) {
1194   VisitExpr(E);
1195 
1196   unsigned NumObjects = Record[Idx++];
1197   assert(NumObjects == E->getNumObjects());
1198   for (unsigned i = 0; i != NumObjects; ++i)
1199     E->getObjectsBuffer()[i] = ReadDeclAs<BlockDecl>(Record, Idx);
1200 
1201   E->SubExpr = Reader.ReadSubExpr();
1202 }
1203 
1204 void
1205 ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
1206   VisitExpr(E);
1207 
1208   if (Record[Idx++])
1209     ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1210                                      Record[Idx++]);
1211 
1212   E->Base = Reader.ReadSubExpr();
1213   E->BaseType = Reader.readType(F, Record, Idx);
1214   E->IsArrow = Record[Idx++];
1215   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1216   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1217   E->FirstQualifierFoundInScope = ReadDeclAs<NamedDecl>(Record, Idx);
1218   ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx);
1219 }
1220 
1221 void
1222 ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
1223   VisitExpr(E);
1224 
1225   if (Record[Idx++])
1226     ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1227                                      Record[Idx++]);
1228 
1229   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1230   ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
1231 }
1232 
1233 void
1234 ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1235   VisitExpr(E);
1236   assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
1237   ++Idx; // NumArgs;
1238   for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
1239     E->setArg(I, Reader.ReadSubExpr());
1240   E->Type = GetTypeSourceInfo(Record, Idx);
1241   E->setLParenLoc(ReadSourceLocation(Record, Idx));
1242   E->setRParenLoc(ReadSourceLocation(Record, Idx));
1243 }
1244 
1245 void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
1246   VisitExpr(E);
1247 
1248   // Read the explicit template argument list, if available.
1249   if (Record[Idx++])
1250     ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1251                                      Record[Idx++]);
1252 
1253   unsigned NumDecls = Record[Idx++];
1254   UnresolvedSet<8> Decls;
1255   for (unsigned i = 0; i != NumDecls; ++i) {
1256     NamedDecl *D = ReadDeclAs<NamedDecl>(Record, Idx);
1257     AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1258     Decls.addDecl(D, AS);
1259   }
1260   E->initializeResults(Reader.getContext(), Decls.begin(), Decls.end());
1261 
1262   ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
1263   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1264 }
1265 
1266 void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1267   VisitOverloadExpr(E);
1268   E->IsArrow = Record[Idx++];
1269   E->HasUnresolvedUsing = Record[Idx++];
1270   E->Base = Reader.ReadSubExpr();
1271   E->BaseType = Reader.readType(F, Record, Idx);
1272   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1273 }
1274 
1275 void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1276   VisitOverloadExpr(E);
1277   E->RequiresADL = Record[Idx++];
1278   if (E->RequiresADL)
1279     E->StdIsAssociatedNamespace = Record[Idx++];
1280   E->Overloaded = Record[Idx++];
1281   E->NamingClass = ReadDeclAs<CXXRecordDecl>(Record, Idx);
1282 }
1283 
1284 void ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1285   VisitExpr(E);
1286   E->UTT = (UnaryTypeTrait)Record[Idx++];
1287   E->Value = (bool)Record[Idx++];
1288   SourceRange Range = ReadSourceRange(Record, Idx);
1289   E->Loc = Range.getBegin();
1290   E->RParen = Range.getEnd();
1291   E->QueriedType = GetTypeSourceInfo(Record, Idx);
1292 }
1293 
1294 void ASTStmtReader::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) {
1295   VisitExpr(E);
1296   E->BTT = (BinaryTypeTrait)Record[Idx++];
1297   E->Value = (bool)Record[Idx++];
1298   SourceRange Range = ReadSourceRange(Record, Idx);
1299   E->Loc = Range.getBegin();
1300   E->RParen = Range.getEnd();
1301   E->LhsType = GetTypeSourceInfo(Record, Idx);
1302   E->RhsType = GetTypeSourceInfo(Record, Idx);
1303 }
1304 
1305 void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
1306   VisitExpr(E);
1307   E->ATT = (ArrayTypeTrait)Record[Idx++];
1308   E->Value = (unsigned int)Record[Idx++];
1309   SourceRange Range = ReadSourceRange(Record, Idx);
1310   E->Loc = Range.getBegin();
1311   E->RParen = Range.getEnd();
1312   E->QueriedType = GetTypeSourceInfo(Record, Idx);
1313 }
1314 
1315 void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
1316   VisitExpr(E);
1317   E->ET = (ExpressionTrait)Record[Idx++];
1318   E->Value = (bool)Record[Idx++];
1319   SourceRange Range = ReadSourceRange(Record, Idx);
1320   E->QueriedExpression = Reader.ReadSubExpr();
1321   E->Loc = Range.getBegin();
1322   E->RParen = Range.getEnd();
1323 }
1324 
1325 void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
1326   VisitExpr(E);
1327   E->Value = (bool)Record[Idx++];
1328   E->Range = ReadSourceRange(Record, Idx);
1329   E->Operand = Reader.ReadSubExpr();
1330 }
1331 
1332 void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) {
1333   VisitExpr(E);
1334   E->EllipsisLoc = ReadSourceLocation(Record, Idx);
1335   E->NumExpansions = Record[Idx++];
1336   E->Pattern = Reader.ReadSubExpr();
1337 }
1338 
1339 void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
1340   VisitExpr(E);
1341   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1342   E->PackLoc = ReadSourceLocation(Record, Idx);
1343   E->RParenLoc = ReadSourceLocation(Record, Idx);
1344   E->Length = Record[Idx++];
1345   E->Pack = ReadDeclAs<NamedDecl>(Record, Idx);
1346 }
1347 
1348 void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr(
1349                                               SubstNonTypeTemplateParmExpr *E) {
1350   VisitExpr(E);
1351   E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
1352   E->NameLoc = ReadSourceLocation(Record, Idx);
1353   E->Replacement = Reader.ReadSubExpr();
1354 }
1355 
1356 void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(
1357                                           SubstNonTypeTemplateParmPackExpr *E) {
1358   VisitExpr(E);
1359   E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
1360   TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx);
1361   if (ArgPack.getKind() != TemplateArgument::Pack)
1362     return;
1363 
1364   E->Arguments = ArgPack.pack_begin();
1365   E->NumArguments = ArgPack.pack_size();
1366   E->NameLoc = ReadSourceLocation(Record, Idx);
1367 }
1368 
1369 void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
1370   VisitExpr(E);
1371   E->Temporary = Reader.ReadSubExpr();
1372 }
1373 
1374 void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
1375   VisitExpr(E);
1376   E->SourceExpr = Reader.ReadSubExpr();
1377   E->Loc = ReadSourceLocation(Record, Idx);
1378 }
1379 
1380 //===----------------------------------------------------------------------===//
1381 // Microsoft Expressions and Statements
1382 //===----------------------------------------------------------------------===//
1383 void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
1384   VisitExpr(E);
1385   E->setSourceRange(ReadSourceRange(Record, Idx));
1386   if (E->isTypeOperand()) { // __uuidof(ComType)
1387     E->setTypeOperandSourceInfo(
1388         GetTypeSourceInfo(Record, Idx));
1389     return;
1390   }
1391 
1392   // __uuidof(expr)
1393   E->setExprOperand(Reader.ReadSubExpr());
1394 }
1395 
1396 void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) {
1397   VisitStmt(S);
1398   S->Loc = ReadSourceLocation(Record, Idx);
1399   S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt();
1400   S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt();
1401 }
1402 
1403 void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
1404   VisitStmt(S);
1405   S->Loc = ReadSourceLocation(Record, Idx);
1406   S->Block = Reader.ReadSubStmt();
1407 }
1408 
1409 void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) {
1410   VisitStmt(S);
1411   S->IsCXXTry = Record[Idx++];
1412   S->TryLoc = ReadSourceLocation(Record, Idx);
1413   S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt();
1414   S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt();
1415 }
1416 
1417 //===----------------------------------------------------------------------===//
1418 // CUDA Expressions and Statements
1419 //===----------------------------------------------------------------------===//
1420 
1421 void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
1422   VisitCallExpr(E);
1423   E->setConfig(cast<CallExpr>(Reader.ReadSubExpr()));
1424 }
1425 
1426 //===----------------------------------------------------------------------===//
1427 // OpenCL Expressions and Statements.
1428 //===----------------------------------------------------------------------===//
1429 void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {
1430   VisitExpr(E);
1431   E->BuiltinLoc = ReadSourceLocation(Record, Idx);
1432   E->RParenLoc = ReadSourceLocation(Record, Idx);
1433   E->SrcExpr = Reader.ReadSubExpr();
1434 }
1435 
1436 //===----------------------------------------------------------------------===//
1437 // ASTReader Implementation
1438 //===----------------------------------------------------------------------===//
1439 
1440 Stmt *ASTReader::ReadStmt(ModuleFile &F) {
1441   switch (ReadingKind) {
1442   case Read_Decl:
1443   case Read_Type:
1444     return ReadStmtFromStream(F);
1445   case Read_Stmt:
1446     return ReadSubStmt();
1447   }
1448 
1449   llvm_unreachable("ReadingKind not set ?");
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     case EXPR_OBJC_MESSAGE_EXPR:
1815       S = ObjCMessageExpr::CreateEmpty(Context,
1816                                      Record[ASTStmtReader::NumExprFields],
1817                                      Record[ASTStmtReader::NumExprFields + 1]);
1818       break;
1819     case EXPR_OBJC_ISA:
1820       S = new (Context) ObjCIsaExpr(Empty);
1821       break;
1822     case EXPR_OBJC_INDIRECT_COPY_RESTORE:
1823       S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);
1824       break;
1825     case EXPR_OBJC_BRIDGED_CAST:
1826       S = new (Context) ObjCBridgedCastExpr(Empty);
1827       break;
1828     case STMT_OBJC_FOR_COLLECTION:
1829       S = new (Context) ObjCForCollectionStmt(Empty);
1830       break;
1831     case STMT_OBJC_CATCH:
1832       S = new (Context) ObjCAtCatchStmt(Empty);
1833       break;
1834     case STMT_OBJC_FINALLY:
1835       S = new (Context) ObjCAtFinallyStmt(Empty);
1836       break;
1837     case STMT_OBJC_AT_TRY:
1838       S = ObjCAtTryStmt::CreateEmpty(Context,
1839                                      Record[ASTStmtReader::NumStmtFields],
1840                                      Record[ASTStmtReader::NumStmtFields + 1]);
1841       break;
1842     case STMT_OBJC_AT_SYNCHRONIZED:
1843       S = new (Context) ObjCAtSynchronizedStmt(Empty);
1844       break;
1845     case STMT_OBJC_AT_THROW:
1846       S = new (Context) ObjCAtThrowStmt(Empty);
1847       break;
1848     case STMT_OBJC_AUTORELEASE_POOL:
1849       S = new (Context) ObjCAutoreleasePoolStmt(Empty);
1850       break;
1851     case STMT_SEH_EXCEPT:
1852       S = new (Context) SEHExceptStmt(Empty);
1853       break;
1854     case STMT_SEH_FINALLY:
1855       S = new (Context) SEHFinallyStmt(Empty);
1856       break;
1857     case STMT_SEH_TRY:
1858       S = new (Context) SEHTryStmt(Empty);
1859       break;
1860     case STMT_CXX_CATCH:
1861       S = new (Context) CXXCatchStmt(Empty);
1862       break;
1863 
1864     case STMT_CXX_TRY:
1865       S = CXXTryStmt::Create(Context, Empty,
1866              /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]);
1867       break;
1868 
1869     case STMT_CXX_FOR_RANGE:
1870       S = new (Context) CXXForRangeStmt(Empty);
1871       break;
1872 
1873     case STMT_MS_DEPENDENT_EXISTS:
1874       S = new (Context) MSDependentExistsStmt(SourceLocation(), true,
1875                                               NestedNameSpecifierLoc(),
1876                                               DeclarationNameInfo(),
1877                                               0);
1878       break;
1879 
1880     case EXPR_CXX_OPERATOR_CALL:
1881       S = new (Context) CXXOperatorCallExpr(Context, Empty);
1882       break;
1883 
1884     case EXPR_CXX_MEMBER_CALL:
1885       S = new (Context) CXXMemberCallExpr(Context, Empty);
1886       break;
1887 
1888     case EXPR_CXX_CONSTRUCT:
1889       S = new (Context) CXXConstructExpr(Empty);
1890       break;
1891 
1892     case EXPR_CXX_TEMPORARY_OBJECT:
1893       S = new (Context) CXXTemporaryObjectExpr(Empty);
1894       break;
1895 
1896     case EXPR_CXX_STATIC_CAST:
1897       S = CXXStaticCastExpr::CreateEmpty(Context,
1898                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1899       break;
1900 
1901     case EXPR_CXX_DYNAMIC_CAST:
1902       S = CXXDynamicCastExpr::CreateEmpty(Context,
1903                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1904       break;
1905 
1906     case EXPR_CXX_REINTERPRET_CAST:
1907       S = CXXReinterpretCastExpr::CreateEmpty(Context,
1908                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1909       break;
1910 
1911     case EXPR_CXX_CONST_CAST:
1912       S = CXXConstCastExpr::CreateEmpty(Context);
1913       break;
1914 
1915     case EXPR_CXX_FUNCTIONAL_CAST:
1916       S = CXXFunctionalCastExpr::CreateEmpty(Context,
1917                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1918       break;
1919 
1920     case EXPR_CXX_BOOL_LITERAL:
1921       S = new (Context) CXXBoolLiteralExpr(Empty);
1922       break;
1923 
1924     case EXPR_CXX_NULL_PTR_LITERAL:
1925       S = new (Context) CXXNullPtrLiteralExpr(Empty);
1926       break;
1927     case EXPR_CXX_TYPEID_EXPR:
1928       S = new (Context) CXXTypeidExpr(Empty, true);
1929       break;
1930     case EXPR_CXX_TYPEID_TYPE:
1931       S = new (Context) CXXTypeidExpr(Empty, false);
1932       break;
1933     case EXPR_CXX_UUIDOF_EXPR:
1934       S = new (Context) CXXUuidofExpr(Empty, true);
1935       break;
1936     case EXPR_CXX_UUIDOF_TYPE:
1937       S = new (Context) CXXUuidofExpr(Empty, false);
1938       break;
1939     case EXPR_CXX_THIS:
1940       S = new (Context) CXXThisExpr(Empty);
1941       break;
1942     case EXPR_CXX_THROW:
1943       S = new (Context) CXXThrowExpr(Empty);
1944       break;
1945     case EXPR_CXX_DEFAULT_ARG: {
1946       bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields];
1947       if (HasOtherExprStored) {
1948         Expr *SubExpr = ReadSubExpr();
1949         S = CXXDefaultArgExpr::Create(Context, SourceLocation(), 0, SubExpr);
1950       } else
1951         S = new (Context) CXXDefaultArgExpr(Empty);
1952       break;
1953     }
1954     case EXPR_CXX_BIND_TEMPORARY:
1955       S = new (Context) CXXBindTemporaryExpr(Empty);
1956       break;
1957 
1958     case EXPR_CXX_SCALAR_VALUE_INIT:
1959       S = new (Context) CXXScalarValueInitExpr(Empty);
1960       break;
1961     case EXPR_CXX_NEW:
1962       S = new (Context) CXXNewExpr(Empty);
1963       break;
1964     case EXPR_CXX_DELETE:
1965       S = new (Context) CXXDeleteExpr(Empty);
1966       break;
1967     case EXPR_CXX_PSEUDO_DESTRUCTOR:
1968       S = new (Context) CXXPseudoDestructorExpr(Empty);
1969       break;
1970 
1971     case EXPR_EXPR_WITH_CLEANUPS:
1972       S = ExprWithCleanups::Create(Context, Empty,
1973                                    Record[ASTStmtReader::NumExprFields]);
1974       break;
1975 
1976     case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
1977       S = CXXDependentScopeMemberExpr::CreateEmpty(Context,
1978           /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
1979                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
1980                                    ? Record[ASTStmtReader::NumExprFields + 1]
1981                                    : 0);
1982       break;
1983 
1984     case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
1985       S = DependentScopeDeclRefExpr::CreateEmpty(Context,
1986           /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
1987                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
1988                                    ? Record[ASTStmtReader::NumExprFields + 1]
1989                                    : 0);
1990       break;
1991 
1992     case EXPR_CXX_UNRESOLVED_CONSTRUCT:
1993       S = CXXUnresolvedConstructExpr::CreateEmpty(Context,
1994                               /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
1995       break;
1996 
1997     case EXPR_CXX_UNRESOLVED_MEMBER:
1998       S = UnresolvedMemberExpr::CreateEmpty(Context,
1999           /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
2000                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
2001                                    ? Record[ASTStmtReader::NumExprFields + 1]
2002                                    : 0);
2003       break;
2004 
2005     case EXPR_CXX_UNRESOLVED_LOOKUP:
2006       S = UnresolvedLookupExpr::CreateEmpty(Context,
2007           /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
2008                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
2009                                    ? Record[ASTStmtReader::NumExprFields + 1]
2010                                    : 0);
2011       break;
2012 
2013     case EXPR_CXX_UNARY_TYPE_TRAIT:
2014       S = new (Context) UnaryTypeTraitExpr(Empty);
2015       break;
2016 
2017     case EXPR_BINARY_TYPE_TRAIT:
2018       S = new (Context) BinaryTypeTraitExpr(Empty);
2019       break;
2020 
2021     case EXPR_ARRAY_TYPE_TRAIT:
2022       S = new (Context) ArrayTypeTraitExpr(Empty);
2023       break;
2024 
2025     case EXPR_CXX_EXPRESSION_TRAIT:
2026       S = new (Context) ExpressionTraitExpr(Empty);
2027       break;
2028 
2029     case EXPR_CXX_NOEXCEPT:
2030       S = new (Context) CXXNoexceptExpr(Empty);
2031       break;
2032 
2033     case EXPR_PACK_EXPANSION:
2034       S = new (Context) PackExpansionExpr(Empty);
2035       break;
2036 
2037     case EXPR_SIZEOF_PACK:
2038       S = new (Context) SizeOfPackExpr(Empty);
2039       break;
2040 
2041     case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:
2042       S = new (Context) SubstNonTypeTemplateParmExpr(Empty);
2043       break;
2044 
2045     case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:
2046       S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);
2047       break;
2048 
2049     case EXPR_MATERIALIZE_TEMPORARY:
2050       S = new (Context) MaterializeTemporaryExpr(Empty);
2051       break;
2052 
2053     case EXPR_OPAQUE_VALUE:
2054       S = new (Context) OpaqueValueExpr(Empty);
2055       break;
2056 
2057     case EXPR_CUDA_KERNEL_CALL:
2058       S = new (Context) CUDAKernelCallExpr(Context, Empty);
2059       break;
2060 
2061     case EXPR_ASTYPE:
2062       S = new (Context) AsTypeExpr(Empty);
2063       break;
2064 
2065     case EXPR_PSEUDO_OBJECT: {
2066       unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields];
2067       S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs);
2068       break;
2069     }
2070 
2071     case EXPR_ATOMIC:
2072       S = new (Context) AtomicExpr(Empty);
2073       break;
2074     }
2075 
2076     // We hit a STMT_STOP, so we're done with this expression.
2077     if (Finished)
2078       break;
2079 
2080     ++NumStatementsRead;
2081 
2082     if (S && !IsStmtReference) {
2083       Reader.Visit(S);
2084       StmtEntries[Cursor.GetCurrentBitNo()] = S;
2085     }
2086 
2087 
2088     assert(Idx == Record.size() && "Invalid deserialization of statement");
2089     StmtStack.push_back(S);
2090   }
2091 
2092 #ifndef NDEBUG
2093   assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
2094   assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
2095 #endif
2096 
2097   return StmtStack.pop_back_val();
2098 }
2099