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