xref: /aosp_15_r20/external/clang/lib/Serialization/ASTReaderStmt.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- ASTReaderStmt.cpp - Stmt/Expr Deserialization ----------*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // Statement/expression deserialization.  This implements the
11*67e74705SXin Li // ASTReader::ReadStmt method.
12*67e74705SXin Li //
13*67e74705SXin Li //===----------------------------------------------------------------------===//
14*67e74705SXin Li 
15*67e74705SXin Li #include "clang/Serialization/ASTReader.h"
16*67e74705SXin Li #include "clang/AST/ASTContext.h"
17*67e74705SXin Li #include "clang/AST/DeclCXX.h"
18*67e74705SXin Li #include "clang/AST/DeclTemplate.h"
19*67e74705SXin Li #include "clang/AST/StmtVisitor.h"
20*67e74705SXin Li #include "clang/Lex/Token.h"
21*67e74705SXin Li #include "llvm/ADT/SmallString.h"
22*67e74705SXin Li using namespace clang;
23*67e74705SXin Li using namespace clang::serialization;
24*67e74705SXin Li 
25*67e74705SXin Li namespace clang {
26*67e74705SXin Li 
27*67e74705SXin Li   class ASTStmtReader : public StmtVisitor<ASTStmtReader> {
28*67e74705SXin Li     friend class OMPClauseReader;
29*67e74705SXin Li     typedef ASTReader::RecordData RecordData;
30*67e74705SXin Li 
31*67e74705SXin Li     ASTReader &Reader;
32*67e74705SXin Li     ModuleFile &F;
33*67e74705SXin Li     llvm::BitstreamCursor &DeclsCursor;
34*67e74705SXin Li     const ASTReader::RecordData &Record;
35*67e74705SXin Li     unsigned &Idx;
36*67e74705SXin Li 
ReadToken(const RecordData & R,unsigned & I)37*67e74705SXin Li     Token ReadToken(const RecordData &R, unsigned &I) {
38*67e74705SXin Li       return Reader.ReadToken(F, R, I);
39*67e74705SXin Li     }
40*67e74705SXin Li 
ReadSourceLocation(const RecordData & R,unsigned & I)41*67e74705SXin Li     SourceLocation ReadSourceLocation(const RecordData &R, unsigned &I) {
42*67e74705SXin Li       return Reader.ReadSourceLocation(F, R, I);
43*67e74705SXin Li     }
44*67e74705SXin Li 
ReadSourceRange(const RecordData & R,unsigned & I)45*67e74705SXin Li     SourceRange ReadSourceRange(const RecordData &R, unsigned &I) {
46*67e74705SXin Li       return Reader.ReadSourceRange(F, R, I);
47*67e74705SXin Li     }
48*67e74705SXin Li 
ReadString(const RecordData & R,unsigned & I)49*67e74705SXin Li     std::string ReadString(const RecordData &R, unsigned &I) {
50*67e74705SXin Li       return Reader.ReadString(R, I);
51*67e74705SXin Li     }
52*67e74705SXin Li 
GetTypeSourceInfo(const RecordData & R,unsigned & I)53*67e74705SXin Li     TypeSourceInfo *GetTypeSourceInfo(const RecordData &R, unsigned &I) {
54*67e74705SXin Li       return Reader.GetTypeSourceInfo(F, R, I);
55*67e74705SXin Li     }
56*67e74705SXin Li 
ReadDeclID(const RecordData & R,unsigned & I)57*67e74705SXin Li     serialization::DeclID ReadDeclID(const RecordData &R, unsigned &I) {
58*67e74705SXin Li       return Reader.ReadDeclID(F, R, I);
59*67e74705SXin Li     }
60*67e74705SXin Li 
ReadDecl(const RecordData & R,unsigned & I)61*67e74705SXin Li     Decl *ReadDecl(const RecordData &R, unsigned &I) {
62*67e74705SXin Li       return Reader.ReadDecl(F, R, I);
63*67e74705SXin Li     }
64*67e74705SXin Li 
65*67e74705SXin Li     template<typename T>
ReadDeclAs(const RecordData & R,unsigned & I)66*67e74705SXin Li     T *ReadDeclAs(const RecordData &R, unsigned &I) {
67*67e74705SXin Li       return Reader.ReadDeclAs<T>(F, R, I);
68*67e74705SXin Li     }
69*67e74705SXin Li 
ReadDeclarationNameLoc(DeclarationNameLoc & DNLoc,DeclarationName Name,const ASTReader::RecordData & R,unsigned & I)70*67e74705SXin Li     void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name,
71*67e74705SXin Li                                 const ASTReader::RecordData &R, unsigned &I) {
72*67e74705SXin Li       Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I);
73*67e74705SXin Li     }
74*67e74705SXin Li 
ReadDeclarationNameInfo(DeclarationNameInfo & NameInfo,const ASTReader::RecordData & R,unsigned & I)75*67e74705SXin Li     void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo,
76*67e74705SXin Li                                 const ASTReader::RecordData &R, unsigned &I) {
77*67e74705SXin Li       Reader.ReadDeclarationNameInfo(F, NameInfo, R, I);
78*67e74705SXin Li     }
79*67e74705SXin Li 
80*67e74705SXin Li   public:
ASTStmtReader(ASTReader & Reader,ModuleFile & F,llvm::BitstreamCursor & Cursor,const ASTReader::RecordData & Record,unsigned & Idx)81*67e74705SXin Li     ASTStmtReader(ASTReader &Reader, ModuleFile &F,
82*67e74705SXin Li                   llvm::BitstreamCursor &Cursor,
83*67e74705SXin Li                   const ASTReader::RecordData &Record, unsigned &Idx)
84*67e74705SXin Li       : Reader(Reader), F(F), DeclsCursor(Cursor), Record(Record), Idx(Idx) { }
85*67e74705SXin Li 
86*67e74705SXin Li     /// \brief The number of record fields required for the Stmt class
87*67e74705SXin Li     /// itself.
88*67e74705SXin Li     static const unsigned NumStmtFields = 0;
89*67e74705SXin Li 
90*67e74705SXin Li     /// \brief The number of record fields required for the Expr class
91*67e74705SXin Li     /// itself.
92*67e74705SXin Li     static const unsigned NumExprFields = NumStmtFields + 7;
93*67e74705SXin Li 
94*67e74705SXin Li     /// \brief Read and initialize a ExplicitTemplateArgumentList structure.
95*67e74705SXin Li     void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,
96*67e74705SXin Li                                    TemplateArgumentLoc *ArgsLocArray,
97*67e74705SXin Li                                    unsigned NumTemplateArgs);
98*67e74705SXin Li     /// \brief Read and initialize a ExplicitTemplateArgumentList structure.
99*67e74705SXin Li     void ReadExplicitTemplateArgumentList(ASTTemplateArgumentListInfo &ArgList,
100*67e74705SXin Li                                           unsigned NumTemplateArgs);
101*67e74705SXin Li 
102*67e74705SXin Li     void VisitStmt(Stmt *S);
103*67e74705SXin Li #define STMT(Type, Base) \
104*67e74705SXin Li     void Visit##Type(Type *);
105*67e74705SXin Li #include "clang/AST/StmtNodes.inc"
106*67e74705SXin Li   };
107*67e74705SXin Li }
108*67e74705SXin Li 
ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo & Args,TemplateArgumentLoc * ArgsLocArray,unsigned NumTemplateArgs)109*67e74705SXin Li void ASTStmtReader::ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,
110*67e74705SXin Li                                               TemplateArgumentLoc *ArgsLocArray,
111*67e74705SXin Li                                               unsigned NumTemplateArgs) {
112*67e74705SXin Li   SourceLocation TemplateKWLoc = ReadSourceLocation(Record, Idx);
113*67e74705SXin Li   TemplateArgumentListInfo ArgInfo;
114*67e74705SXin Li   ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx));
115*67e74705SXin Li   ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx));
116*67e74705SXin Li   for (unsigned i = 0; i != NumTemplateArgs; ++i)
117*67e74705SXin Li     ArgInfo.addArgument(
118*67e74705SXin Li         Reader.ReadTemplateArgumentLoc(F, Record, Idx));
119*67e74705SXin Li   Args.initializeFrom(TemplateKWLoc, ArgInfo, ArgsLocArray);
120*67e74705SXin Li }
121*67e74705SXin Li 
VisitStmt(Stmt * S)122*67e74705SXin Li void ASTStmtReader::VisitStmt(Stmt *S) {
123*67e74705SXin Li   assert(Idx == NumStmtFields && "Incorrect statement field count");
124*67e74705SXin Li }
125*67e74705SXin Li 
VisitNullStmt(NullStmt * S)126*67e74705SXin Li void ASTStmtReader::VisitNullStmt(NullStmt *S) {
127*67e74705SXin Li   VisitStmt(S);
128*67e74705SXin Li   S->setSemiLoc(ReadSourceLocation(Record, Idx));
129*67e74705SXin Li   S->HasLeadingEmptyMacro = Record[Idx++];
130*67e74705SXin Li }
131*67e74705SXin Li 
VisitCompoundStmt(CompoundStmt * S)132*67e74705SXin Li void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) {
133*67e74705SXin Li   VisitStmt(S);
134*67e74705SXin Li   SmallVector<Stmt *, 16> Stmts;
135*67e74705SXin Li   unsigned NumStmts = Record[Idx++];
136*67e74705SXin Li   while (NumStmts--)
137*67e74705SXin Li     Stmts.push_back(Reader.ReadSubStmt());
138*67e74705SXin Li   S->setStmts(Reader.getContext(), Stmts);
139*67e74705SXin Li   S->LBraceLoc = ReadSourceLocation(Record, Idx);
140*67e74705SXin Li   S->RBraceLoc = ReadSourceLocation(Record, Idx);
141*67e74705SXin Li }
142*67e74705SXin Li 
VisitSwitchCase(SwitchCase * S)143*67e74705SXin Li void ASTStmtReader::VisitSwitchCase(SwitchCase *S) {
144*67e74705SXin Li   VisitStmt(S);
145*67e74705SXin Li   Reader.RecordSwitchCaseID(S, Record[Idx++]);
146*67e74705SXin Li   S->setKeywordLoc(ReadSourceLocation(Record, Idx));
147*67e74705SXin Li   S->setColonLoc(ReadSourceLocation(Record, Idx));
148*67e74705SXin Li }
149*67e74705SXin Li 
VisitCaseStmt(CaseStmt * S)150*67e74705SXin Li void ASTStmtReader::VisitCaseStmt(CaseStmt *S) {
151*67e74705SXin Li   VisitSwitchCase(S);
152*67e74705SXin Li   S->setLHS(Reader.ReadSubExpr());
153*67e74705SXin Li   S->setRHS(Reader.ReadSubExpr());
154*67e74705SXin Li   S->setSubStmt(Reader.ReadSubStmt());
155*67e74705SXin Li   S->setEllipsisLoc(ReadSourceLocation(Record, Idx));
156*67e74705SXin Li }
157*67e74705SXin Li 
VisitDefaultStmt(DefaultStmt * S)158*67e74705SXin Li void ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) {
159*67e74705SXin Li   VisitSwitchCase(S);
160*67e74705SXin Li   S->setSubStmt(Reader.ReadSubStmt());
161*67e74705SXin Li }
162*67e74705SXin Li 
VisitLabelStmt(LabelStmt * S)163*67e74705SXin Li void ASTStmtReader::VisitLabelStmt(LabelStmt *S) {
164*67e74705SXin Li   VisitStmt(S);
165*67e74705SXin Li   LabelDecl *LD = ReadDeclAs<LabelDecl>(Record, Idx);
166*67e74705SXin Li   LD->setStmt(S);
167*67e74705SXin Li   S->setDecl(LD);
168*67e74705SXin Li   S->setSubStmt(Reader.ReadSubStmt());
169*67e74705SXin Li   S->setIdentLoc(ReadSourceLocation(Record, Idx));
170*67e74705SXin Li }
171*67e74705SXin Li 
VisitAttributedStmt(AttributedStmt * S)172*67e74705SXin Li void ASTStmtReader::VisitAttributedStmt(AttributedStmt *S) {
173*67e74705SXin Li   VisitStmt(S);
174*67e74705SXin Li   uint64_t NumAttrs = Record[Idx++];
175*67e74705SXin Li   AttrVec Attrs;
176*67e74705SXin Li   Reader.ReadAttributes(F, Attrs, Record, Idx);
177*67e74705SXin Li   (void)NumAttrs;
178*67e74705SXin Li   assert(NumAttrs == S->NumAttrs);
179*67e74705SXin Li   assert(NumAttrs == Attrs.size());
180*67e74705SXin Li   std::copy(Attrs.begin(), Attrs.end(), S->getAttrArrayPtr());
181*67e74705SXin Li   S->SubStmt = Reader.ReadSubStmt();
182*67e74705SXin Li   S->AttrLoc = ReadSourceLocation(Record, Idx);
183*67e74705SXin Li }
184*67e74705SXin Li 
VisitIfStmt(IfStmt * S)185*67e74705SXin Li void ASTStmtReader::VisitIfStmt(IfStmt *S) {
186*67e74705SXin Li   VisitStmt(S);
187*67e74705SXin Li   S->setConstexpr(Record[Idx++]);
188*67e74705SXin Li   S->setInit(Reader.ReadSubStmt());
189*67e74705SXin Li   S->setConditionVariable(Reader.getContext(),
190*67e74705SXin Li                           ReadDeclAs<VarDecl>(Record, Idx));
191*67e74705SXin Li   S->setCond(Reader.ReadSubExpr());
192*67e74705SXin Li   S->setThen(Reader.ReadSubStmt());
193*67e74705SXin Li   S->setElse(Reader.ReadSubStmt());
194*67e74705SXin Li   S->setIfLoc(ReadSourceLocation(Record, Idx));
195*67e74705SXin Li   S->setElseLoc(ReadSourceLocation(Record, Idx));
196*67e74705SXin Li }
197*67e74705SXin Li 
VisitSwitchStmt(SwitchStmt * S)198*67e74705SXin Li void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) {
199*67e74705SXin Li   VisitStmt(S);
200*67e74705SXin Li   S->setInit(Reader.ReadSubStmt());
201*67e74705SXin Li   S->setConditionVariable(Reader.getContext(),
202*67e74705SXin Li                           ReadDeclAs<VarDecl>(Record, Idx));
203*67e74705SXin Li   S->setCond(Reader.ReadSubExpr());
204*67e74705SXin Li   S->setBody(Reader.ReadSubStmt());
205*67e74705SXin Li   S->setSwitchLoc(ReadSourceLocation(Record, Idx));
206*67e74705SXin Li   if (Record[Idx++])
207*67e74705SXin Li     S->setAllEnumCasesCovered();
208*67e74705SXin Li 
209*67e74705SXin Li   SwitchCase *PrevSC = nullptr;
210*67e74705SXin Li   for (unsigned N = Record.size(); Idx != N; ++Idx) {
211*67e74705SXin Li     SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]);
212*67e74705SXin Li     if (PrevSC)
213*67e74705SXin Li       PrevSC->setNextSwitchCase(SC);
214*67e74705SXin Li     else
215*67e74705SXin Li       S->setSwitchCaseList(SC);
216*67e74705SXin Li 
217*67e74705SXin Li     PrevSC = SC;
218*67e74705SXin Li   }
219*67e74705SXin Li }
220*67e74705SXin Li 
VisitWhileStmt(WhileStmt * S)221*67e74705SXin Li void ASTStmtReader::VisitWhileStmt(WhileStmt *S) {
222*67e74705SXin Li   VisitStmt(S);
223*67e74705SXin Li   S->setConditionVariable(Reader.getContext(),
224*67e74705SXin Li                           ReadDeclAs<VarDecl>(Record, Idx));
225*67e74705SXin Li 
226*67e74705SXin Li   S->setCond(Reader.ReadSubExpr());
227*67e74705SXin Li   S->setBody(Reader.ReadSubStmt());
228*67e74705SXin Li   S->setWhileLoc(ReadSourceLocation(Record, Idx));
229*67e74705SXin Li }
230*67e74705SXin Li 
VisitDoStmt(DoStmt * S)231*67e74705SXin Li void ASTStmtReader::VisitDoStmt(DoStmt *S) {
232*67e74705SXin Li   VisitStmt(S);
233*67e74705SXin Li   S->setCond(Reader.ReadSubExpr());
234*67e74705SXin Li   S->setBody(Reader.ReadSubStmt());
235*67e74705SXin Li   S->setDoLoc(ReadSourceLocation(Record, Idx));
236*67e74705SXin Li   S->setWhileLoc(ReadSourceLocation(Record, Idx));
237*67e74705SXin Li   S->setRParenLoc(ReadSourceLocation(Record, Idx));
238*67e74705SXin Li }
239*67e74705SXin Li 
VisitForStmt(ForStmt * S)240*67e74705SXin Li void ASTStmtReader::VisitForStmt(ForStmt *S) {
241*67e74705SXin Li   VisitStmt(S);
242*67e74705SXin Li   S->setInit(Reader.ReadSubStmt());
243*67e74705SXin Li   S->setCond(Reader.ReadSubExpr());
244*67e74705SXin Li   S->setConditionVariable(Reader.getContext(),
245*67e74705SXin Li                           ReadDeclAs<VarDecl>(Record, Idx));
246*67e74705SXin Li   S->setInc(Reader.ReadSubExpr());
247*67e74705SXin Li   S->setBody(Reader.ReadSubStmt());
248*67e74705SXin Li   S->setForLoc(ReadSourceLocation(Record, Idx));
249*67e74705SXin Li   S->setLParenLoc(ReadSourceLocation(Record, Idx));
250*67e74705SXin Li   S->setRParenLoc(ReadSourceLocation(Record, Idx));
251*67e74705SXin Li }
252*67e74705SXin Li 
VisitGotoStmt(GotoStmt * S)253*67e74705SXin Li void ASTStmtReader::VisitGotoStmt(GotoStmt *S) {
254*67e74705SXin Li   VisitStmt(S);
255*67e74705SXin Li   S->setLabel(ReadDeclAs<LabelDecl>(Record, Idx));
256*67e74705SXin Li   S->setGotoLoc(ReadSourceLocation(Record, Idx));
257*67e74705SXin Li   S->setLabelLoc(ReadSourceLocation(Record, Idx));
258*67e74705SXin Li }
259*67e74705SXin Li 
VisitIndirectGotoStmt(IndirectGotoStmt * S)260*67e74705SXin Li void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
261*67e74705SXin Li   VisitStmt(S);
262*67e74705SXin Li   S->setGotoLoc(ReadSourceLocation(Record, Idx));
263*67e74705SXin Li   S->setStarLoc(ReadSourceLocation(Record, Idx));
264*67e74705SXin Li   S->setTarget(Reader.ReadSubExpr());
265*67e74705SXin Li }
266*67e74705SXin Li 
VisitContinueStmt(ContinueStmt * S)267*67e74705SXin Li void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {
268*67e74705SXin Li   VisitStmt(S);
269*67e74705SXin Li   S->setContinueLoc(ReadSourceLocation(Record, Idx));
270*67e74705SXin Li }
271*67e74705SXin Li 
VisitBreakStmt(BreakStmt * S)272*67e74705SXin Li void ASTStmtReader::VisitBreakStmt(BreakStmt *S) {
273*67e74705SXin Li   VisitStmt(S);
274*67e74705SXin Li   S->setBreakLoc(ReadSourceLocation(Record, Idx));
275*67e74705SXin Li }
276*67e74705SXin Li 
VisitReturnStmt(ReturnStmt * S)277*67e74705SXin Li void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) {
278*67e74705SXin Li   VisitStmt(S);
279*67e74705SXin Li   S->setRetValue(Reader.ReadSubExpr());
280*67e74705SXin Li   S->setReturnLoc(ReadSourceLocation(Record, Idx));
281*67e74705SXin Li   S->setNRVOCandidate(ReadDeclAs<VarDecl>(Record, Idx));
282*67e74705SXin Li }
283*67e74705SXin Li 
VisitDeclStmt(DeclStmt * S)284*67e74705SXin Li void ASTStmtReader::VisitDeclStmt(DeclStmt *S) {
285*67e74705SXin Li   VisitStmt(S);
286*67e74705SXin Li   S->setStartLoc(ReadSourceLocation(Record, Idx));
287*67e74705SXin Li   S->setEndLoc(ReadSourceLocation(Record, Idx));
288*67e74705SXin Li 
289*67e74705SXin Li   if (Idx + 1 == Record.size()) {
290*67e74705SXin Li     // Single declaration
291*67e74705SXin Li     S->setDeclGroup(DeclGroupRef(ReadDecl(Record, Idx)));
292*67e74705SXin Li   } else {
293*67e74705SXin Li     SmallVector<Decl *, 16> Decls;
294*67e74705SXin Li     Decls.reserve(Record.size() - Idx);
295*67e74705SXin Li     for (unsigned N = Record.size(); Idx != N; )
296*67e74705SXin Li       Decls.push_back(ReadDecl(Record, Idx));
297*67e74705SXin Li     S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Reader.getContext(),
298*67e74705SXin Li                                                    Decls.data(),
299*67e74705SXin Li                                                    Decls.size())));
300*67e74705SXin Li   }
301*67e74705SXin Li }
302*67e74705SXin Li 
VisitAsmStmt(AsmStmt * S)303*67e74705SXin Li void ASTStmtReader::VisitAsmStmt(AsmStmt *S) {
304*67e74705SXin Li   VisitStmt(S);
305*67e74705SXin Li   S->NumOutputs = Record[Idx++];
306*67e74705SXin Li   S->NumInputs = Record[Idx++];
307*67e74705SXin Li   S->NumClobbers = Record[Idx++];
308*67e74705SXin Li   S->setAsmLoc(ReadSourceLocation(Record, Idx));
309*67e74705SXin Li   S->setVolatile(Record[Idx++]);
310*67e74705SXin Li   S->setSimple(Record[Idx++]);
311*67e74705SXin Li }
312*67e74705SXin Li 
VisitGCCAsmStmt(GCCAsmStmt * S)313*67e74705SXin Li void ASTStmtReader::VisitGCCAsmStmt(GCCAsmStmt *S) {
314*67e74705SXin Li   VisitAsmStmt(S);
315*67e74705SXin Li   S->setRParenLoc(ReadSourceLocation(Record, Idx));
316*67e74705SXin Li   S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
317*67e74705SXin Li 
318*67e74705SXin Li   unsigned NumOutputs = S->getNumOutputs();
319*67e74705SXin Li   unsigned NumInputs = S->getNumInputs();
320*67e74705SXin Li   unsigned NumClobbers = S->getNumClobbers();
321*67e74705SXin Li 
322*67e74705SXin Li   // Outputs and inputs
323*67e74705SXin Li   SmallVector<IdentifierInfo *, 16> Names;
324*67e74705SXin Li   SmallVector<StringLiteral*, 16> Constraints;
325*67e74705SXin Li   SmallVector<Stmt*, 16> Exprs;
326*67e74705SXin Li   for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {
327*67e74705SXin Li     Names.push_back(Reader.GetIdentifierInfo(F, Record, Idx));
328*67e74705SXin Li     Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
329*67e74705SXin Li     Exprs.push_back(Reader.ReadSubStmt());
330*67e74705SXin Li   }
331*67e74705SXin Li 
332*67e74705SXin Li   // Constraints
333*67e74705SXin Li   SmallVector<StringLiteral*, 16> Clobbers;
334*67e74705SXin Li   for (unsigned I = 0; I != NumClobbers; ++I)
335*67e74705SXin Li     Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
336*67e74705SXin Li 
337*67e74705SXin Li   S->setOutputsAndInputsAndClobbers(Reader.getContext(),
338*67e74705SXin Li                                     Names.data(), Constraints.data(),
339*67e74705SXin Li                                     Exprs.data(), NumOutputs, NumInputs,
340*67e74705SXin Li                                     Clobbers.data(), NumClobbers);
341*67e74705SXin Li }
342*67e74705SXin Li 
VisitMSAsmStmt(MSAsmStmt * S)343*67e74705SXin Li void ASTStmtReader::VisitMSAsmStmt(MSAsmStmt *S) {
344*67e74705SXin Li   VisitAsmStmt(S);
345*67e74705SXin Li   S->LBraceLoc = ReadSourceLocation(Record, Idx);
346*67e74705SXin Li   S->EndLoc = ReadSourceLocation(Record, Idx);
347*67e74705SXin Li   S->NumAsmToks = Record[Idx++];
348*67e74705SXin Li   std::string AsmStr = ReadString(Record, Idx);
349*67e74705SXin Li 
350*67e74705SXin Li   // Read the tokens.
351*67e74705SXin Li   SmallVector<Token, 16> AsmToks;
352*67e74705SXin Li   AsmToks.reserve(S->NumAsmToks);
353*67e74705SXin Li   for (unsigned i = 0, e = S->NumAsmToks; i != e; ++i) {
354*67e74705SXin Li     AsmToks.push_back(ReadToken(Record, Idx));
355*67e74705SXin Li   }
356*67e74705SXin Li 
357*67e74705SXin Li   // The calls to reserve() for the FooData vectors are mandatory to
358*67e74705SXin Li   // prevent dead StringRefs in the Foo vectors.
359*67e74705SXin Li 
360*67e74705SXin Li   // Read the clobbers.
361*67e74705SXin Li   SmallVector<std::string, 16> ClobbersData;
362*67e74705SXin Li   SmallVector<StringRef, 16> Clobbers;
363*67e74705SXin Li   ClobbersData.reserve(S->NumClobbers);
364*67e74705SXin Li   Clobbers.reserve(S->NumClobbers);
365*67e74705SXin Li   for (unsigned i = 0, e = S->NumClobbers; i != e; ++i) {
366*67e74705SXin Li     ClobbersData.push_back(ReadString(Record, Idx));
367*67e74705SXin Li     Clobbers.push_back(ClobbersData.back());
368*67e74705SXin Li   }
369*67e74705SXin Li 
370*67e74705SXin Li   // Read the operands.
371*67e74705SXin Li   unsigned NumOperands = S->NumOutputs + S->NumInputs;
372*67e74705SXin Li   SmallVector<Expr*, 16> Exprs;
373*67e74705SXin Li   SmallVector<std::string, 16> ConstraintsData;
374*67e74705SXin Li   SmallVector<StringRef, 16> Constraints;
375*67e74705SXin Li   Exprs.reserve(NumOperands);
376*67e74705SXin Li   ConstraintsData.reserve(NumOperands);
377*67e74705SXin Li   Constraints.reserve(NumOperands);
378*67e74705SXin Li   for (unsigned i = 0; i != NumOperands; ++i) {
379*67e74705SXin Li     Exprs.push_back(cast<Expr>(Reader.ReadSubStmt()));
380*67e74705SXin Li     ConstraintsData.push_back(ReadString(Record, Idx));
381*67e74705SXin Li     Constraints.push_back(ConstraintsData.back());
382*67e74705SXin Li   }
383*67e74705SXin Li 
384*67e74705SXin Li   S->initialize(Reader.getContext(), AsmStr, AsmToks,
385*67e74705SXin Li                 Constraints, Exprs, Clobbers);
386*67e74705SXin Li }
387*67e74705SXin Li 
VisitCoroutineBodyStmt(CoroutineBodyStmt * S)388*67e74705SXin Li void ASTStmtReader::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {
389*67e74705SXin Li   // FIXME: Implement coroutine serialization.
390*67e74705SXin Li   llvm_unreachable("unimplemented");
391*67e74705SXin Li }
392*67e74705SXin Li 
VisitCoreturnStmt(CoreturnStmt * S)393*67e74705SXin Li void ASTStmtReader::VisitCoreturnStmt(CoreturnStmt *S) {
394*67e74705SXin Li   // FIXME: Implement coroutine serialization.
395*67e74705SXin Li   llvm_unreachable("unimplemented");
396*67e74705SXin Li }
397*67e74705SXin Li 
VisitCoawaitExpr(CoawaitExpr * S)398*67e74705SXin Li void ASTStmtReader::VisitCoawaitExpr(CoawaitExpr *S) {
399*67e74705SXin Li   // FIXME: Implement coroutine serialization.
400*67e74705SXin Li   llvm_unreachable("unimplemented");
401*67e74705SXin Li }
402*67e74705SXin Li 
VisitCoyieldExpr(CoyieldExpr * S)403*67e74705SXin Li void ASTStmtReader::VisitCoyieldExpr(CoyieldExpr *S) {
404*67e74705SXin Li   // FIXME: Implement coroutine serialization.
405*67e74705SXin Li   llvm_unreachable("unimplemented");
406*67e74705SXin Li }
407*67e74705SXin Li 
VisitCapturedStmt(CapturedStmt * S)408*67e74705SXin Li void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) {
409*67e74705SXin Li   VisitStmt(S);
410*67e74705SXin Li   ++Idx;
411*67e74705SXin Li   S->setCapturedDecl(ReadDeclAs<CapturedDecl>(Record, Idx));
412*67e74705SXin Li   S->setCapturedRegionKind(static_cast<CapturedRegionKind>(Record[Idx++]));
413*67e74705SXin Li   S->setCapturedRecordDecl(ReadDeclAs<RecordDecl>(Record, Idx));
414*67e74705SXin Li 
415*67e74705SXin Li   // Capture inits
416*67e74705SXin Li   for (CapturedStmt::capture_init_iterator I = S->capture_init_begin(),
417*67e74705SXin Li                                            E = S->capture_init_end();
418*67e74705SXin Li        I != E; ++I)
419*67e74705SXin Li     *I = Reader.ReadSubExpr();
420*67e74705SXin Li 
421*67e74705SXin Li   // Body
422*67e74705SXin Li   S->setCapturedStmt(Reader.ReadSubStmt());
423*67e74705SXin Li   S->getCapturedDecl()->setBody(S->getCapturedStmt());
424*67e74705SXin Li 
425*67e74705SXin Li   // Captures
426*67e74705SXin Li   for (auto &I : S->captures()) {
427*67e74705SXin Li     I.VarAndKind.setPointer(ReadDeclAs<VarDecl>(Record, Idx));
428*67e74705SXin Li     I.VarAndKind
429*67e74705SXin Li         .setInt(static_cast<CapturedStmt::VariableCaptureKind>(Record[Idx++]));
430*67e74705SXin Li     I.Loc = ReadSourceLocation(Record, Idx);
431*67e74705SXin Li   }
432*67e74705SXin Li }
433*67e74705SXin Li 
VisitExpr(Expr * E)434*67e74705SXin Li void ASTStmtReader::VisitExpr(Expr *E) {
435*67e74705SXin Li   VisitStmt(E);
436*67e74705SXin Li   E->setType(Reader.readType(F, Record, Idx));
437*67e74705SXin Li   E->setTypeDependent(Record[Idx++]);
438*67e74705SXin Li   E->setValueDependent(Record[Idx++]);
439*67e74705SXin Li   E->setInstantiationDependent(Record[Idx++]);
440*67e74705SXin Li   E->ExprBits.ContainsUnexpandedParameterPack = Record[Idx++];
441*67e74705SXin Li   E->setValueKind(static_cast<ExprValueKind>(Record[Idx++]));
442*67e74705SXin Li   E->setObjectKind(static_cast<ExprObjectKind>(Record[Idx++]));
443*67e74705SXin Li   assert(Idx == NumExprFields && "Incorrect expression field count");
444*67e74705SXin Li }
445*67e74705SXin Li 
VisitPredefinedExpr(PredefinedExpr * E)446*67e74705SXin Li void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {
447*67e74705SXin Li   VisitExpr(E);
448*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
449*67e74705SXin Li   E->Type = (PredefinedExpr::IdentType)Record[Idx++];
450*67e74705SXin Li   E->FnName = cast_or_null<StringLiteral>(Reader.ReadSubExpr());
451*67e74705SXin Li }
452*67e74705SXin Li 
VisitDeclRefExpr(DeclRefExpr * E)453*67e74705SXin Li void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {
454*67e74705SXin Li   VisitExpr(E);
455*67e74705SXin Li 
456*67e74705SXin Li   E->DeclRefExprBits.HasQualifier = Record[Idx++];
457*67e74705SXin Li   E->DeclRefExprBits.HasFoundDecl = Record[Idx++];
458*67e74705SXin Li   E->DeclRefExprBits.HasTemplateKWAndArgsInfo = Record[Idx++];
459*67e74705SXin Li   E->DeclRefExprBits.HadMultipleCandidates = Record[Idx++];
460*67e74705SXin Li   E->DeclRefExprBits.RefersToEnclosingVariableOrCapture = Record[Idx++];
461*67e74705SXin Li   unsigned NumTemplateArgs = 0;
462*67e74705SXin Li   if (E->hasTemplateKWAndArgsInfo())
463*67e74705SXin Li     NumTemplateArgs = Record[Idx++];
464*67e74705SXin Li 
465*67e74705SXin Li   if (E->hasQualifier())
466*67e74705SXin Li     new (E->getTrailingObjects<NestedNameSpecifierLoc>())
467*67e74705SXin Li         NestedNameSpecifierLoc(
468*67e74705SXin Li             Reader.ReadNestedNameSpecifierLoc(F, Record, Idx));
469*67e74705SXin Li 
470*67e74705SXin Li   if (E->hasFoundDecl())
471*67e74705SXin Li     *E->getTrailingObjects<NamedDecl *>() = ReadDeclAs<NamedDecl>(Record, Idx);
472*67e74705SXin Li 
473*67e74705SXin Li   if (E->hasTemplateKWAndArgsInfo())
474*67e74705SXin Li     ReadTemplateKWAndArgsInfo(
475*67e74705SXin Li         *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
476*67e74705SXin Li         E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs);
477*67e74705SXin Li 
478*67e74705SXin Li   E->setDecl(ReadDeclAs<ValueDecl>(Record, Idx));
479*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
480*67e74705SXin Li   ReadDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record, Idx);
481*67e74705SXin Li }
482*67e74705SXin Li 
VisitIntegerLiteral(IntegerLiteral * E)483*67e74705SXin Li void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
484*67e74705SXin Li   VisitExpr(E);
485*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
486*67e74705SXin Li   E->setValue(Reader.getContext(), Reader.ReadAPInt(Record, Idx));
487*67e74705SXin Li }
488*67e74705SXin Li 
VisitFloatingLiteral(FloatingLiteral * E)489*67e74705SXin Li void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {
490*67e74705SXin Li   VisitExpr(E);
491*67e74705SXin Li   E->setRawSemantics(static_cast<Stmt::APFloatSemantics>(Record[Idx++]));
492*67e74705SXin Li   E->setExact(Record[Idx++]);
493*67e74705SXin Li   E->setValue(Reader.getContext(),
494*67e74705SXin Li               Reader.ReadAPFloat(Record, E->getSemantics(), Idx));
495*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
496*67e74705SXin Li }
497*67e74705SXin Li 
VisitImaginaryLiteral(ImaginaryLiteral * E)498*67e74705SXin Li void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
499*67e74705SXin Li   VisitExpr(E);
500*67e74705SXin Li   E->setSubExpr(Reader.ReadSubExpr());
501*67e74705SXin Li }
502*67e74705SXin Li 
VisitStringLiteral(StringLiteral * E)503*67e74705SXin Li void ASTStmtReader::VisitStringLiteral(StringLiteral *E) {
504*67e74705SXin Li   VisitExpr(E);
505*67e74705SXin Li   unsigned Len = Record[Idx++];
506*67e74705SXin Li   assert(Record[Idx] == E->getNumConcatenated() &&
507*67e74705SXin Li          "Wrong number of concatenated tokens!");
508*67e74705SXin Li   ++Idx;
509*67e74705SXin Li   StringLiteral::StringKind kind =
510*67e74705SXin Li         static_cast<StringLiteral::StringKind>(Record[Idx++]);
511*67e74705SXin Li   bool isPascal = Record[Idx++];
512*67e74705SXin Li 
513*67e74705SXin Li   // Read string data
514*67e74705SXin Li   SmallString<16> Str(&Record[Idx], &Record[Idx] + Len);
515*67e74705SXin Li   E->setString(Reader.getContext(), Str, kind, isPascal);
516*67e74705SXin Li   Idx += Len;
517*67e74705SXin Li 
518*67e74705SXin Li   // Read source locations
519*67e74705SXin Li   for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
520*67e74705SXin Li     E->setStrTokenLoc(I, ReadSourceLocation(Record, Idx));
521*67e74705SXin Li }
522*67e74705SXin Li 
VisitCharacterLiteral(CharacterLiteral * E)523*67e74705SXin Li void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
524*67e74705SXin Li   VisitExpr(E);
525*67e74705SXin Li   E->setValue(Record[Idx++]);
526*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
527*67e74705SXin Li   E->setKind(static_cast<CharacterLiteral::CharacterKind>(Record[Idx++]));
528*67e74705SXin Li }
529*67e74705SXin Li 
VisitParenExpr(ParenExpr * E)530*67e74705SXin Li void ASTStmtReader::VisitParenExpr(ParenExpr *E) {
531*67e74705SXin Li   VisitExpr(E);
532*67e74705SXin Li   E->setLParen(ReadSourceLocation(Record, Idx));
533*67e74705SXin Li   E->setRParen(ReadSourceLocation(Record, Idx));
534*67e74705SXin Li   E->setSubExpr(Reader.ReadSubExpr());
535*67e74705SXin Li }
536*67e74705SXin Li 
VisitParenListExpr(ParenListExpr * E)537*67e74705SXin Li void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {
538*67e74705SXin Li   VisitExpr(E);
539*67e74705SXin Li   unsigned NumExprs = Record[Idx++];
540*67e74705SXin Li   E->Exprs = new (Reader.getContext()) Stmt*[NumExprs];
541*67e74705SXin Li   for (unsigned i = 0; i != NumExprs; ++i)
542*67e74705SXin Li     E->Exprs[i] = Reader.ReadSubStmt();
543*67e74705SXin Li   E->NumExprs = NumExprs;
544*67e74705SXin Li   E->LParenLoc = ReadSourceLocation(Record, Idx);
545*67e74705SXin Li   E->RParenLoc = ReadSourceLocation(Record, Idx);
546*67e74705SXin Li }
547*67e74705SXin Li 
VisitUnaryOperator(UnaryOperator * E)548*67e74705SXin Li void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {
549*67e74705SXin Li   VisitExpr(E);
550*67e74705SXin Li   E->setSubExpr(Reader.ReadSubExpr());
551*67e74705SXin Li   E->setOpcode((UnaryOperator::Opcode)Record[Idx++]);
552*67e74705SXin Li   E->setOperatorLoc(ReadSourceLocation(Record, Idx));
553*67e74705SXin Li }
554*67e74705SXin Li 
VisitOffsetOfExpr(OffsetOfExpr * E)555*67e74705SXin Li void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
556*67e74705SXin Li   VisitExpr(E);
557*67e74705SXin Li   assert(E->getNumComponents() == Record[Idx]);
558*67e74705SXin Li   ++Idx;
559*67e74705SXin Li   assert(E->getNumExpressions() == Record[Idx]);
560*67e74705SXin Li   ++Idx;
561*67e74705SXin Li   E->setOperatorLoc(ReadSourceLocation(Record, Idx));
562*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
563*67e74705SXin Li   E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
564*67e74705SXin Li   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
565*67e74705SXin Li     OffsetOfNode::Kind Kind = static_cast<OffsetOfNode::Kind>(Record[Idx++]);
566*67e74705SXin Li     SourceLocation Start = ReadSourceLocation(Record, Idx);
567*67e74705SXin Li     SourceLocation End = ReadSourceLocation(Record, Idx);
568*67e74705SXin Li     switch (Kind) {
569*67e74705SXin Li     case OffsetOfNode::Array:
570*67e74705SXin Li       E->setComponent(I, OffsetOfNode(Start, Record[Idx++], End));
571*67e74705SXin Li       break;
572*67e74705SXin Li 
573*67e74705SXin Li     case OffsetOfNode::Field:
574*67e74705SXin Li       E->setComponent(
575*67e74705SXin Li           I, OffsetOfNode(Start, ReadDeclAs<FieldDecl>(Record, Idx), End));
576*67e74705SXin Li       break;
577*67e74705SXin Li 
578*67e74705SXin Li     case OffsetOfNode::Identifier:
579*67e74705SXin Li       E->setComponent(
580*67e74705SXin Li           I,
581*67e74705SXin Li           OffsetOfNode(Start, Reader.GetIdentifierInfo(F, Record, Idx), End));
582*67e74705SXin Li       break;
583*67e74705SXin Li 
584*67e74705SXin Li     case OffsetOfNode::Base: {
585*67e74705SXin Li       CXXBaseSpecifier *Base = new (Reader.getContext()) CXXBaseSpecifier();
586*67e74705SXin Li       *Base = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
587*67e74705SXin Li       E->setComponent(I, OffsetOfNode(Base));
588*67e74705SXin Li       break;
589*67e74705SXin Li     }
590*67e74705SXin Li     }
591*67e74705SXin Li   }
592*67e74705SXin Li 
593*67e74705SXin Li   for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
594*67e74705SXin Li     E->setIndexExpr(I, Reader.ReadSubExpr());
595*67e74705SXin Li }
596*67e74705SXin Li 
VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * E)597*67e74705SXin Li void ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
598*67e74705SXin Li   VisitExpr(E);
599*67e74705SXin Li   E->setKind(static_cast<UnaryExprOrTypeTrait>(Record[Idx++]));
600*67e74705SXin Li   if (Record[Idx] == 0) {
601*67e74705SXin Li     E->setArgument(Reader.ReadSubExpr());
602*67e74705SXin Li     ++Idx;
603*67e74705SXin Li   } else {
604*67e74705SXin Li     E->setArgument(GetTypeSourceInfo(Record, Idx));
605*67e74705SXin Li   }
606*67e74705SXin Li   E->setOperatorLoc(ReadSourceLocation(Record, Idx));
607*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
608*67e74705SXin Li }
609*67e74705SXin Li 
VisitArraySubscriptExpr(ArraySubscriptExpr * E)610*67e74705SXin Li void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
611*67e74705SXin Li   VisitExpr(E);
612*67e74705SXin Li   E->setLHS(Reader.ReadSubExpr());
613*67e74705SXin Li   E->setRHS(Reader.ReadSubExpr());
614*67e74705SXin Li   E->setRBracketLoc(ReadSourceLocation(Record, Idx));
615*67e74705SXin Li }
616*67e74705SXin Li 
VisitOMPArraySectionExpr(OMPArraySectionExpr * E)617*67e74705SXin Li void ASTStmtReader::VisitOMPArraySectionExpr(OMPArraySectionExpr *E) {
618*67e74705SXin Li   VisitExpr(E);
619*67e74705SXin Li   E->setBase(Reader.ReadSubExpr());
620*67e74705SXin Li   E->setLowerBound(Reader.ReadSubExpr());
621*67e74705SXin Li   E->setLength(Reader.ReadSubExpr());
622*67e74705SXin Li   E->setColonLoc(ReadSourceLocation(Record, Idx));
623*67e74705SXin Li   E->setRBracketLoc(ReadSourceLocation(Record, Idx));
624*67e74705SXin Li }
625*67e74705SXin Li 
VisitCallExpr(CallExpr * E)626*67e74705SXin Li void ASTStmtReader::VisitCallExpr(CallExpr *E) {
627*67e74705SXin Li   VisitExpr(E);
628*67e74705SXin Li   E->setNumArgs(Reader.getContext(), Record[Idx++]);
629*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
630*67e74705SXin Li   E->setCallee(Reader.ReadSubExpr());
631*67e74705SXin Li   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
632*67e74705SXin Li     E->setArg(I, Reader.ReadSubExpr());
633*67e74705SXin Li }
634*67e74705SXin Li 
VisitCXXMemberCallExpr(CXXMemberCallExpr * E)635*67e74705SXin Li void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
636*67e74705SXin Li   VisitCallExpr(E);
637*67e74705SXin Li }
638*67e74705SXin Li 
VisitMemberExpr(MemberExpr * E)639*67e74705SXin Li void ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
640*67e74705SXin Li   // Don't call VisitExpr, this is fully initialized at creation.
641*67e74705SXin Li   assert(E->getStmtClass() == Stmt::MemberExprClass &&
642*67e74705SXin Li          "It's a subclass, we must advance Idx!");
643*67e74705SXin Li }
644*67e74705SXin Li 
VisitObjCIsaExpr(ObjCIsaExpr * E)645*67e74705SXin Li void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
646*67e74705SXin Li   VisitExpr(E);
647*67e74705SXin Li   E->setBase(Reader.ReadSubExpr());
648*67e74705SXin Li   E->setIsaMemberLoc(ReadSourceLocation(Record, Idx));
649*67e74705SXin Li   E->setOpLoc(ReadSourceLocation(Record, Idx));
650*67e74705SXin Li   E->setArrow(Record[Idx++]);
651*67e74705SXin Li }
652*67e74705SXin Li 
653*67e74705SXin Li void ASTStmtReader::
VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr * E)654*67e74705SXin Li VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
655*67e74705SXin Li   VisitExpr(E);
656*67e74705SXin Li   E->Operand = Reader.ReadSubExpr();
657*67e74705SXin Li   E->setShouldCopy(Record[Idx++]);
658*67e74705SXin Li }
659*67e74705SXin Li 
VisitObjCBridgedCastExpr(ObjCBridgedCastExpr * E)660*67e74705SXin Li void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
661*67e74705SXin Li   VisitExplicitCastExpr(E);
662*67e74705SXin Li   E->LParenLoc = ReadSourceLocation(Record, Idx);
663*67e74705SXin Li   E->BridgeKeywordLoc = ReadSourceLocation(Record, Idx);
664*67e74705SXin Li   E->Kind = Record[Idx++];
665*67e74705SXin Li }
666*67e74705SXin Li 
VisitCastExpr(CastExpr * E)667*67e74705SXin Li void ASTStmtReader::VisitCastExpr(CastExpr *E) {
668*67e74705SXin Li   VisitExpr(E);
669*67e74705SXin Li   unsigned NumBaseSpecs = Record[Idx++];
670*67e74705SXin Li   assert(NumBaseSpecs == E->path_size());
671*67e74705SXin Li   E->setSubExpr(Reader.ReadSubExpr());
672*67e74705SXin Li   E->setCastKind((CastKind)Record[Idx++]);
673*67e74705SXin Li   CastExpr::path_iterator BaseI = E->path_begin();
674*67e74705SXin Li   while (NumBaseSpecs--) {
675*67e74705SXin Li     CXXBaseSpecifier *BaseSpec = new (Reader.getContext()) CXXBaseSpecifier;
676*67e74705SXin Li     *BaseSpec = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
677*67e74705SXin Li     *BaseI++ = BaseSpec;
678*67e74705SXin Li   }
679*67e74705SXin Li }
680*67e74705SXin Li 
VisitBinaryOperator(BinaryOperator * E)681*67e74705SXin Li void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {
682*67e74705SXin Li   VisitExpr(E);
683*67e74705SXin Li   E->setLHS(Reader.ReadSubExpr());
684*67e74705SXin Li   E->setRHS(Reader.ReadSubExpr());
685*67e74705SXin Li   E->setOpcode((BinaryOperator::Opcode)Record[Idx++]);
686*67e74705SXin Li   E->setOperatorLoc(ReadSourceLocation(Record, Idx));
687*67e74705SXin Li   E->setFPContractable((bool)Record[Idx++]);
688*67e74705SXin Li }
689*67e74705SXin Li 
VisitCompoundAssignOperator(CompoundAssignOperator * E)690*67e74705SXin Li void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
691*67e74705SXin Li   VisitBinaryOperator(E);
692*67e74705SXin Li   E->setComputationLHSType(Reader.readType(F, Record, Idx));
693*67e74705SXin Li   E->setComputationResultType(Reader.readType(F, Record, Idx));
694*67e74705SXin Li }
695*67e74705SXin Li 
VisitConditionalOperator(ConditionalOperator * E)696*67e74705SXin Li void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
697*67e74705SXin Li   VisitExpr(E);
698*67e74705SXin Li   E->SubExprs[ConditionalOperator::COND] = Reader.ReadSubExpr();
699*67e74705SXin Li   E->SubExprs[ConditionalOperator::LHS] = Reader.ReadSubExpr();
700*67e74705SXin Li   E->SubExprs[ConditionalOperator::RHS] = Reader.ReadSubExpr();
701*67e74705SXin Li   E->QuestionLoc = ReadSourceLocation(Record, Idx);
702*67e74705SXin Li   E->ColonLoc = ReadSourceLocation(Record, Idx);
703*67e74705SXin Li }
704*67e74705SXin Li 
705*67e74705SXin Li void
VisitBinaryConditionalOperator(BinaryConditionalOperator * E)706*67e74705SXin Li ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
707*67e74705SXin Li   VisitExpr(E);
708*67e74705SXin Li   E->OpaqueValue = cast<OpaqueValueExpr>(Reader.ReadSubExpr());
709*67e74705SXin Li   E->SubExprs[BinaryConditionalOperator::COMMON] = Reader.ReadSubExpr();
710*67e74705SXin Li   E->SubExprs[BinaryConditionalOperator::COND] = Reader.ReadSubExpr();
711*67e74705SXin Li   E->SubExprs[BinaryConditionalOperator::LHS] = Reader.ReadSubExpr();
712*67e74705SXin Li   E->SubExprs[BinaryConditionalOperator::RHS] = Reader.ReadSubExpr();
713*67e74705SXin Li   E->QuestionLoc = ReadSourceLocation(Record, Idx);
714*67e74705SXin Li   E->ColonLoc = ReadSourceLocation(Record, Idx);
715*67e74705SXin Li }
716*67e74705SXin Li 
VisitImplicitCastExpr(ImplicitCastExpr * E)717*67e74705SXin Li void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
718*67e74705SXin Li   VisitCastExpr(E);
719*67e74705SXin Li }
720*67e74705SXin Li 
VisitExplicitCastExpr(ExplicitCastExpr * E)721*67e74705SXin Li void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
722*67e74705SXin Li   VisitCastExpr(E);
723*67e74705SXin Li   E->setTypeInfoAsWritten(GetTypeSourceInfo(Record, Idx));
724*67e74705SXin Li }
725*67e74705SXin Li 
VisitCStyleCastExpr(CStyleCastExpr * E)726*67e74705SXin Li void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
727*67e74705SXin Li   VisitExplicitCastExpr(E);
728*67e74705SXin Li   E->setLParenLoc(ReadSourceLocation(Record, Idx));
729*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
730*67e74705SXin Li }
731*67e74705SXin Li 
VisitCompoundLiteralExpr(CompoundLiteralExpr * E)732*67e74705SXin Li void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
733*67e74705SXin Li   VisitExpr(E);
734*67e74705SXin Li   E->setLParenLoc(ReadSourceLocation(Record, Idx));
735*67e74705SXin Li   E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
736*67e74705SXin Li   E->setInitializer(Reader.ReadSubExpr());
737*67e74705SXin Li   E->setFileScope(Record[Idx++]);
738*67e74705SXin Li }
739*67e74705SXin Li 
VisitExtVectorElementExpr(ExtVectorElementExpr * E)740*67e74705SXin Li void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
741*67e74705SXin Li   VisitExpr(E);
742*67e74705SXin Li   E->setBase(Reader.ReadSubExpr());
743*67e74705SXin Li   E->setAccessor(Reader.GetIdentifierInfo(F, Record, Idx));
744*67e74705SXin Li   E->setAccessorLoc(ReadSourceLocation(Record, Idx));
745*67e74705SXin Li }
746*67e74705SXin Li 
VisitInitListExpr(InitListExpr * E)747*67e74705SXin Li void ASTStmtReader::VisitInitListExpr(InitListExpr *E) {
748*67e74705SXin Li   VisitExpr(E);
749*67e74705SXin Li   if (InitListExpr *SyntForm = cast_or_null<InitListExpr>(Reader.ReadSubStmt()))
750*67e74705SXin Li     E->setSyntacticForm(SyntForm);
751*67e74705SXin Li   E->setLBraceLoc(ReadSourceLocation(Record, Idx));
752*67e74705SXin Li   E->setRBraceLoc(ReadSourceLocation(Record, Idx));
753*67e74705SXin Li   bool isArrayFiller = Record[Idx++];
754*67e74705SXin Li   Expr *filler = nullptr;
755*67e74705SXin Li   if (isArrayFiller) {
756*67e74705SXin Li     filler = Reader.ReadSubExpr();
757*67e74705SXin Li     E->ArrayFillerOrUnionFieldInit = filler;
758*67e74705SXin Li   } else
759*67e74705SXin Li     E->ArrayFillerOrUnionFieldInit = ReadDeclAs<FieldDecl>(Record, Idx);
760*67e74705SXin Li   E->sawArrayRangeDesignator(Record[Idx++]);
761*67e74705SXin Li   unsigned NumInits = Record[Idx++];
762*67e74705SXin Li   E->reserveInits(Reader.getContext(), NumInits);
763*67e74705SXin Li   if (isArrayFiller) {
764*67e74705SXin Li     for (unsigned I = 0; I != NumInits; ++I) {
765*67e74705SXin Li       Expr *init = Reader.ReadSubExpr();
766*67e74705SXin Li       E->updateInit(Reader.getContext(), I, init ? init : filler);
767*67e74705SXin Li     }
768*67e74705SXin Li   } else {
769*67e74705SXin Li     for (unsigned I = 0; I != NumInits; ++I)
770*67e74705SXin Li       E->updateInit(Reader.getContext(), I, Reader.ReadSubExpr());
771*67e74705SXin Li   }
772*67e74705SXin Li }
773*67e74705SXin Li 
VisitDesignatedInitExpr(DesignatedInitExpr * E)774*67e74705SXin Li void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
775*67e74705SXin Li   typedef DesignatedInitExpr::Designator Designator;
776*67e74705SXin Li 
777*67e74705SXin Li   VisitExpr(E);
778*67e74705SXin Li   unsigned NumSubExprs = Record[Idx++];
779*67e74705SXin Li   assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
780*67e74705SXin Li   for (unsigned I = 0; I != NumSubExprs; ++I)
781*67e74705SXin Li     E->setSubExpr(I, Reader.ReadSubExpr());
782*67e74705SXin Li   E->setEqualOrColonLoc(ReadSourceLocation(Record, Idx));
783*67e74705SXin Li   E->setGNUSyntax(Record[Idx++]);
784*67e74705SXin Li 
785*67e74705SXin Li   SmallVector<Designator, 4> Designators;
786*67e74705SXin Li   while (Idx < Record.size()) {
787*67e74705SXin Li     switch ((DesignatorTypes)Record[Idx++]) {
788*67e74705SXin Li     case DESIG_FIELD_DECL: {
789*67e74705SXin Li       FieldDecl *Field = ReadDeclAs<FieldDecl>(Record, Idx);
790*67e74705SXin Li       SourceLocation DotLoc
791*67e74705SXin Li         = ReadSourceLocation(Record, Idx);
792*67e74705SXin Li       SourceLocation FieldLoc
793*67e74705SXin Li         = ReadSourceLocation(Record, Idx);
794*67e74705SXin Li       Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
795*67e74705SXin Li                                        FieldLoc));
796*67e74705SXin Li       Designators.back().setField(Field);
797*67e74705SXin Li       break;
798*67e74705SXin Li     }
799*67e74705SXin Li 
800*67e74705SXin Li     case DESIG_FIELD_NAME: {
801*67e74705SXin Li       const IdentifierInfo *Name = Reader.GetIdentifierInfo(F, Record, Idx);
802*67e74705SXin Li       SourceLocation DotLoc
803*67e74705SXin Li         = ReadSourceLocation(Record, Idx);
804*67e74705SXin Li       SourceLocation FieldLoc
805*67e74705SXin Li         = ReadSourceLocation(Record, Idx);
806*67e74705SXin Li       Designators.push_back(Designator(Name, DotLoc, FieldLoc));
807*67e74705SXin Li       break;
808*67e74705SXin Li     }
809*67e74705SXin Li 
810*67e74705SXin Li     case DESIG_ARRAY: {
811*67e74705SXin Li       unsigned Index = Record[Idx++];
812*67e74705SXin Li       SourceLocation LBracketLoc
813*67e74705SXin Li         = ReadSourceLocation(Record, Idx);
814*67e74705SXin Li       SourceLocation RBracketLoc
815*67e74705SXin Li         = ReadSourceLocation(Record, Idx);
816*67e74705SXin Li       Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
817*67e74705SXin Li       break;
818*67e74705SXin Li     }
819*67e74705SXin Li 
820*67e74705SXin Li     case DESIG_ARRAY_RANGE: {
821*67e74705SXin Li       unsigned Index = Record[Idx++];
822*67e74705SXin Li       SourceLocation LBracketLoc
823*67e74705SXin Li         = ReadSourceLocation(Record, Idx);
824*67e74705SXin Li       SourceLocation EllipsisLoc
825*67e74705SXin Li         = ReadSourceLocation(Record, Idx);
826*67e74705SXin Li       SourceLocation RBracketLoc
827*67e74705SXin Li         = ReadSourceLocation(Record, Idx);
828*67e74705SXin Li       Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
829*67e74705SXin Li                                        RBracketLoc));
830*67e74705SXin Li       break;
831*67e74705SXin Li     }
832*67e74705SXin Li     }
833*67e74705SXin Li   }
834*67e74705SXin Li   E->setDesignators(Reader.getContext(),
835*67e74705SXin Li                     Designators.data(), Designators.size());
836*67e74705SXin Li }
837*67e74705SXin Li 
VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr * E)838*67e74705SXin Li void ASTStmtReader::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {
839*67e74705SXin Li   VisitExpr(E);
840*67e74705SXin Li   E->setBase(Reader.ReadSubExpr());
841*67e74705SXin Li   E->setUpdater(Reader.ReadSubExpr());
842*67e74705SXin Li }
843*67e74705SXin Li 
VisitNoInitExpr(NoInitExpr * E)844*67e74705SXin Li void ASTStmtReader::VisitNoInitExpr(NoInitExpr *E) {
845*67e74705SXin Li   VisitExpr(E);
846*67e74705SXin Li }
847*67e74705SXin Li 
VisitImplicitValueInitExpr(ImplicitValueInitExpr * E)848*67e74705SXin Li void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
849*67e74705SXin Li   VisitExpr(E);
850*67e74705SXin Li }
851*67e74705SXin Li 
VisitVAArgExpr(VAArgExpr * E)852*67e74705SXin Li void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {
853*67e74705SXin Li   VisitExpr(E);
854*67e74705SXin Li   E->setSubExpr(Reader.ReadSubExpr());
855*67e74705SXin Li   E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx));
856*67e74705SXin Li   E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
857*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
858*67e74705SXin Li   E->setIsMicrosoftABI(Record[Idx++]);
859*67e74705SXin Li }
860*67e74705SXin Li 
VisitAddrLabelExpr(AddrLabelExpr * E)861*67e74705SXin Li void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
862*67e74705SXin Li   VisitExpr(E);
863*67e74705SXin Li   E->setAmpAmpLoc(ReadSourceLocation(Record, Idx));
864*67e74705SXin Li   E->setLabelLoc(ReadSourceLocation(Record, Idx));
865*67e74705SXin Li   E->setLabel(ReadDeclAs<LabelDecl>(Record, Idx));
866*67e74705SXin Li }
867*67e74705SXin Li 
VisitStmtExpr(StmtExpr * E)868*67e74705SXin Li void ASTStmtReader::VisitStmtExpr(StmtExpr *E) {
869*67e74705SXin Li   VisitExpr(E);
870*67e74705SXin Li   E->setLParenLoc(ReadSourceLocation(Record, Idx));
871*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
872*67e74705SXin Li   E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt()));
873*67e74705SXin Li }
874*67e74705SXin Li 
VisitChooseExpr(ChooseExpr * E)875*67e74705SXin Li void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {
876*67e74705SXin Li   VisitExpr(E);
877*67e74705SXin Li   E->setCond(Reader.ReadSubExpr());
878*67e74705SXin Li   E->setLHS(Reader.ReadSubExpr());
879*67e74705SXin Li   E->setRHS(Reader.ReadSubExpr());
880*67e74705SXin Li   E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
881*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
882*67e74705SXin Li   E->setIsConditionTrue(Record[Idx++]);
883*67e74705SXin Li }
884*67e74705SXin Li 
VisitGNUNullExpr(GNUNullExpr * E)885*67e74705SXin Li void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
886*67e74705SXin Li   VisitExpr(E);
887*67e74705SXin Li   E->setTokenLocation(ReadSourceLocation(Record, Idx));
888*67e74705SXin Li }
889*67e74705SXin Li 
VisitShuffleVectorExpr(ShuffleVectorExpr * E)890*67e74705SXin Li void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
891*67e74705SXin Li   VisitExpr(E);
892*67e74705SXin Li   SmallVector<Expr *, 16> Exprs;
893*67e74705SXin Li   unsigned NumExprs = Record[Idx++];
894*67e74705SXin Li   while (NumExprs--)
895*67e74705SXin Li     Exprs.push_back(Reader.ReadSubExpr());
896*67e74705SXin Li   E->setExprs(Reader.getContext(), Exprs);
897*67e74705SXin Li   E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
898*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
899*67e74705SXin Li }
900*67e74705SXin Li 
VisitConvertVectorExpr(ConvertVectorExpr * E)901*67e74705SXin Li void ASTStmtReader::VisitConvertVectorExpr(ConvertVectorExpr *E) {
902*67e74705SXin Li   VisitExpr(E);
903*67e74705SXin Li   E->BuiltinLoc = ReadSourceLocation(Record, Idx);
904*67e74705SXin Li   E->RParenLoc = ReadSourceLocation(Record, Idx);
905*67e74705SXin Li   E->TInfo = GetTypeSourceInfo(Record, Idx);
906*67e74705SXin Li   E->SrcExpr = Reader.ReadSubExpr();
907*67e74705SXin Li }
908*67e74705SXin Li 
VisitBlockExpr(BlockExpr * E)909*67e74705SXin Li void ASTStmtReader::VisitBlockExpr(BlockExpr *E) {
910*67e74705SXin Li   VisitExpr(E);
911*67e74705SXin Li   E->setBlockDecl(ReadDeclAs<BlockDecl>(Record, Idx));
912*67e74705SXin Li }
913*67e74705SXin Li 
VisitGenericSelectionExpr(GenericSelectionExpr * E)914*67e74705SXin Li void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
915*67e74705SXin Li   VisitExpr(E);
916*67e74705SXin Li   E->NumAssocs = Record[Idx++];
917*67e74705SXin Li   E->AssocTypes = new (Reader.getContext()) TypeSourceInfo*[E->NumAssocs];
918*67e74705SXin Li   E->SubExprs =
919*67e74705SXin Li    new(Reader.getContext()) Stmt*[GenericSelectionExpr::END_EXPR+E->NumAssocs];
920*67e74705SXin Li 
921*67e74705SXin Li   E->SubExprs[GenericSelectionExpr::CONTROLLING] = Reader.ReadSubExpr();
922*67e74705SXin Li   for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {
923*67e74705SXin Li     E->AssocTypes[I] = GetTypeSourceInfo(Record, Idx);
924*67e74705SXin Li     E->SubExprs[GenericSelectionExpr::END_EXPR+I] = Reader.ReadSubExpr();
925*67e74705SXin Li   }
926*67e74705SXin Li   E->ResultIndex = Record[Idx++];
927*67e74705SXin Li 
928*67e74705SXin Li   E->GenericLoc = ReadSourceLocation(Record, Idx);
929*67e74705SXin Li   E->DefaultLoc = ReadSourceLocation(Record, Idx);
930*67e74705SXin Li   E->RParenLoc = ReadSourceLocation(Record, Idx);
931*67e74705SXin Li }
932*67e74705SXin Li 
VisitPseudoObjectExpr(PseudoObjectExpr * E)933*67e74705SXin Li void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
934*67e74705SXin Li   VisitExpr(E);
935*67e74705SXin Li   unsigned numSemanticExprs = Record[Idx++];
936*67e74705SXin Li   assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs);
937*67e74705SXin Li   E->PseudoObjectExprBits.ResultIndex = Record[Idx++];
938*67e74705SXin Li 
939*67e74705SXin Li   // Read the syntactic expression.
940*67e74705SXin Li   E->getSubExprsBuffer()[0] = Reader.ReadSubExpr();
941*67e74705SXin Li 
942*67e74705SXin Li   // Read all the semantic expressions.
943*67e74705SXin Li   for (unsigned i = 0; i != numSemanticExprs; ++i) {
944*67e74705SXin Li     Expr *subExpr = Reader.ReadSubExpr();
945*67e74705SXin Li     E->getSubExprsBuffer()[i+1] = subExpr;
946*67e74705SXin Li   }
947*67e74705SXin Li }
948*67e74705SXin Li 
VisitAtomicExpr(AtomicExpr * E)949*67e74705SXin Li void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) {
950*67e74705SXin Li   VisitExpr(E);
951*67e74705SXin Li   E->Op = AtomicExpr::AtomicOp(Record[Idx++]);
952*67e74705SXin Li   E->NumSubExprs = AtomicExpr::getNumSubExprs(E->Op);
953*67e74705SXin Li   for (unsigned I = 0; I != E->NumSubExprs; ++I)
954*67e74705SXin Li     E->SubExprs[I] = Reader.ReadSubExpr();
955*67e74705SXin Li   E->BuiltinLoc = ReadSourceLocation(Record, Idx);
956*67e74705SXin Li   E->RParenLoc = ReadSourceLocation(Record, Idx);
957*67e74705SXin Li }
958*67e74705SXin Li 
959*67e74705SXin Li //===----------------------------------------------------------------------===//
960*67e74705SXin Li // Objective-C Expressions and Statements
961*67e74705SXin Li 
VisitObjCStringLiteral(ObjCStringLiteral * E)962*67e74705SXin Li void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
963*67e74705SXin Li   VisitExpr(E);
964*67e74705SXin Li   E->setString(cast<StringLiteral>(Reader.ReadSubStmt()));
965*67e74705SXin Li   E->setAtLoc(ReadSourceLocation(Record, Idx));
966*67e74705SXin Li }
967*67e74705SXin Li 
VisitObjCBoxedExpr(ObjCBoxedExpr * E)968*67e74705SXin Li void ASTStmtReader::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
969*67e74705SXin Li   VisitExpr(E);
970*67e74705SXin Li   // could be one of several IntegerLiteral, FloatLiteral, etc.
971*67e74705SXin Li   E->SubExpr = Reader.ReadSubStmt();
972*67e74705SXin Li   E->BoxingMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
973*67e74705SXin Li   E->Range = ReadSourceRange(Record, Idx);
974*67e74705SXin Li }
975*67e74705SXin Li 
VisitObjCArrayLiteral(ObjCArrayLiteral * E)976*67e74705SXin Li void ASTStmtReader::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
977*67e74705SXin Li   VisitExpr(E);
978*67e74705SXin Li   unsigned NumElements = Record[Idx++];
979*67e74705SXin Li   assert(NumElements == E->getNumElements() && "Wrong number of elements");
980*67e74705SXin Li   Expr **Elements = E->getElements();
981*67e74705SXin Li   for (unsigned I = 0, N = NumElements; I != N; ++I)
982*67e74705SXin Li     Elements[I] = Reader.ReadSubExpr();
983*67e74705SXin Li   E->ArrayWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
984*67e74705SXin Li   E->Range = ReadSourceRange(Record, Idx);
985*67e74705SXin Li }
986*67e74705SXin Li 
VisitObjCDictionaryLiteral(ObjCDictionaryLiteral * E)987*67e74705SXin Li void ASTStmtReader::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
988*67e74705SXin Li   VisitExpr(E);
989*67e74705SXin Li   unsigned NumElements = Record[Idx++];
990*67e74705SXin Li   assert(NumElements == E->getNumElements() && "Wrong number of elements");
991*67e74705SXin Li   bool HasPackExpansions = Record[Idx++];
992*67e74705SXin Li   assert(HasPackExpansions == E->HasPackExpansions &&"Pack expansion mismatch");
993*67e74705SXin Li   ObjCDictionaryLiteral::KeyValuePair *KeyValues =
994*67e74705SXin Li       E->getTrailingObjects<ObjCDictionaryLiteral::KeyValuePair>();
995*67e74705SXin Li   ObjCDictionaryLiteral::ExpansionData *Expansions =
996*67e74705SXin Li       E->getTrailingObjects<ObjCDictionaryLiteral::ExpansionData>();
997*67e74705SXin Li   for (unsigned I = 0; I != NumElements; ++I) {
998*67e74705SXin Li     KeyValues[I].Key = Reader.ReadSubExpr();
999*67e74705SXin Li     KeyValues[I].Value = Reader.ReadSubExpr();
1000*67e74705SXin Li     if (HasPackExpansions) {
1001*67e74705SXin Li       Expansions[I].EllipsisLoc = ReadSourceLocation(Record, Idx);
1002*67e74705SXin Li       Expansions[I].NumExpansionsPlusOne = Record[Idx++];
1003*67e74705SXin Li     }
1004*67e74705SXin Li   }
1005*67e74705SXin Li   E->DictWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
1006*67e74705SXin Li   E->Range = ReadSourceRange(Record, Idx);
1007*67e74705SXin Li }
1008*67e74705SXin Li 
VisitObjCEncodeExpr(ObjCEncodeExpr * E)1009*67e74705SXin Li void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1010*67e74705SXin Li   VisitExpr(E);
1011*67e74705SXin Li   E->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
1012*67e74705SXin Li   E->setAtLoc(ReadSourceLocation(Record, Idx));
1013*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
1014*67e74705SXin Li }
1015*67e74705SXin Li 
VisitObjCSelectorExpr(ObjCSelectorExpr * E)1016*67e74705SXin Li void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
1017*67e74705SXin Li   VisitExpr(E);
1018*67e74705SXin Li   E->setSelector(Reader.ReadSelector(F, Record, Idx));
1019*67e74705SXin Li   E->setAtLoc(ReadSourceLocation(Record, Idx));
1020*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
1021*67e74705SXin Li }
1022*67e74705SXin Li 
VisitObjCProtocolExpr(ObjCProtocolExpr * E)1023*67e74705SXin Li void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
1024*67e74705SXin Li   VisitExpr(E);
1025*67e74705SXin Li   E->setProtocol(ReadDeclAs<ObjCProtocolDecl>(Record, Idx));
1026*67e74705SXin Li   E->setAtLoc(ReadSourceLocation(Record, Idx));
1027*67e74705SXin Li   E->ProtoLoc = ReadSourceLocation(Record, Idx);
1028*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
1029*67e74705SXin Li }
1030*67e74705SXin Li 
VisitObjCIvarRefExpr(ObjCIvarRefExpr * E)1031*67e74705SXin Li void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1032*67e74705SXin Li   VisitExpr(E);
1033*67e74705SXin Li   E->setDecl(ReadDeclAs<ObjCIvarDecl>(Record, Idx));
1034*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
1035*67e74705SXin Li   E->setOpLoc(ReadSourceLocation(Record, Idx));
1036*67e74705SXin Li   E->setBase(Reader.ReadSubExpr());
1037*67e74705SXin Li   E->setIsArrow(Record[Idx++]);
1038*67e74705SXin Li   E->setIsFreeIvar(Record[Idx++]);
1039*67e74705SXin Li }
1040*67e74705SXin Li 
VisitObjCPropertyRefExpr(ObjCPropertyRefExpr * E)1041*67e74705SXin Li void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1042*67e74705SXin Li   VisitExpr(E);
1043*67e74705SXin Li   unsigned MethodRefFlags = Record[Idx++];
1044*67e74705SXin Li   bool Implicit = Record[Idx++] != 0;
1045*67e74705SXin Li   if (Implicit) {
1046*67e74705SXin Li     ObjCMethodDecl *Getter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
1047*67e74705SXin Li     ObjCMethodDecl *Setter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
1048*67e74705SXin Li     E->setImplicitProperty(Getter, Setter, MethodRefFlags);
1049*67e74705SXin Li   } else {
1050*67e74705SXin Li     E->setExplicitProperty(ReadDeclAs<ObjCPropertyDecl>(Record, Idx),
1051*67e74705SXin Li                            MethodRefFlags);
1052*67e74705SXin Li   }
1053*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
1054*67e74705SXin Li   E->setReceiverLocation(ReadSourceLocation(Record, Idx));
1055*67e74705SXin Li   switch (Record[Idx++]) {
1056*67e74705SXin Li   case 0:
1057*67e74705SXin Li     E->setBase(Reader.ReadSubExpr());
1058*67e74705SXin Li     break;
1059*67e74705SXin Li   case 1:
1060*67e74705SXin Li     E->setSuperReceiver(Reader.readType(F, Record, Idx));
1061*67e74705SXin Li     break;
1062*67e74705SXin Li   case 2:
1063*67e74705SXin Li     E->setClassReceiver(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx));
1064*67e74705SXin Li     break;
1065*67e74705SXin Li   }
1066*67e74705SXin Li }
1067*67e74705SXin Li 
VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr * E)1068*67e74705SXin Li void ASTStmtReader::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
1069*67e74705SXin Li   VisitExpr(E);
1070*67e74705SXin Li   E->setRBracket(ReadSourceLocation(Record, Idx));
1071*67e74705SXin Li   E->setBaseExpr(Reader.ReadSubExpr());
1072*67e74705SXin Li   E->setKeyExpr(Reader.ReadSubExpr());
1073*67e74705SXin Li   E->GetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
1074*67e74705SXin Li   E->SetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
1075*67e74705SXin Li }
1076*67e74705SXin Li 
VisitObjCMessageExpr(ObjCMessageExpr * E)1077*67e74705SXin Li void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1078*67e74705SXin Li   VisitExpr(E);
1079*67e74705SXin Li   assert(Record[Idx] == E->getNumArgs());
1080*67e74705SXin Li   ++Idx;
1081*67e74705SXin Li   unsigned NumStoredSelLocs = Record[Idx++];
1082*67e74705SXin Li   E->SelLocsKind = Record[Idx++];
1083*67e74705SXin Li   E->setDelegateInitCall(Record[Idx++]);
1084*67e74705SXin Li   E->IsImplicit = Record[Idx++];
1085*67e74705SXin Li   ObjCMessageExpr::ReceiverKind Kind
1086*67e74705SXin Li     = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
1087*67e74705SXin Li   switch (Kind) {
1088*67e74705SXin Li   case ObjCMessageExpr::Instance:
1089*67e74705SXin Li     E->setInstanceReceiver(Reader.ReadSubExpr());
1090*67e74705SXin Li     break;
1091*67e74705SXin Li 
1092*67e74705SXin Li   case ObjCMessageExpr::Class:
1093*67e74705SXin Li     E->setClassReceiver(GetTypeSourceInfo(Record, Idx));
1094*67e74705SXin Li     break;
1095*67e74705SXin Li 
1096*67e74705SXin Li   case ObjCMessageExpr::SuperClass:
1097*67e74705SXin Li   case ObjCMessageExpr::SuperInstance: {
1098*67e74705SXin Li     QualType T = Reader.readType(F, Record, Idx);
1099*67e74705SXin Li     SourceLocation SuperLoc = ReadSourceLocation(Record, Idx);
1100*67e74705SXin Li     E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
1101*67e74705SXin Li     break;
1102*67e74705SXin Li   }
1103*67e74705SXin Li   }
1104*67e74705SXin Li 
1105*67e74705SXin Li   assert(Kind == E->getReceiverKind());
1106*67e74705SXin Li 
1107*67e74705SXin Li   if (Record[Idx++])
1108*67e74705SXin Li     E->setMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx));
1109*67e74705SXin Li   else
1110*67e74705SXin Li     E->setSelector(Reader.ReadSelector(F, Record, Idx));
1111*67e74705SXin Li 
1112*67e74705SXin Li   E->LBracLoc = ReadSourceLocation(Record, Idx);
1113*67e74705SXin Li   E->RBracLoc = ReadSourceLocation(Record, Idx);
1114*67e74705SXin Li 
1115*67e74705SXin Li   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1116*67e74705SXin Li     E->setArg(I, Reader.ReadSubExpr());
1117*67e74705SXin Li 
1118*67e74705SXin Li   SourceLocation *Locs = E->getStoredSelLocs();
1119*67e74705SXin Li   for (unsigned I = 0; I != NumStoredSelLocs; ++I)
1120*67e74705SXin Li     Locs[I] = ReadSourceLocation(Record, Idx);
1121*67e74705SXin Li }
1122*67e74705SXin Li 
VisitObjCForCollectionStmt(ObjCForCollectionStmt * S)1123*67e74705SXin Li void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
1124*67e74705SXin Li   VisitStmt(S);
1125*67e74705SXin Li   S->setElement(Reader.ReadSubStmt());
1126*67e74705SXin Li   S->setCollection(Reader.ReadSubExpr());
1127*67e74705SXin Li   S->setBody(Reader.ReadSubStmt());
1128*67e74705SXin Li   S->setForLoc(ReadSourceLocation(Record, Idx));
1129*67e74705SXin Li   S->setRParenLoc(ReadSourceLocation(Record, Idx));
1130*67e74705SXin Li }
1131*67e74705SXin Li 
VisitObjCAtCatchStmt(ObjCAtCatchStmt * S)1132*67e74705SXin Li void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
1133*67e74705SXin Li   VisitStmt(S);
1134*67e74705SXin Li   S->setCatchBody(Reader.ReadSubStmt());
1135*67e74705SXin Li   S->setCatchParamDecl(ReadDeclAs<VarDecl>(Record, Idx));
1136*67e74705SXin Li   S->setAtCatchLoc(ReadSourceLocation(Record, Idx));
1137*67e74705SXin Li   S->setRParenLoc(ReadSourceLocation(Record, Idx));
1138*67e74705SXin Li }
1139*67e74705SXin Li 
VisitObjCAtFinallyStmt(ObjCAtFinallyStmt * S)1140*67e74705SXin Li void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
1141*67e74705SXin Li   VisitStmt(S);
1142*67e74705SXin Li   S->setFinallyBody(Reader.ReadSubStmt());
1143*67e74705SXin Li   S->setAtFinallyLoc(ReadSourceLocation(Record, Idx));
1144*67e74705SXin Li }
1145*67e74705SXin Li 
VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt * S)1146*67e74705SXin Li void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
1147*67e74705SXin Li   VisitStmt(S);
1148*67e74705SXin Li   S->setSubStmt(Reader.ReadSubStmt());
1149*67e74705SXin Li   S->setAtLoc(ReadSourceLocation(Record, Idx));
1150*67e74705SXin Li }
1151*67e74705SXin Li 
VisitObjCAtTryStmt(ObjCAtTryStmt * S)1152*67e74705SXin Li void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
1153*67e74705SXin Li   VisitStmt(S);
1154*67e74705SXin Li   assert(Record[Idx] == S->getNumCatchStmts());
1155*67e74705SXin Li   ++Idx;
1156*67e74705SXin Li   bool HasFinally = Record[Idx++];
1157*67e74705SXin Li   S->setTryBody(Reader.ReadSubStmt());
1158*67e74705SXin Li   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
1159*67e74705SXin Li     S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
1160*67e74705SXin Li 
1161*67e74705SXin Li   if (HasFinally)
1162*67e74705SXin Li     S->setFinallyStmt(Reader.ReadSubStmt());
1163*67e74705SXin Li   S->setAtTryLoc(ReadSourceLocation(Record, Idx));
1164*67e74705SXin Li }
1165*67e74705SXin Li 
VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * S)1166*67e74705SXin Li void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
1167*67e74705SXin Li   VisitStmt(S);
1168*67e74705SXin Li   S->setSynchExpr(Reader.ReadSubStmt());
1169*67e74705SXin Li   S->setSynchBody(Reader.ReadSubStmt());
1170*67e74705SXin Li   S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx));
1171*67e74705SXin Li }
1172*67e74705SXin Li 
VisitObjCAtThrowStmt(ObjCAtThrowStmt * S)1173*67e74705SXin Li void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
1174*67e74705SXin Li   VisitStmt(S);
1175*67e74705SXin Li   S->setThrowExpr(Reader.ReadSubStmt());
1176*67e74705SXin Li   S->setThrowLoc(ReadSourceLocation(Record, Idx));
1177*67e74705SXin Li }
1178*67e74705SXin Li 
VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr * E)1179*67e74705SXin Li void ASTStmtReader::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
1180*67e74705SXin Li   VisitExpr(E);
1181*67e74705SXin Li   E->setValue(Record[Idx++]);
1182*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
1183*67e74705SXin Li }
1184*67e74705SXin Li 
1185*67e74705SXin Li //===----------------------------------------------------------------------===//
1186*67e74705SXin Li // C++ Expressions and Statements
1187*67e74705SXin Li //===----------------------------------------------------------------------===//
1188*67e74705SXin Li 
VisitCXXCatchStmt(CXXCatchStmt * S)1189*67e74705SXin Li void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
1190*67e74705SXin Li   VisitStmt(S);
1191*67e74705SXin Li   S->CatchLoc = ReadSourceLocation(Record, Idx);
1192*67e74705SXin Li   S->ExceptionDecl = ReadDeclAs<VarDecl>(Record, Idx);
1193*67e74705SXin Li   S->HandlerBlock = Reader.ReadSubStmt();
1194*67e74705SXin Li }
1195*67e74705SXin Li 
VisitCXXTryStmt(CXXTryStmt * S)1196*67e74705SXin Li void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
1197*67e74705SXin Li   VisitStmt(S);
1198*67e74705SXin Li   assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?");
1199*67e74705SXin Li   ++Idx;
1200*67e74705SXin Li   S->TryLoc = ReadSourceLocation(Record, Idx);
1201*67e74705SXin Li   S->getStmts()[0] = Reader.ReadSubStmt();
1202*67e74705SXin Li   for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
1203*67e74705SXin Li     S->getStmts()[i + 1] = Reader.ReadSubStmt();
1204*67e74705SXin Li }
1205*67e74705SXin Li 
VisitCXXForRangeStmt(CXXForRangeStmt * S)1206*67e74705SXin Li void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
1207*67e74705SXin Li   VisitStmt(S);
1208*67e74705SXin Li   S->ForLoc = ReadSourceLocation(Record, Idx);
1209*67e74705SXin Li   S->CoawaitLoc = ReadSourceLocation(Record, Idx);
1210*67e74705SXin Li   S->ColonLoc = ReadSourceLocation(Record, Idx);
1211*67e74705SXin Li   S->RParenLoc = ReadSourceLocation(Record, Idx);
1212*67e74705SXin Li   S->setRangeStmt(Reader.ReadSubStmt());
1213*67e74705SXin Li   S->setBeginStmt(Reader.ReadSubStmt());
1214*67e74705SXin Li   S->setEndStmt(Reader.ReadSubStmt());
1215*67e74705SXin Li   S->setCond(Reader.ReadSubExpr());
1216*67e74705SXin Li   S->setInc(Reader.ReadSubExpr());
1217*67e74705SXin Li   S->setLoopVarStmt(Reader.ReadSubStmt());
1218*67e74705SXin Li   S->setBody(Reader.ReadSubStmt());
1219*67e74705SXin Li }
1220*67e74705SXin Li 
VisitMSDependentExistsStmt(MSDependentExistsStmt * S)1221*67e74705SXin Li void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
1222*67e74705SXin Li   VisitStmt(S);
1223*67e74705SXin Li   S->KeywordLoc = ReadSourceLocation(Record, Idx);
1224*67e74705SXin Li   S->IsIfExists = Record[Idx++];
1225*67e74705SXin Li   S->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1226*67e74705SXin Li   ReadDeclarationNameInfo(S->NameInfo, Record, Idx);
1227*67e74705SXin Li   S->SubStmt = Reader.ReadSubStmt();
1228*67e74705SXin Li }
1229*67e74705SXin Li 
VisitCXXOperatorCallExpr(CXXOperatorCallExpr * E)1230*67e74705SXin Li void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
1231*67e74705SXin Li   VisitCallExpr(E);
1232*67e74705SXin Li   E->Operator = (OverloadedOperatorKind)Record[Idx++];
1233*67e74705SXin Li   E->Range = Reader.ReadSourceRange(F, Record, Idx);
1234*67e74705SXin Li   E->setFPContractable((bool)Record[Idx++]);
1235*67e74705SXin Li }
1236*67e74705SXin Li 
VisitCXXConstructExpr(CXXConstructExpr * E)1237*67e74705SXin Li void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
1238*67e74705SXin Li   VisitExpr(E);
1239*67e74705SXin Li   E->NumArgs = Record[Idx++];
1240*67e74705SXin Li   if (E->NumArgs)
1241*67e74705SXin Li     E->Args = new (Reader.getContext()) Stmt*[E->NumArgs];
1242*67e74705SXin Li   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1243*67e74705SXin Li     E->setArg(I, Reader.ReadSubExpr());
1244*67e74705SXin Li   E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx));
1245*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
1246*67e74705SXin Li   E->setElidable(Record[Idx++]);
1247*67e74705SXin Li   E->setHadMultipleCandidates(Record[Idx++]);
1248*67e74705SXin Li   E->setListInitialization(Record[Idx++]);
1249*67e74705SXin Li   E->setStdInitListInitialization(Record[Idx++]);
1250*67e74705SXin Li   E->setRequiresZeroInitialization(Record[Idx++]);
1251*67e74705SXin Li   E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
1252*67e74705SXin Li   E->ParenOrBraceRange = ReadSourceRange(Record, Idx);
1253*67e74705SXin Li }
1254*67e74705SXin Li 
VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr * E)1255*67e74705SXin Li void ASTStmtReader::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {
1256*67e74705SXin Li   VisitExpr(E);
1257*67e74705SXin Li   E->Constructor = ReadDeclAs<CXXConstructorDecl>(Record, Idx);
1258*67e74705SXin Li   E->Loc = ReadSourceLocation(Record, Idx);
1259*67e74705SXin Li   E->ConstructsVirtualBase = Record[Idx++];
1260*67e74705SXin Li   E->InheritedFromVirtualBase = Record[Idx++];
1261*67e74705SXin Li }
1262*67e74705SXin Li 
VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * E)1263*67e74705SXin Li void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
1264*67e74705SXin Li   VisitCXXConstructExpr(E);
1265*67e74705SXin Li   E->Type = GetTypeSourceInfo(Record, Idx);
1266*67e74705SXin Li }
1267*67e74705SXin Li 
VisitLambdaExpr(LambdaExpr * E)1268*67e74705SXin Li void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) {
1269*67e74705SXin Li   VisitExpr(E);
1270*67e74705SXin Li   unsigned NumCaptures = Record[Idx++];
1271*67e74705SXin Li   assert(NumCaptures == E->NumCaptures);(void)NumCaptures;
1272*67e74705SXin Li   unsigned NumArrayIndexVars = Record[Idx++];
1273*67e74705SXin Li   E->IntroducerRange = ReadSourceRange(Record, Idx);
1274*67e74705SXin Li   E->CaptureDefault = static_cast<LambdaCaptureDefault>(Record[Idx++]);
1275*67e74705SXin Li   E->CaptureDefaultLoc = ReadSourceLocation(Record, Idx);
1276*67e74705SXin Li   E->ExplicitParams = Record[Idx++];
1277*67e74705SXin Li   E->ExplicitResultType = Record[Idx++];
1278*67e74705SXin Li   E->ClosingBrace = ReadSourceLocation(Record, Idx);
1279*67e74705SXin Li 
1280*67e74705SXin Li   // Read capture initializers.
1281*67e74705SXin Li   for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),
1282*67e74705SXin Li                                       CEnd = E->capture_init_end();
1283*67e74705SXin Li        C != CEnd; ++C)
1284*67e74705SXin Li     *C = Reader.ReadSubExpr();
1285*67e74705SXin Li 
1286*67e74705SXin Li   // Read array capture index variables.
1287*67e74705SXin Li   if (NumArrayIndexVars > 0) {
1288*67e74705SXin Li     unsigned *ArrayIndexStarts = E->getArrayIndexStarts();
1289*67e74705SXin Li     for (unsigned I = 0; I != NumCaptures + 1; ++I)
1290*67e74705SXin Li       ArrayIndexStarts[I] = Record[Idx++];
1291*67e74705SXin Li 
1292*67e74705SXin Li     VarDecl **ArrayIndexVars = E->getArrayIndexVars();
1293*67e74705SXin Li     for (unsigned I = 0; I != NumArrayIndexVars; ++I)
1294*67e74705SXin Li       ArrayIndexVars[I] = ReadDeclAs<VarDecl>(Record, Idx);
1295*67e74705SXin Li   }
1296*67e74705SXin Li }
1297*67e74705SXin Li 
1298*67e74705SXin Li void
VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr * E)1299*67e74705SXin Li ASTStmtReader::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
1300*67e74705SXin Li   VisitExpr(E);
1301*67e74705SXin Li   E->SubExpr = Reader.ReadSubExpr();
1302*67e74705SXin Li }
1303*67e74705SXin Li 
VisitCXXNamedCastExpr(CXXNamedCastExpr * E)1304*67e74705SXin Li void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
1305*67e74705SXin Li   VisitExplicitCastExpr(E);
1306*67e74705SXin Li   SourceRange R = ReadSourceRange(Record, Idx);
1307*67e74705SXin Li   E->Loc = R.getBegin();
1308*67e74705SXin Li   E->RParenLoc = R.getEnd();
1309*67e74705SXin Li   R = ReadSourceRange(Record, Idx);
1310*67e74705SXin Li   E->AngleBrackets = R;
1311*67e74705SXin Li }
1312*67e74705SXin Li 
VisitCXXStaticCastExpr(CXXStaticCastExpr * E)1313*67e74705SXin Li void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1314*67e74705SXin Li   return VisitCXXNamedCastExpr(E);
1315*67e74705SXin Li }
1316*67e74705SXin Li 
VisitCXXDynamicCastExpr(CXXDynamicCastExpr * E)1317*67e74705SXin Li void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
1318*67e74705SXin Li   return VisitCXXNamedCastExpr(E);
1319*67e74705SXin Li }
1320*67e74705SXin Li 
VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr * E)1321*67e74705SXin Li void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1322*67e74705SXin Li   return VisitCXXNamedCastExpr(E);
1323*67e74705SXin Li }
1324*67e74705SXin Li 
VisitCXXConstCastExpr(CXXConstCastExpr * E)1325*67e74705SXin Li void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1326*67e74705SXin Li   return VisitCXXNamedCastExpr(E);
1327*67e74705SXin Li }
1328*67e74705SXin Li 
VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr * E)1329*67e74705SXin Li void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1330*67e74705SXin Li   VisitExplicitCastExpr(E);
1331*67e74705SXin Li   E->setLParenLoc(ReadSourceLocation(Record, Idx));
1332*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
1333*67e74705SXin Li }
1334*67e74705SXin Li 
VisitUserDefinedLiteral(UserDefinedLiteral * E)1335*67e74705SXin Li void ASTStmtReader::VisitUserDefinedLiteral(UserDefinedLiteral *E) {
1336*67e74705SXin Li   VisitCallExpr(E);
1337*67e74705SXin Li   E->UDSuffixLoc = ReadSourceLocation(Record, Idx);
1338*67e74705SXin Li }
1339*67e74705SXin Li 
VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr * E)1340*67e74705SXin Li void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1341*67e74705SXin Li   VisitExpr(E);
1342*67e74705SXin Li   E->setValue(Record[Idx++]);
1343*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
1344*67e74705SXin Li }
1345*67e74705SXin Li 
VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr * E)1346*67e74705SXin Li void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1347*67e74705SXin Li   VisitExpr(E);
1348*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
1349*67e74705SXin Li }
1350*67e74705SXin Li 
VisitCXXTypeidExpr(CXXTypeidExpr * E)1351*67e74705SXin Li void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1352*67e74705SXin Li   VisitExpr(E);
1353*67e74705SXin Li   E->setSourceRange(ReadSourceRange(Record, Idx));
1354*67e74705SXin Li   if (E->isTypeOperand()) { // typeid(int)
1355*67e74705SXin Li     E->setTypeOperandSourceInfo(
1356*67e74705SXin Li         GetTypeSourceInfo(Record, Idx));
1357*67e74705SXin Li     return;
1358*67e74705SXin Li   }
1359*67e74705SXin Li 
1360*67e74705SXin Li   // typeid(42+2)
1361*67e74705SXin Li   E->setExprOperand(Reader.ReadSubExpr());
1362*67e74705SXin Li }
1363*67e74705SXin Li 
VisitCXXThisExpr(CXXThisExpr * E)1364*67e74705SXin Li void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
1365*67e74705SXin Li   VisitExpr(E);
1366*67e74705SXin Li   E->setLocation(ReadSourceLocation(Record, Idx));
1367*67e74705SXin Li   E->setImplicit(Record[Idx++]);
1368*67e74705SXin Li }
1369*67e74705SXin Li 
VisitCXXThrowExpr(CXXThrowExpr * E)1370*67e74705SXin Li void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
1371*67e74705SXin Li   VisitExpr(E);
1372*67e74705SXin Li   E->ThrowLoc = ReadSourceLocation(Record, Idx);
1373*67e74705SXin Li   E->Op = Reader.ReadSubExpr();
1374*67e74705SXin Li   E->IsThrownVariableInScope = Record[Idx++];
1375*67e74705SXin Li }
1376*67e74705SXin Li 
VisitCXXDefaultArgExpr(CXXDefaultArgExpr * E)1377*67e74705SXin Li void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1378*67e74705SXin Li   VisitExpr(E);
1379*67e74705SXin Li   E->Param = ReadDeclAs<ParmVarDecl>(Record, Idx);
1380*67e74705SXin Li   E->Loc = ReadSourceLocation(Record, Idx);
1381*67e74705SXin Li }
1382*67e74705SXin Li 
VisitCXXDefaultInitExpr(CXXDefaultInitExpr * E)1383*67e74705SXin Li void ASTStmtReader::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
1384*67e74705SXin Li   VisitExpr(E);
1385*67e74705SXin Li   E->Field = ReadDeclAs<FieldDecl>(Record, Idx);
1386*67e74705SXin Li   E->Loc = ReadSourceLocation(Record, Idx);
1387*67e74705SXin Li }
1388*67e74705SXin Li 
VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr * E)1389*67e74705SXin Li void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1390*67e74705SXin Li   VisitExpr(E);
1391*67e74705SXin Li   E->setTemporary(Reader.ReadCXXTemporary(F, Record, Idx));
1392*67e74705SXin Li   E->setSubExpr(Reader.ReadSubExpr());
1393*67e74705SXin Li }
1394*67e74705SXin Li 
VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr * E)1395*67e74705SXin Li void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
1396*67e74705SXin Li   VisitExpr(E);
1397*67e74705SXin Li   E->TypeInfo = GetTypeSourceInfo(Record, Idx);
1398*67e74705SXin Li   E->RParenLoc = ReadSourceLocation(Record, Idx);
1399*67e74705SXin Li }
1400*67e74705SXin Li 
VisitCXXNewExpr(CXXNewExpr * E)1401*67e74705SXin Li void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
1402*67e74705SXin Li   VisitExpr(E);
1403*67e74705SXin Li   E->GlobalNew = Record[Idx++];
1404*67e74705SXin Li   bool isArray = Record[Idx++];
1405*67e74705SXin Li   E->UsualArrayDeleteWantsSize = Record[Idx++];
1406*67e74705SXin Li   unsigned NumPlacementArgs = Record[Idx++];
1407*67e74705SXin Li   E->StoredInitializationStyle = Record[Idx++];
1408*67e74705SXin Li   E->setOperatorNew(ReadDeclAs<FunctionDecl>(Record, Idx));
1409*67e74705SXin Li   E->setOperatorDelete(ReadDeclAs<FunctionDecl>(Record, Idx));
1410*67e74705SXin Li   E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx);
1411*67e74705SXin Li   E->TypeIdParens = ReadSourceRange(Record, Idx);
1412*67e74705SXin Li   E->Range = ReadSourceRange(Record, Idx);
1413*67e74705SXin Li   E->DirectInitRange = ReadSourceRange(Record, Idx);
1414*67e74705SXin Li 
1415*67e74705SXin Li   E->AllocateArgsArray(Reader.getContext(), isArray, NumPlacementArgs,
1416*67e74705SXin Li                        E->StoredInitializationStyle != 0);
1417*67e74705SXin Li 
1418*67e74705SXin Li   // Install all the subexpressions.
1419*67e74705SXin Li   for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
1420*67e74705SXin Li        I != e; ++I)
1421*67e74705SXin Li     *I = Reader.ReadSubStmt();
1422*67e74705SXin Li }
1423*67e74705SXin Li 
VisitCXXDeleteExpr(CXXDeleteExpr * E)1424*67e74705SXin Li void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1425*67e74705SXin Li   VisitExpr(E);
1426*67e74705SXin Li   E->GlobalDelete = Record[Idx++];
1427*67e74705SXin Li   E->ArrayForm = Record[Idx++];
1428*67e74705SXin Li   E->ArrayFormAsWritten = Record[Idx++];
1429*67e74705SXin Li   E->UsualArrayDeleteWantsSize = Record[Idx++];
1430*67e74705SXin Li   E->OperatorDelete = ReadDeclAs<FunctionDecl>(Record, Idx);
1431*67e74705SXin Li   E->Argument = Reader.ReadSubExpr();
1432*67e74705SXin Li   E->Loc = ReadSourceLocation(Record, Idx);
1433*67e74705SXin Li }
1434*67e74705SXin Li 
VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr * E)1435*67e74705SXin Li void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1436*67e74705SXin Li   VisitExpr(E);
1437*67e74705SXin Li 
1438*67e74705SXin Li   E->Base = Reader.ReadSubExpr();
1439*67e74705SXin Li   E->IsArrow = Record[Idx++];
1440*67e74705SXin Li   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1441*67e74705SXin Li   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1442*67e74705SXin Li   E->ScopeType = GetTypeSourceInfo(Record, Idx);
1443*67e74705SXin Li   E->ColonColonLoc = ReadSourceLocation(Record, Idx);
1444*67e74705SXin Li   E->TildeLoc = ReadSourceLocation(Record, Idx);
1445*67e74705SXin Li 
1446*67e74705SXin Li   IdentifierInfo *II = Reader.GetIdentifierInfo(F, Record, Idx);
1447*67e74705SXin Li   if (II)
1448*67e74705SXin Li     E->setDestroyedType(II, ReadSourceLocation(Record, Idx));
1449*67e74705SXin Li   else
1450*67e74705SXin Li     E->setDestroyedType(GetTypeSourceInfo(Record, Idx));
1451*67e74705SXin Li }
1452*67e74705SXin Li 
VisitExprWithCleanups(ExprWithCleanups * E)1453*67e74705SXin Li void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) {
1454*67e74705SXin Li   VisitExpr(E);
1455*67e74705SXin Li 
1456*67e74705SXin Li   unsigned NumObjects = Record[Idx++];
1457*67e74705SXin Li   assert(NumObjects == E->getNumObjects());
1458*67e74705SXin Li   for (unsigned i = 0; i != NumObjects; ++i)
1459*67e74705SXin Li     E->getTrailingObjects<BlockDecl *>()[i] =
1460*67e74705SXin Li         ReadDeclAs<BlockDecl>(Record, Idx);
1461*67e74705SXin Li 
1462*67e74705SXin Li   E->ExprWithCleanupsBits.CleanupsHaveSideEffects = Record[Idx++];
1463*67e74705SXin Li   E->SubExpr = Reader.ReadSubExpr();
1464*67e74705SXin Li }
1465*67e74705SXin Li 
1466*67e74705SXin Li void
VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr * E)1467*67e74705SXin Li ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
1468*67e74705SXin Li   VisitExpr(E);
1469*67e74705SXin Li 
1470*67e74705SXin Li   if (Record[Idx++]) // HasTemplateKWAndArgsInfo
1471*67e74705SXin Li     ReadTemplateKWAndArgsInfo(
1472*67e74705SXin Li         *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
1473*67e74705SXin Li         E->getTrailingObjects<TemplateArgumentLoc>(),
1474*67e74705SXin Li         /*NumTemplateArgs=*/Record[Idx++]);
1475*67e74705SXin Li 
1476*67e74705SXin Li   E->Base = Reader.ReadSubExpr();
1477*67e74705SXin Li   E->BaseType = Reader.readType(F, Record, Idx);
1478*67e74705SXin Li   E->IsArrow = Record[Idx++];
1479*67e74705SXin Li   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1480*67e74705SXin Li   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1481*67e74705SXin Li   E->FirstQualifierFoundInScope = ReadDeclAs<NamedDecl>(Record, Idx);
1482*67e74705SXin Li   ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx);
1483*67e74705SXin Li }
1484*67e74705SXin Li 
1485*67e74705SXin Li void
VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E)1486*67e74705SXin Li ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
1487*67e74705SXin Li   VisitExpr(E);
1488*67e74705SXin Li 
1489*67e74705SXin Li   if (Record[Idx++]) // HasTemplateKWAndArgsInfo
1490*67e74705SXin Li     ReadTemplateKWAndArgsInfo(
1491*67e74705SXin Li         *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
1492*67e74705SXin Li         E->getTrailingObjects<TemplateArgumentLoc>(),
1493*67e74705SXin Li         /*NumTemplateArgs=*/Record[Idx++]);
1494*67e74705SXin Li 
1495*67e74705SXin Li   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1496*67e74705SXin Li   ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
1497*67e74705SXin Li }
1498*67e74705SXin Li 
1499*67e74705SXin Li void
VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr * E)1500*67e74705SXin Li ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1501*67e74705SXin Li   VisitExpr(E);
1502*67e74705SXin Li   assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
1503*67e74705SXin Li   ++Idx; // NumArgs;
1504*67e74705SXin Li   for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
1505*67e74705SXin Li     E->setArg(I, Reader.ReadSubExpr());
1506*67e74705SXin Li   E->Type = GetTypeSourceInfo(Record, Idx);
1507*67e74705SXin Li   E->setLParenLoc(ReadSourceLocation(Record, Idx));
1508*67e74705SXin Li   E->setRParenLoc(ReadSourceLocation(Record, Idx));
1509*67e74705SXin Li }
1510*67e74705SXin Li 
VisitOverloadExpr(OverloadExpr * E)1511*67e74705SXin Li void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
1512*67e74705SXin Li   VisitExpr(E);
1513*67e74705SXin Li 
1514*67e74705SXin Li   if (Record[Idx++]) // HasTemplateKWAndArgsInfo
1515*67e74705SXin Li     ReadTemplateKWAndArgsInfo(*E->getTrailingASTTemplateKWAndArgsInfo(),
1516*67e74705SXin Li                               E->getTrailingTemplateArgumentLoc(),
1517*67e74705SXin Li                               /*NumTemplateArgs=*/Record[Idx++]);
1518*67e74705SXin Li 
1519*67e74705SXin Li   unsigned NumDecls = Record[Idx++];
1520*67e74705SXin Li   UnresolvedSet<8> Decls;
1521*67e74705SXin Li   for (unsigned i = 0; i != NumDecls; ++i) {
1522*67e74705SXin Li     NamedDecl *D = ReadDeclAs<NamedDecl>(Record, Idx);
1523*67e74705SXin Li     AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1524*67e74705SXin Li     Decls.addDecl(D, AS);
1525*67e74705SXin Li   }
1526*67e74705SXin Li   E->initializeResults(Reader.getContext(), Decls.begin(), Decls.end());
1527*67e74705SXin Li 
1528*67e74705SXin Li   ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
1529*67e74705SXin Li   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1530*67e74705SXin Li }
1531*67e74705SXin Li 
VisitUnresolvedMemberExpr(UnresolvedMemberExpr * E)1532*67e74705SXin Li void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1533*67e74705SXin Li   VisitOverloadExpr(E);
1534*67e74705SXin Li   E->IsArrow = Record[Idx++];
1535*67e74705SXin Li   E->HasUnresolvedUsing = Record[Idx++];
1536*67e74705SXin Li   E->Base = Reader.ReadSubExpr();
1537*67e74705SXin Li   E->BaseType = Reader.readType(F, Record, Idx);
1538*67e74705SXin Li   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1539*67e74705SXin Li }
1540*67e74705SXin Li 
VisitUnresolvedLookupExpr(UnresolvedLookupExpr * E)1541*67e74705SXin Li void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1542*67e74705SXin Li   VisitOverloadExpr(E);
1543*67e74705SXin Li   E->RequiresADL = Record[Idx++];
1544*67e74705SXin Li   E->Overloaded = Record[Idx++];
1545*67e74705SXin Li   E->NamingClass = ReadDeclAs<CXXRecordDecl>(Record, Idx);
1546*67e74705SXin Li }
1547*67e74705SXin Li 
VisitTypeTraitExpr(TypeTraitExpr * E)1548*67e74705SXin Li void ASTStmtReader::VisitTypeTraitExpr(TypeTraitExpr *E) {
1549*67e74705SXin Li   VisitExpr(E);
1550*67e74705SXin Li   E->TypeTraitExprBits.NumArgs = Record[Idx++];
1551*67e74705SXin Li   E->TypeTraitExprBits.Kind = Record[Idx++];
1552*67e74705SXin Li   E->TypeTraitExprBits.Value = Record[Idx++];
1553*67e74705SXin Li   SourceRange Range = ReadSourceRange(Record, Idx);
1554*67e74705SXin Li   E->Loc = Range.getBegin();
1555*67e74705SXin Li   E->RParenLoc = Range.getEnd();
1556*67e74705SXin Li 
1557*67e74705SXin Li   TypeSourceInfo **Args = E->getTrailingObjects<TypeSourceInfo *>();
1558*67e74705SXin Li   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1559*67e74705SXin Li     Args[I] = GetTypeSourceInfo(Record, Idx);
1560*67e74705SXin Li }
1561*67e74705SXin Li 
VisitArrayTypeTraitExpr(ArrayTypeTraitExpr * E)1562*67e74705SXin Li void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
1563*67e74705SXin Li   VisitExpr(E);
1564*67e74705SXin Li   E->ATT = (ArrayTypeTrait)Record[Idx++];
1565*67e74705SXin Li   E->Value = (unsigned int)Record[Idx++];
1566*67e74705SXin Li   SourceRange Range = ReadSourceRange(Record, Idx);
1567*67e74705SXin Li   E->Loc = Range.getBegin();
1568*67e74705SXin Li   E->RParen = Range.getEnd();
1569*67e74705SXin Li   E->QueriedType = GetTypeSourceInfo(Record, Idx);
1570*67e74705SXin Li }
1571*67e74705SXin Li 
VisitExpressionTraitExpr(ExpressionTraitExpr * E)1572*67e74705SXin Li void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
1573*67e74705SXin Li   VisitExpr(E);
1574*67e74705SXin Li   E->ET = (ExpressionTrait)Record[Idx++];
1575*67e74705SXin Li   E->Value = (bool)Record[Idx++];
1576*67e74705SXin Li   SourceRange Range = ReadSourceRange(Record, Idx);
1577*67e74705SXin Li   E->QueriedExpression = Reader.ReadSubExpr();
1578*67e74705SXin Li   E->Loc = Range.getBegin();
1579*67e74705SXin Li   E->RParen = Range.getEnd();
1580*67e74705SXin Li }
1581*67e74705SXin Li 
VisitCXXNoexceptExpr(CXXNoexceptExpr * E)1582*67e74705SXin Li void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
1583*67e74705SXin Li   VisitExpr(E);
1584*67e74705SXin Li   E->Value = (bool)Record[Idx++];
1585*67e74705SXin Li   E->Range = ReadSourceRange(Record, Idx);
1586*67e74705SXin Li   E->Operand = Reader.ReadSubExpr();
1587*67e74705SXin Li }
1588*67e74705SXin Li 
VisitPackExpansionExpr(PackExpansionExpr * E)1589*67e74705SXin Li void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) {
1590*67e74705SXin Li   VisitExpr(E);
1591*67e74705SXin Li   E->EllipsisLoc = ReadSourceLocation(Record, Idx);
1592*67e74705SXin Li   E->NumExpansions = Record[Idx++];
1593*67e74705SXin Li   E->Pattern = Reader.ReadSubExpr();
1594*67e74705SXin Li }
1595*67e74705SXin Li 
VisitSizeOfPackExpr(SizeOfPackExpr * E)1596*67e74705SXin Li void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
1597*67e74705SXin Li   VisitExpr(E);
1598*67e74705SXin Li   unsigned NumPartialArgs = Record[Idx++];
1599*67e74705SXin Li   E->OperatorLoc = ReadSourceLocation(Record, Idx);
1600*67e74705SXin Li   E->PackLoc = ReadSourceLocation(Record, Idx);
1601*67e74705SXin Li   E->RParenLoc = ReadSourceLocation(Record, Idx);
1602*67e74705SXin Li   E->Pack = Reader.ReadDeclAs<NamedDecl>(F, Record, Idx);
1603*67e74705SXin Li   if (E->isPartiallySubstituted()) {
1604*67e74705SXin Li     assert(E->Length == NumPartialArgs);
1605*67e74705SXin Li     for (auto *I = E->getTrailingObjects<TemplateArgument>(),
1606*67e74705SXin Li               *E = I + NumPartialArgs;
1607*67e74705SXin Li          I != E; ++I)
1608*67e74705SXin Li       new (I) TemplateArgument(Reader.ReadTemplateArgument(F, Record, Idx));
1609*67e74705SXin Li   } else if (!E->isValueDependent()) {
1610*67e74705SXin Li     E->Length = Record[Idx++];
1611*67e74705SXin Li   }
1612*67e74705SXin Li }
1613*67e74705SXin Li 
VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * E)1614*67e74705SXin Li void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr(
1615*67e74705SXin Li                                               SubstNonTypeTemplateParmExpr *E) {
1616*67e74705SXin Li   VisitExpr(E);
1617*67e74705SXin Li   E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
1618*67e74705SXin Li   E->NameLoc = ReadSourceLocation(Record, Idx);
1619*67e74705SXin Li   E->Replacement = Reader.ReadSubExpr();
1620*67e74705SXin Li }
1621*67e74705SXin Li 
VisitSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * E)1622*67e74705SXin Li void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(
1623*67e74705SXin Li                                           SubstNonTypeTemplateParmPackExpr *E) {
1624*67e74705SXin Li   VisitExpr(E);
1625*67e74705SXin Li   E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
1626*67e74705SXin Li   TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx);
1627*67e74705SXin Li   if (ArgPack.getKind() != TemplateArgument::Pack)
1628*67e74705SXin Li     return;
1629*67e74705SXin Li 
1630*67e74705SXin Li   E->Arguments = ArgPack.pack_begin();
1631*67e74705SXin Li   E->NumArguments = ArgPack.pack_size();
1632*67e74705SXin Li   E->NameLoc = ReadSourceLocation(Record, Idx);
1633*67e74705SXin Li }
1634*67e74705SXin Li 
VisitFunctionParmPackExpr(FunctionParmPackExpr * E)1635*67e74705SXin Li void ASTStmtReader::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
1636*67e74705SXin Li   VisitExpr(E);
1637*67e74705SXin Li   E->NumParameters = Record[Idx++];
1638*67e74705SXin Li   E->ParamPack = ReadDeclAs<ParmVarDecl>(Record, Idx);
1639*67e74705SXin Li   E->NameLoc = ReadSourceLocation(Record, Idx);
1640*67e74705SXin Li   ParmVarDecl **Parms = E->getTrailingObjects<ParmVarDecl *>();
1641*67e74705SXin Li   for (unsigned i = 0, n = E->NumParameters; i != n; ++i)
1642*67e74705SXin Li     Parms[i] = ReadDeclAs<ParmVarDecl>(Record, Idx);
1643*67e74705SXin Li }
1644*67e74705SXin Li 
VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr * E)1645*67e74705SXin Li void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
1646*67e74705SXin Li   VisitExpr(E);
1647*67e74705SXin Li   E->State = Reader.ReadSubExpr();
1648*67e74705SXin Li   auto VD = ReadDeclAs<ValueDecl>(Record, Idx);
1649*67e74705SXin Li   unsigned ManglingNumber = Record[Idx++];
1650*67e74705SXin Li   E->setExtendingDecl(VD, ManglingNumber);
1651*67e74705SXin Li }
1652*67e74705SXin Li 
VisitCXXFoldExpr(CXXFoldExpr * E)1653*67e74705SXin Li void ASTStmtReader::VisitCXXFoldExpr(CXXFoldExpr *E) {
1654*67e74705SXin Li   VisitExpr(E);
1655*67e74705SXin Li   E->LParenLoc = ReadSourceLocation(Record, Idx);
1656*67e74705SXin Li   E->EllipsisLoc = ReadSourceLocation(Record, Idx);
1657*67e74705SXin Li   E->RParenLoc = ReadSourceLocation(Record, Idx);
1658*67e74705SXin Li   E->SubExprs[0] = Reader.ReadSubExpr();
1659*67e74705SXin Li   E->SubExprs[1] = Reader.ReadSubExpr();
1660*67e74705SXin Li   E->Opcode = (BinaryOperatorKind)Record[Idx++];
1661*67e74705SXin Li }
1662*67e74705SXin Li 
VisitOpaqueValueExpr(OpaqueValueExpr * E)1663*67e74705SXin Li void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
1664*67e74705SXin Li   VisitExpr(E);
1665*67e74705SXin Li   E->SourceExpr = Reader.ReadSubExpr();
1666*67e74705SXin Li   E->Loc = ReadSourceLocation(Record, Idx);
1667*67e74705SXin Li }
1668*67e74705SXin Li 
VisitTypoExpr(TypoExpr * E)1669*67e74705SXin Li void ASTStmtReader::VisitTypoExpr(TypoExpr *E) {
1670*67e74705SXin Li   llvm_unreachable("Cannot read TypoExpr nodes");
1671*67e74705SXin Li }
1672*67e74705SXin Li 
1673*67e74705SXin Li //===----------------------------------------------------------------------===//
1674*67e74705SXin Li // Microsoft Expressions and Statements
1675*67e74705SXin Li //===----------------------------------------------------------------------===//
VisitMSPropertyRefExpr(MSPropertyRefExpr * E)1676*67e74705SXin Li void ASTStmtReader::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {
1677*67e74705SXin Li   VisitExpr(E);
1678*67e74705SXin Li   E->IsArrow = (Record[Idx++] != 0);
1679*67e74705SXin Li   E->BaseExpr = Reader.ReadSubExpr();
1680*67e74705SXin Li   E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1681*67e74705SXin Li   E->MemberLoc = ReadSourceLocation(Record, Idx);
1682*67e74705SXin Li   E->TheDecl = ReadDeclAs<MSPropertyDecl>(Record, Idx);
1683*67e74705SXin Li }
1684*67e74705SXin Li 
VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr * E)1685*67e74705SXin Li void ASTStmtReader::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) {
1686*67e74705SXin Li   VisitExpr(E);
1687*67e74705SXin Li   E->setBase(Reader.ReadSubExpr());
1688*67e74705SXin Li   E->setIdx(Reader.ReadSubExpr());
1689*67e74705SXin Li   E->setRBracketLoc(ReadSourceLocation(Record, Idx));
1690*67e74705SXin Li }
1691*67e74705SXin Li 
VisitCXXUuidofExpr(CXXUuidofExpr * E)1692*67e74705SXin Li void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
1693*67e74705SXin Li   VisitExpr(E);
1694*67e74705SXin Li   E->setSourceRange(ReadSourceRange(Record, Idx));
1695*67e74705SXin Li   std::string UuidStr = ReadString(Record, Idx);
1696*67e74705SXin Li   E->setUuidStr(StringRef(UuidStr).copy(Reader.getContext()));
1697*67e74705SXin Li   if (E->isTypeOperand()) { // __uuidof(ComType)
1698*67e74705SXin Li     E->setTypeOperandSourceInfo(
1699*67e74705SXin Li         GetTypeSourceInfo(Record, Idx));
1700*67e74705SXin Li     return;
1701*67e74705SXin Li   }
1702*67e74705SXin Li 
1703*67e74705SXin Li   // __uuidof(expr)
1704*67e74705SXin Li   E->setExprOperand(Reader.ReadSubExpr());
1705*67e74705SXin Li }
1706*67e74705SXin Li 
VisitSEHLeaveStmt(SEHLeaveStmt * S)1707*67e74705SXin Li void ASTStmtReader::VisitSEHLeaveStmt(SEHLeaveStmt *S) {
1708*67e74705SXin Li   VisitStmt(S);
1709*67e74705SXin Li   S->setLeaveLoc(ReadSourceLocation(Record, Idx));
1710*67e74705SXin Li }
1711*67e74705SXin Li 
VisitSEHExceptStmt(SEHExceptStmt * S)1712*67e74705SXin Li void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) {
1713*67e74705SXin Li   VisitStmt(S);
1714*67e74705SXin Li   S->Loc = ReadSourceLocation(Record, Idx);
1715*67e74705SXin Li   S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt();
1716*67e74705SXin Li   S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt();
1717*67e74705SXin Li }
1718*67e74705SXin Li 
VisitSEHFinallyStmt(SEHFinallyStmt * S)1719*67e74705SXin Li void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
1720*67e74705SXin Li   VisitStmt(S);
1721*67e74705SXin Li   S->Loc = ReadSourceLocation(Record, Idx);
1722*67e74705SXin Li   S->Block = Reader.ReadSubStmt();
1723*67e74705SXin Li }
1724*67e74705SXin Li 
VisitSEHTryStmt(SEHTryStmt * S)1725*67e74705SXin Li void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) {
1726*67e74705SXin Li   VisitStmt(S);
1727*67e74705SXin Li   S->IsCXXTry = Record[Idx++];
1728*67e74705SXin Li   S->TryLoc = ReadSourceLocation(Record, Idx);
1729*67e74705SXin Li   S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt();
1730*67e74705SXin Li   S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt();
1731*67e74705SXin Li }
1732*67e74705SXin Li 
1733*67e74705SXin Li //===----------------------------------------------------------------------===//
1734*67e74705SXin Li // CUDA Expressions and Statements
1735*67e74705SXin Li //===----------------------------------------------------------------------===//
1736*67e74705SXin Li 
VisitCUDAKernelCallExpr(CUDAKernelCallExpr * E)1737*67e74705SXin Li void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
1738*67e74705SXin Li   VisitCallExpr(E);
1739*67e74705SXin Li   E->setConfig(cast<CallExpr>(Reader.ReadSubExpr()));
1740*67e74705SXin Li }
1741*67e74705SXin Li 
1742*67e74705SXin Li //===----------------------------------------------------------------------===//
1743*67e74705SXin Li // OpenCL Expressions and Statements.
1744*67e74705SXin Li //===----------------------------------------------------------------------===//
VisitAsTypeExpr(AsTypeExpr * E)1745*67e74705SXin Li void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {
1746*67e74705SXin Li   VisitExpr(E);
1747*67e74705SXin Li   E->BuiltinLoc = ReadSourceLocation(Record, Idx);
1748*67e74705SXin Li   E->RParenLoc = ReadSourceLocation(Record, Idx);
1749*67e74705SXin Li   E->SrcExpr = Reader.ReadSubExpr();
1750*67e74705SXin Li }
1751*67e74705SXin Li 
1752*67e74705SXin Li //===----------------------------------------------------------------------===//
1753*67e74705SXin Li // OpenMP Clauses.
1754*67e74705SXin Li //===----------------------------------------------------------------------===//
1755*67e74705SXin Li 
1756*67e74705SXin Li namespace clang {
1757*67e74705SXin Li class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
1758*67e74705SXin Li   ASTStmtReader *Reader;
1759*67e74705SXin Li   ASTContext &Context;
1760*67e74705SXin Li   const ASTReader::RecordData &Record;
1761*67e74705SXin Li   unsigned &Idx;
1762*67e74705SXin Li public:
OMPClauseReader(ASTStmtReader * R,ASTContext & C,const ASTReader::RecordData & Record,unsigned & Idx)1763*67e74705SXin Li   OMPClauseReader(ASTStmtReader *R, ASTContext &C,
1764*67e74705SXin Li                   const ASTReader::RecordData &Record, unsigned &Idx)
1765*67e74705SXin Li     : Reader(R), Context(C), Record(Record), Idx(Idx) { }
1766*67e74705SXin Li #define OPENMP_CLAUSE(Name, Class) void Visit##Class(Class *C);
1767*67e74705SXin Li #include "clang/Basic/OpenMPKinds.def"
1768*67e74705SXin Li   OMPClause *readClause();
1769*67e74705SXin Li   void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
1770*67e74705SXin Li   void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
1771*67e74705SXin Li };
1772*67e74705SXin Li }
1773*67e74705SXin Li 
readClause()1774*67e74705SXin Li OMPClause *OMPClauseReader::readClause() {
1775*67e74705SXin Li   OMPClause *C;
1776*67e74705SXin Li   switch (Record[Idx++]) {
1777*67e74705SXin Li   case OMPC_if:
1778*67e74705SXin Li     C = new (Context) OMPIfClause();
1779*67e74705SXin Li     break;
1780*67e74705SXin Li   case OMPC_final:
1781*67e74705SXin Li     C = new (Context) OMPFinalClause();
1782*67e74705SXin Li     break;
1783*67e74705SXin Li   case OMPC_num_threads:
1784*67e74705SXin Li     C = new (Context) OMPNumThreadsClause();
1785*67e74705SXin Li     break;
1786*67e74705SXin Li   case OMPC_safelen:
1787*67e74705SXin Li     C = new (Context) OMPSafelenClause();
1788*67e74705SXin Li     break;
1789*67e74705SXin Li   case OMPC_simdlen:
1790*67e74705SXin Li     C = new (Context) OMPSimdlenClause();
1791*67e74705SXin Li     break;
1792*67e74705SXin Li   case OMPC_collapse:
1793*67e74705SXin Li     C = new (Context) OMPCollapseClause();
1794*67e74705SXin Li     break;
1795*67e74705SXin Li   case OMPC_default:
1796*67e74705SXin Li     C = new (Context) OMPDefaultClause();
1797*67e74705SXin Li     break;
1798*67e74705SXin Li   case OMPC_proc_bind:
1799*67e74705SXin Li     C = new (Context) OMPProcBindClause();
1800*67e74705SXin Li     break;
1801*67e74705SXin Li   case OMPC_schedule:
1802*67e74705SXin Li     C = new (Context) OMPScheduleClause();
1803*67e74705SXin Li     break;
1804*67e74705SXin Li   case OMPC_ordered:
1805*67e74705SXin Li     C = new (Context) OMPOrderedClause();
1806*67e74705SXin Li     break;
1807*67e74705SXin Li   case OMPC_nowait:
1808*67e74705SXin Li     C = new (Context) OMPNowaitClause();
1809*67e74705SXin Li     break;
1810*67e74705SXin Li   case OMPC_untied:
1811*67e74705SXin Li     C = new (Context) OMPUntiedClause();
1812*67e74705SXin Li     break;
1813*67e74705SXin Li   case OMPC_mergeable:
1814*67e74705SXin Li     C = new (Context) OMPMergeableClause();
1815*67e74705SXin Li     break;
1816*67e74705SXin Li   case OMPC_read:
1817*67e74705SXin Li     C = new (Context) OMPReadClause();
1818*67e74705SXin Li     break;
1819*67e74705SXin Li   case OMPC_write:
1820*67e74705SXin Li     C = new (Context) OMPWriteClause();
1821*67e74705SXin Li     break;
1822*67e74705SXin Li   case OMPC_update:
1823*67e74705SXin Li     C = new (Context) OMPUpdateClause();
1824*67e74705SXin Li     break;
1825*67e74705SXin Li   case OMPC_capture:
1826*67e74705SXin Li     C = new (Context) OMPCaptureClause();
1827*67e74705SXin Li     break;
1828*67e74705SXin Li   case OMPC_seq_cst:
1829*67e74705SXin Li     C = new (Context) OMPSeqCstClause();
1830*67e74705SXin Li     break;
1831*67e74705SXin Li   case OMPC_threads:
1832*67e74705SXin Li     C = new (Context) OMPThreadsClause();
1833*67e74705SXin Li     break;
1834*67e74705SXin Li   case OMPC_simd:
1835*67e74705SXin Li     C = new (Context) OMPSIMDClause();
1836*67e74705SXin Li     break;
1837*67e74705SXin Li   case OMPC_nogroup:
1838*67e74705SXin Li     C = new (Context) OMPNogroupClause();
1839*67e74705SXin Li     break;
1840*67e74705SXin Li   case OMPC_private:
1841*67e74705SXin Li     C = OMPPrivateClause::CreateEmpty(Context, Record[Idx++]);
1842*67e74705SXin Li     break;
1843*67e74705SXin Li   case OMPC_firstprivate:
1844*67e74705SXin Li     C = OMPFirstprivateClause::CreateEmpty(Context, Record[Idx++]);
1845*67e74705SXin Li     break;
1846*67e74705SXin Li   case OMPC_lastprivate:
1847*67e74705SXin Li     C = OMPLastprivateClause::CreateEmpty(Context, Record[Idx++]);
1848*67e74705SXin Li     break;
1849*67e74705SXin Li   case OMPC_shared:
1850*67e74705SXin Li     C = OMPSharedClause::CreateEmpty(Context, Record[Idx++]);
1851*67e74705SXin Li     break;
1852*67e74705SXin Li   case OMPC_reduction:
1853*67e74705SXin Li     C = OMPReductionClause::CreateEmpty(Context, Record[Idx++]);
1854*67e74705SXin Li     break;
1855*67e74705SXin Li   case OMPC_linear:
1856*67e74705SXin Li     C = OMPLinearClause::CreateEmpty(Context, Record[Idx++]);
1857*67e74705SXin Li     break;
1858*67e74705SXin Li   case OMPC_aligned:
1859*67e74705SXin Li     C = OMPAlignedClause::CreateEmpty(Context, Record[Idx++]);
1860*67e74705SXin Li     break;
1861*67e74705SXin Li   case OMPC_copyin:
1862*67e74705SXin Li     C = OMPCopyinClause::CreateEmpty(Context, Record[Idx++]);
1863*67e74705SXin Li     break;
1864*67e74705SXin Li   case OMPC_copyprivate:
1865*67e74705SXin Li     C = OMPCopyprivateClause::CreateEmpty(Context, Record[Idx++]);
1866*67e74705SXin Li     break;
1867*67e74705SXin Li   case OMPC_flush:
1868*67e74705SXin Li     C = OMPFlushClause::CreateEmpty(Context, Record[Idx++]);
1869*67e74705SXin Li     break;
1870*67e74705SXin Li   case OMPC_depend:
1871*67e74705SXin Li     C = OMPDependClause::CreateEmpty(Context, Record[Idx++]);
1872*67e74705SXin Li     break;
1873*67e74705SXin Li   case OMPC_device:
1874*67e74705SXin Li     C = new (Context) OMPDeviceClause();
1875*67e74705SXin Li     break;
1876*67e74705SXin Li   case OMPC_map: {
1877*67e74705SXin Li     unsigned NumVars = Record[Idx++];
1878*67e74705SXin Li     unsigned NumDeclarations = Record[Idx++];
1879*67e74705SXin Li     unsigned NumLists = Record[Idx++];
1880*67e74705SXin Li     unsigned NumComponents = Record[Idx++];
1881*67e74705SXin Li     C = OMPMapClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists,
1882*67e74705SXin Li                                   NumComponents);
1883*67e74705SXin Li     break;
1884*67e74705SXin Li   }
1885*67e74705SXin Li   case OMPC_num_teams:
1886*67e74705SXin Li     C = new (Context) OMPNumTeamsClause();
1887*67e74705SXin Li     break;
1888*67e74705SXin Li   case OMPC_thread_limit:
1889*67e74705SXin Li     C = new (Context) OMPThreadLimitClause();
1890*67e74705SXin Li     break;
1891*67e74705SXin Li   case OMPC_priority:
1892*67e74705SXin Li     C = new (Context) OMPPriorityClause();
1893*67e74705SXin Li     break;
1894*67e74705SXin Li   case OMPC_grainsize:
1895*67e74705SXin Li     C = new (Context) OMPGrainsizeClause();
1896*67e74705SXin Li     break;
1897*67e74705SXin Li   case OMPC_num_tasks:
1898*67e74705SXin Li     C = new (Context) OMPNumTasksClause();
1899*67e74705SXin Li     break;
1900*67e74705SXin Li   case OMPC_hint:
1901*67e74705SXin Li     C = new (Context) OMPHintClause();
1902*67e74705SXin Li     break;
1903*67e74705SXin Li   case OMPC_dist_schedule:
1904*67e74705SXin Li     C = new (Context) OMPDistScheduleClause();
1905*67e74705SXin Li     break;
1906*67e74705SXin Li   case OMPC_defaultmap:
1907*67e74705SXin Li     C = new (Context) OMPDefaultmapClause();
1908*67e74705SXin Li     break;
1909*67e74705SXin Li   case OMPC_to: {
1910*67e74705SXin Li     unsigned NumVars = Record[Idx++];
1911*67e74705SXin Li     unsigned NumDeclarations = Record[Idx++];
1912*67e74705SXin Li     unsigned NumLists = Record[Idx++];
1913*67e74705SXin Li     unsigned NumComponents = Record[Idx++];
1914*67e74705SXin Li     C = OMPToClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists,
1915*67e74705SXin Li                                  NumComponents);
1916*67e74705SXin Li     break;
1917*67e74705SXin Li   }
1918*67e74705SXin Li   case OMPC_from: {
1919*67e74705SXin Li     unsigned NumVars = Record[Idx++];
1920*67e74705SXin Li     unsigned NumDeclarations = Record[Idx++];
1921*67e74705SXin Li     unsigned NumLists = Record[Idx++];
1922*67e74705SXin Li     unsigned NumComponents = Record[Idx++];
1923*67e74705SXin Li     C = OMPFromClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists,
1924*67e74705SXin Li                                    NumComponents);
1925*67e74705SXin Li     break;
1926*67e74705SXin Li   }
1927*67e74705SXin Li   case OMPC_use_device_ptr:
1928*67e74705SXin Li     C = OMPUseDevicePtrClause::CreateEmpty(Context, Record[Idx++]);
1929*67e74705SXin Li     break;
1930*67e74705SXin Li   case OMPC_is_device_ptr:
1931*67e74705SXin Li     C = OMPIsDevicePtrClause::CreateEmpty(Context, Record[Idx++]);
1932*67e74705SXin Li     break;
1933*67e74705SXin Li   }
1934*67e74705SXin Li   Visit(C);
1935*67e74705SXin Li   C->setLocStart(Reader->ReadSourceLocation(Record, Idx));
1936*67e74705SXin Li   C->setLocEnd(Reader->ReadSourceLocation(Record, Idx));
1937*67e74705SXin Li 
1938*67e74705SXin Li   return C;
1939*67e74705SXin Li }
1940*67e74705SXin Li 
VisitOMPClauseWithPreInit(OMPClauseWithPreInit * C)1941*67e74705SXin Li void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) {
1942*67e74705SXin Li   C->setPreInitStmt(Reader->Reader.ReadSubStmt());
1943*67e74705SXin Li }
1944*67e74705SXin Li 
VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate * C)1945*67e74705SXin Li void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) {
1946*67e74705SXin Li   VisitOMPClauseWithPreInit(C);
1947*67e74705SXin Li   C->setPostUpdateExpr(Reader->Reader.ReadSubExpr());
1948*67e74705SXin Li }
1949*67e74705SXin Li 
VisitOMPIfClause(OMPIfClause * C)1950*67e74705SXin Li void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) {
1951*67e74705SXin Li   C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record[Idx++]));
1952*67e74705SXin Li   C->setNameModifierLoc(Reader->ReadSourceLocation(Record, Idx));
1953*67e74705SXin Li   C->setColonLoc(Reader->ReadSourceLocation(Record, Idx));
1954*67e74705SXin Li   C->setCondition(Reader->Reader.ReadSubExpr());
1955*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
1956*67e74705SXin Li }
1957*67e74705SXin Li 
VisitOMPFinalClause(OMPFinalClause * C)1958*67e74705SXin Li void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) {
1959*67e74705SXin Li   C->setCondition(Reader->Reader.ReadSubExpr());
1960*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
1961*67e74705SXin Li }
1962*67e74705SXin Li 
VisitOMPNumThreadsClause(OMPNumThreadsClause * C)1963*67e74705SXin Li void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
1964*67e74705SXin Li   C->setNumThreads(Reader->Reader.ReadSubExpr());
1965*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
1966*67e74705SXin Li }
1967*67e74705SXin Li 
VisitOMPSafelenClause(OMPSafelenClause * C)1968*67e74705SXin Li void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) {
1969*67e74705SXin Li   C->setSafelen(Reader->Reader.ReadSubExpr());
1970*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
1971*67e74705SXin Li }
1972*67e74705SXin Li 
VisitOMPSimdlenClause(OMPSimdlenClause * C)1973*67e74705SXin Li void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
1974*67e74705SXin Li   C->setSimdlen(Reader->Reader.ReadSubExpr());
1975*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
1976*67e74705SXin Li }
1977*67e74705SXin Li 
VisitOMPCollapseClause(OMPCollapseClause * C)1978*67e74705SXin Li void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) {
1979*67e74705SXin Li   C->setNumForLoops(Reader->Reader.ReadSubExpr());
1980*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
1981*67e74705SXin Li }
1982*67e74705SXin Li 
VisitOMPDefaultClause(OMPDefaultClause * C)1983*67e74705SXin Li void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) {
1984*67e74705SXin Li   C->setDefaultKind(
1985*67e74705SXin Li        static_cast<OpenMPDefaultClauseKind>(Record[Idx++]));
1986*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
1987*67e74705SXin Li   C->setDefaultKindKwLoc(Reader->ReadSourceLocation(Record, Idx));
1988*67e74705SXin Li }
1989*67e74705SXin Li 
VisitOMPProcBindClause(OMPProcBindClause * C)1990*67e74705SXin Li void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) {
1991*67e74705SXin Li   C->setProcBindKind(
1992*67e74705SXin Li        static_cast<OpenMPProcBindClauseKind>(Record[Idx++]));
1993*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
1994*67e74705SXin Li   C->setProcBindKindKwLoc(Reader->ReadSourceLocation(Record, Idx));
1995*67e74705SXin Li }
1996*67e74705SXin Li 
VisitOMPScheduleClause(OMPScheduleClause * C)1997*67e74705SXin Li void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) {
1998*67e74705SXin Li   VisitOMPClauseWithPreInit(C);
1999*67e74705SXin Li   C->setScheduleKind(
2000*67e74705SXin Li        static_cast<OpenMPScheduleClauseKind>(Record[Idx++]));
2001*67e74705SXin Li   C->setFirstScheduleModifier(
2002*67e74705SXin Li       static_cast<OpenMPScheduleClauseModifier>(Record[Idx++]));
2003*67e74705SXin Li   C->setSecondScheduleModifier(
2004*67e74705SXin Li       static_cast<OpenMPScheduleClauseModifier>(Record[Idx++]));
2005*67e74705SXin Li   C->setChunkSize(Reader->Reader.ReadSubExpr());
2006*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2007*67e74705SXin Li   C->setFirstScheduleModifierLoc(Reader->ReadSourceLocation(Record, Idx));
2008*67e74705SXin Li   C->setSecondScheduleModifierLoc(Reader->ReadSourceLocation(Record, Idx));
2009*67e74705SXin Li   C->setScheduleKindLoc(Reader->ReadSourceLocation(Record, Idx));
2010*67e74705SXin Li   C->setCommaLoc(Reader->ReadSourceLocation(Record, Idx));
2011*67e74705SXin Li }
2012*67e74705SXin Li 
VisitOMPOrderedClause(OMPOrderedClause * C)2013*67e74705SXin Li void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) {
2014*67e74705SXin Li   C->setNumForLoops(Reader->Reader.ReadSubExpr());
2015*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2016*67e74705SXin Li }
2017*67e74705SXin Li 
VisitOMPNowaitClause(OMPNowaitClause *)2018*67e74705SXin Li void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {}
2019*67e74705SXin Li 
VisitOMPUntiedClause(OMPUntiedClause *)2020*67e74705SXin Li void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {}
2021*67e74705SXin Li 
VisitOMPMergeableClause(OMPMergeableClause *)2022*67e74705SXin Li void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {}
2023*67e74705SXin Li 
VisitOMPReadClause(OMPReadClause *)2024*67e74705SXin Li void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
2025*67e74705SXin Li 
VisitOMPWriteClause(OMPWriteClause *)2026*67e74705SXin Li void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
2027*67e74705SXin Li 
VisitOMPUpdateClause(OMPUpdateClause *)2028*67e74705SXin Li void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {}
2029*67e74705SXin Li 
VisitOMPCaptureClause(OMPCaptureClause *)2030*67e74705SXin Li void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
2031*67e74705SXin Li 
VisitOMPSeqCstClause(OMPSeqCstClause *)2032*67e74705SXin Li void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {}
2033*67e74705SXin Li 
VisitOMPThreadsClause(OMPThreadsClause *)2034*67e74705SXin Li void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {}
2035*67e74705SXin Li 
VisitOMPSIMDClause(OMPSIMDClause *)2036*67e74705SXin Li void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {}
2037*67e74705SXin Li 
VisitOMPNogroupClause(OMPNogroupClause *)2038*67e74705SXin Li void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {}
2039*67e74705SXin Li 
VisitOMPPrivateClause(OMPPrivateClause * C)2040*67e74705SXin Li void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) {
2041*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2042*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2043*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2044*67e74705SXin Li   Vars.reserve(NumVars);
2045*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2046*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2047*67e74705SXin Li   C->setVarRefs(Vars);
2048*67e74705SXin Li   Vars.clear();
2049*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2050*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2051*67e74705SXin Li   C->setPrivateCopies(Vars);
2052*67e74705SXin Li }
2053*67e74705SXin Li 
VisitOMPFirstprivateClause(OMPFirstprivateClause * C)2054*67e74705SXin Li void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) {
2055*67e74705SXin Li   VisitOMPClauseWithPreInit(C);
2056*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2057*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2058*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2059*67e74705SXin Li   Vars.reserve(NumVars);
2060*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2061*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2062*67e74705SXin Li   C->setVarRefs(Vars);
2063*67e74705SXin Li   Vars.clear();
2064*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2065*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2066*67e74705SXin Li   C->setPrivateCopies(Vars);
2067*67e74705SXin Li   Vars.clear();
2068*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2069*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2070*67e74705SXin Li   C->setInits(Vars);
2071*67e74705SXin Li }
2072*67e74705SXin Li 
VisitOMPLastprivateClause(OMPLastprivateClause * C)2073*67e74705SXin Li void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) {
2074*67e74705SXin Li   VisitOMPClauseWithPostUpdate(C);
2075*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2076*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2077*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2078*67e74705SXin Li   Vars.reserve(NumVars);
2079*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2080*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2081*67e74705SXin Li   C->setVarRefs(Vars);
2082*67e74705SXin Li   Vars.clear();
2083*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2084*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2085*67e74705SXin Li   C->setPrivateCopies(Vars);
2086*67e74705SXin Li   Vars.clear();
2087*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2088*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2089*67e74705SXin Li   C->setSourceExprs(Vars);
2090*67e74705SXin Li   Vars.clear();
2091*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2092*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2093*67e74705SXin Li   C->setDestinationExprs(Vars);
2094*67e74705SXin Li   Vars.clear();
2095*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2096*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2097*67e74705SXin Li   C->setAssignmentOps(Vars);
2098*67e74705SXin Li }
2099*67e74705SXin Li 
VisitOMPSharedClause(OMPSharedClause * C)2100*67e74705SXin Li void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) {
2101*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2102*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2103*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2104*67e74705SXin Li   Vars.reserve(NumVars);
2105*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2106*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2107*67e74705SXin Li   C->setVarRefs(Vars);
2108*67e74705SXin Li }
2109*67e74705SXin Li 
VisitOMPReductionClause(OMPReductionClause * C)2110*67e74705SXin Li void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) {
2111*67e74705SXin Li   VisitOMPClauseWithPostUpdate(C);
2112*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2113*67e74705SXin Li   C->setColonLoc(Reader->ReadSourceLocation(Record, Idx));
2114*67e74705SXin Li   NestedNameSpecifierLoc NNSL =
2115*67e74705SXin Li     Reader->Reader.ReadNestedNameSpecifierLoc(Reader->F, Record, Idx);
2116*67e74705SXin Li   DeclarationNameInfo DNI;
2117*67e74705SXin Li   Reader->ReadDeclarationNameInfo(DNI, Record, Idx);
2118*67e74705SXin Li   C->setQualifierLoc(NNSL);
2119*67e74705SXin Li   C->setNameInfo(DNI);
2120*67e74705SXin Li 
2121*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2122*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2123*67e74705SXin Li   Vars.reserve(NumVars);
2124*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2125*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2126*67e74705SXin Li   C->setVarRefs(Vars);
2127*67e74705SXin Li   Vars.clear();
2128*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2129*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2130*67e74705SXin Li   C->setPrivates(Vars);
2131*67e74705SXin Li   Vars.clear();
2132*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2133*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2134*67e74705SXin Li   C->setLHSExprs(Vars);
2135*67e74705SXin Li   Vars.clear();
2136*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2137*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2138*67e74705SXin Li   C->setRHSExprs(Vars);
2139*67e74705SXin Li   Vars.clear();
2140*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2141*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2142*67e74705SXin Li   C->setReductionOps(Vars);
2143*67e74705SXin Li }
2144*67e74705SXin Li 
VisitOMPLinearClause(OMPLinearClause * C)2145*67e74705SXin Li void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) {
2146*67e74705SXin Li   VisitOMPClauseWithPostUpdate(C);
2147*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2148*67e74705SXin Li   C->setColonLoc(Reader->ReadSourceLocation(Record, Idx));
2149*67e74705SXin Li   C->setModifier(static_cast<OpenMPLinearClauseKind>(Record[Idx++]));
2150*67e74705SXin Li   C->setModifierLoc(Reader->ReadSourceLocation(Record, Idx));
2151*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2152*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2153*67e74705SXin Li   Vars.reserve(NumVars);
2154*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2155*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2156*67e74705SXin Li   C->setVarRefs(Vars);
2157*67e74705SXin Li   Vars.clear();
2158*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2159*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2160*67e74705SXin Li   C->setPrivates(Vars);
2161*67e74705SXin Li   Vars.clear();
2162*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2163*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2164*67e74705SXin Li   C->setInits(Vars);
2165*67e74705SXin Li   Vars.clear();
2166*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2167*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2168*67e74705SXin Li   C->setUpdates(Vars);
2169*67e74705SXin Li   Vars.clear();
2170*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2171*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2172*67e74705SXin Li   C->setFinals(Vars);
2173*67e74705SXin Li   C->setStep(Reader->Reader.ReadSubExpr());
2174*67e74705SXin Li   C->setCalcStep(Reader->Reader.ReadSubExpr());
2175*67e74705SXin Li }
2176*67e74705SXin Li 
VisitOMPAlignedClause(OMPAlignedClause * C)2177*67e74705SXin Li void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) {
2178*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2179*67e74705SXin Li   C->setColonLoc(Reader->ReadSourceLocation(Record, Idx));
2180*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2181*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2182*67e74705SXin Li   Vars.reserve(NumVars);
2183*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2184*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2185*67e74705SXin Li   C->setVarRefs(Vars);
2186*67e74705SXin Li   C->setAlignment(Reader->Reader.ReadSubExpr());
2187*67e74705SXin Li }
2188*67e74705SXin Li 
VisitOMPCopyinClause(OMPCopyinClause * C)2189*67e74705SXin Li void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) {
2190*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2191*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2192*67e74705SXin Li   SmallVector<Expr *, 16> Exprs;
2193*67e74705SXin Li   Exprs.reserve(NumVars);
2194*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2195*67e74705SXin Li     Exprs.push_back(Reader->Reader.ReadSubExpr());
2196*67e74705SXin Li   C->setVarRefs(Exprs);
2197*67e74705SXin Li   Exprs.clear();
2198*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2199*67e74705SXin Li     Exprs.push_back(Reader->Reader.ReadSubExpr());
2200*67e74705SXin Li   C->setSourceExprs(Exprs);
2201*67e74705SXin Li   Exprs.clear();
2202*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2203*67e74705SXin Li     Exprs.push_back(Reader->Reader.ReadSubExpr());
2204*67e74705SXin Li   C->setDestinationExprs(Exprs);
2205*67e74705SXin Li   Exprs.clear();
2206*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2207*67e74705SXin Li     Exprs.push_back(Reader->Reader.ReadSubExpr());
2208*67e74705SXin Li   C->setAssignmentOps(Exprs);
2209*67e74705SXin Li }
2210*67e74705SXin Li 
VisitOMPCopyprivateClause(OMPCopyprivateClause * C)2211*67e74705SXin Li void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) {
2212*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2213*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2214*67e74705SXin Li   SmallVector<Expr *, 16> Exprs;
2215*67e74705SXin Li   Exprs.reserve(NumVars);
2216*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2217*67e74705SXin Li     Exprs.push_back(Reader->Reader.ReadSubExpr());
2218*67e74705SXin Li   C->setVarRefs(Exprs);
2219*67e74705SXin Li   Exprs.clear();
2220*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2221*67e74705SXin Li     Exprs.push_back(Reader->Reader.ReadSubExpr());
2222*67e74705SXin Li   C->setSourceExprs(Exprs);
2223*67e74705SXin Li   Exprs.clear();
2224*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2225*67e74705SXin Li     Exprs.push_back(Reader->Reader.ReadSubExpr());
2226*67e74705SXin Li   C->setDestinationExprs(Exprs);
2227*67e74705SXin Li   Exprs.clear();
2228*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2229*67e74705SXin Li     Exprs.push_back(Reader->Reader.ReadSubExpr());
2230*67e74705SXin Li   C->setAssignmentOps(Exprs);
2231*67e74705SXin Li }
2232*67e74705SXin Li 
VisitOMPFlushClause(OMPFlushClause * C)2233*67e74705SXin Li void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) {
2234*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2235*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2236*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2237*67e74705SXin Li   Vars.reserve(NumVars);
2238*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2239*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2240*67e74705SXin Li   C->setVarRefs(Vars);
2241*67e74705SXin Li }
2242*67e74705SXin Li 
VisitOMPDependClause(OMPDependClause * C)2243*67e74705SXin Li void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
2244*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2245*67e74705SXin Li   C->setDependencyKind(static_cast<OpenMPDependClauseKind>(Record[Idx++]));
2246*67e74705SXin Li   C->setDependencyLoc(Reader->ReadSourceLocation(Record, Idx));
2247*67e74705SXin Li   C->setColonLoc(Reader->ReadSourceLocation(Record, Idx));
2248*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2249*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2250*67e74705SXin Li   Vars.reserve(NumVars);
2251*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2252*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2253*67e74705SXin Li   C->setVarRefs(Vars);
2254*67e74705SXin Li   C->setCounterValue(Reader->Reader.ReadSubExpr());
2255*67e74705SXin Li }
2256*67e74705SXin Li 
VisitOMPDeviceClause(OMPDeviceClause * C)2257*67e74705SXin Li void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) {
2258*67e74705SXin Li   C->setDevice(Reader->Reader.ReadSubExpr());
2259*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2260*67e74705SXin Li }
2261*67e74705SXin Li 
VisitOMPMapClause(OMPMapClause * C)2262*67e74705SXin Li void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) {
2263*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2264*67e74705SXin Li   C->setMapTypeModifier(
2265*67e74705SXin Li      static_cast<OpenMPMapClauseKind>(Record[Idx++]));
2266*67e74705SXin Li   C->setMapType(
2267*67e74705SXin Li      static_cast<OpenMPMapClauseKind>(Record[Idx++]));
2268*67e74705SXin Li   C->setMapLoc(Reader->ReadSourceLocation(Record, Idx));
2269*67e74705SXin Li   C->setColonLoc(Reader->ReadSourceLocation(Record, Idx));
2270*67e74705SXin Li   auto NumVars = C->varlist_size();
2271*67e74705SXin Li   auto UniqueDecls = C->getUniqueDeclarationsNum();
2272*67e74705SXin Li   auto TotalLists = C->getTotalComponentListNum();
2273*67e74705SXin Li   auto TotalComponents = C->getTotalComponentsNum();
2274*67e74705SXin Li 
2275*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2276*67e74705SXin Li   Vars.reserve(NumVars);
2277*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2278*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2279*67e74705SXin Li   C->setVarRefs(Vars);
2280*67e74705SXin Li 
2281*67e74705SXin Li   SmallVector<ValueDecl *, 16> Decls;
2282*67e74705SXin Li   Decls.reserve(UniqueDecls);
2283*67e74705SXin Li   for (unsigned i = 0; i < UniqueDecls; ++i)
2284*67e74705SXin Li     Decls.push_back(
2285*67e74705SXin Li         Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx));
2286*67e74705SXin Li   C->setUniqueDecls(Decls);
2287*67e74705SXin Li 
2288*67e74705SXin Li   SmallVector<unsigned, 16> ListsPerDecl;
2289*67e74705SXin Li   ListsPerDecl.reserve(UniqueDecls);
2290*67e74705SXin Li   for (unsigned i = 0; i < UniqueDecls; ++i)
2291*67e74705SXin Li     ListsPerDecl.push_back(Record[Idx++]);
2292*67e74705SXin Li   C->setDeclNumLists(ListsPerDecl);
2293*67e74705SXin Li 
2294*67e74705SXin Li   SmallVector<unsigned, 32> ListSizes;
2295*67e74705SXin Li   ListSizes.reserve(TotalLists);
2296*67e74705SXin Li   for (unsigned i = 0; i < TotalLists; ++i)
2297*67e74705SXin Li     ListSizes.push_back(Record[Idx++]);
2298*67e74705SXin Li   C->setComponentListSizes(ListSizes);
2299*67e74705SXin Li 
2300*67e74705SXin Li   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
2301*67e74705SXin Li   Components.reserve(TotalComponents);
2302*67e74705SXin Li   for (unsigned i = 0; i < TotalComponents; ++i) {
2303*67e74705SXin Li     Expr *AssociatedExpr = Reader->Reader.ReadSubExpr();
2304*67e74705SXin Li     ValueDecl *AssociatedDecl =
2305*67e74705SXin Li         Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx);
2306*67e74705SXin Li     Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
2307*67e74705SXin Li         AssociatedExpr, AssociatedDecl));
2308*67e74705SXin Li   }
2309*67e74705SXin Li   C->setComponents(Components, ListSizes);
2310*67e74705SXin Li }
2311*67e74705SXin Li 
VisitOMPNumTeamsClause(OMPNumTeamsClause * C)2312*67e74705SXin Li void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) {
2313*67e74705SXin Li   C->setNumTeams(Reader->Reader.ReadSubExpr());
2314*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2315*67e74705SXin Li }
2316*67e74705SXin Li 
VisitOMPThreadLimitClause(OMPThreadLimitClause * C)2317*67e74705SXin Li void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) {
2318*67e74705SXin Li   C->setThreadLimit(Reader->Reader.ReadSubExpr());
2319*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2320*67e74705SXin Li }
2321*67e74705SXin Li 
VisitOMPPriorityClause(OMPPriorityClause * C)2322*67e74705SXin Li void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
2323*67e74705SXin Li   C->setPriority(Reader->Reader.ReadSubExpr());
2324*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2325*67e74705SXin Li }
2326*67e74705SXin Li 
VisitOMPGrainsizeClause(OMPGrainsizeClause * C)2327*67e74705SXin Li void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
2328*67e74705SXin Li   C->setGrainsize(Reader->Reader.ReadSubExpr());
2329*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2330*67e74705SXin Li }
2331*67e74705SXin Li 
VisitOMPNumTasksClause(OMPNumTasksClause * C)2332*67e74705SXin Li void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) {
2333*67e74705SXin Li   C->setNumTasks(Reader->Reader.ReadSubExpr());
2334*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2335*67e74705SXin Li }
2336*67e74705SXin Li 
VisitOMPHintClause(OMPHintClause * C)2337*67e74705SXin Li void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) {
2338*67e74705SXin Li   C->setHint(Reader->Reader.ReadSubExpr());
2339*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2340*67e74705SXin Li }
2341*67e74705SXin Li 
VisitOMPDistScheduleClause(OMPDistScheduleClause * C)2342*67e74705SXin Li void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) {
2343*67e74705SXin Li   VisitOMPClauseWithPreInit(C);
2344*67e74705SXin Li   C->setDistScheduleKind(
2345*67e74705SXin Li       static_cast<OpenMPDistScheduleClauseKind>(Record[Idx++]));
2346*67e74705SXin Li   C->setChunkSize(Reader->Reader.ReadSubExpr());
2347*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2348*67e74705SXin Li   C->setDistScheduleKindLoc(Reader->ReadSourceLocation(Record, Idx));
2349*67e74705SXin Li   C->setCommaLoc(Reader->ReadSourceLocation(Record, Idx));
2350*67e74705SXin Li }
2351*67e74705SXin Li 
VisitOMPDefaultmapClause(OMPDefaultmapClause * C)2352*67e74705SXin Li void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
2353*67e74705SXin Li   C->setDefaultmapKind(
2354*67e74705SXin Li        static_cast<OpenMPDefaultmapClauseKind>(Record[Idx++]));
2355*67e74705SXin Li   C->setDefaultmapModifier(
2356*67e74705SXin Li       static_cast<OpenMPDefaultmapClauseModifier>(Record[Idx++]));
2357*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2358*67e74705SXin Li   C->setDefaultmapModifierLoc(Reader->ReadSourceLocation(Record, Idx));
2359*67e74705SXin Li   C->setDefaultmapKindLoc(Reader->ReadSourceLocation(Record, Idx));
2360*67e74705SXin Li }
2361*67e74705SXin Li 
VisitOMPToClause(OMPToClause * C)2362*67e74705SXin Li void OMPClauseReader::VisitOMPToClause(OMPToClause *C) {
2363*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2364*67e74705SXin Li   auto NumVars = C->varlist_size();
2365*67e74705SXin Li   auto UniqueDecls = C->getUniqueDeclarationsNum();
2366*67e74705SXin Li   auto TotalLists = C->getTotalComponentListNum();
2367*67e74705SXin Li   auto TotalComponents = C->getTotalComponentsNum();
2368*67e74705SXin Li 
2369*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2370*67e74705SXin Li   Vars.reserve(NumVars);
2371*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2372*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2373*67e74705SXin Li   C->setVarRefs(Vars);
2374*67e74705SXin Li 
2375*67e74705SXin Li   SmallVector<ValueDecl *, 16> Decls;
2376*67e74705SXin Li   Decls.reserve(UniqueDecls);
2377*67e74705SXin Li   for (unsigned i = 0; i < UniqueDecls; ++i)
2378*67e74705SXin Li     Decls.push_back(
2379*67e74705SXin Li         Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx));
2380*67e74705SXin Li   C->setUniqueDecls(Decls);
2381*67e74705SXin Li 
2382*67e74705SXin Li   SmallVector<unsigned, 16> ListsPerDecl;
2383*67e74705SXin Li   ListsPerDecl.reserve(UniqueDecls);
2384*67e74705SXin Li   for (unsigned i = 0; i < UniqueDecls; ++i)
2385*67e74705SXin Li     ListsPerDecl.push_back(Record[Idx++]);
2386*67e74705SXin Li   C->setDeclNumLists(ListsPerDecl);
2387*67e74705SXin Li 
2388*67e74705SXin Li   SmallVector<unsigned, 32> ListSizes;
2389*67e74705SXin Li   ListSizes.reserve(TotalLists);
2390*67e74705SXin Li   for (unsigned i = 0; i < TotalLists; ++i)
2391*67e74705SXin Li     ListSizes.push_back(Record[Idx++]);
2392*67e74705SXin Li   C->setComponentListSizes(ListSizes);
2393*67e74705SXin Li 
2394*67e74705SXin Li   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
2395*67e74705SXin Li   Components.reserve(TotalComponents);
2396*67e74705SXin Li   for (unsigned i = 0; i < TotalComponents; ++i) {
2397*67e74705SXin Li     Expr *AssociatedExpr = Reader->Reader.ReadSubExpr();
2398*67e74705SXin Li     ValueDecl *AssociatedDecl =
2399*67e74705SXin Li         Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx);
2400*67e74705SXin Li     Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
2401*67e74705SXin Li         AssociatedExpr, AssociatedDecl));
2402*67e74705SXin Li   }
2403*67e74705SXin Li   C->setComponents(Components, ListSizes);
2404*67e74705SXin Li }
2405*67e74705SXin Li 
VisitOMPFromClause(OMPFromClause * C)2406*67e74705SXin Li void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) {
2407*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2408*67e74705SXin Li   auto NumVars = C->varlist_size();
2409*67e74705SXin Li   auto UniqueDecls = C->getUniqueDeclarationsNum();
2410*67e74705SXin Li   auto TotalLists = C->getTotalComponentListNum();
2411*67e74705SXin Li   auto TotalComponents = C->getTotalComponentsNum();
2412*67e74705SXin Li 
2413*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2414*67e74705SXin Li   Vars.reserve(NumVars);
2415*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2416*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2417*67e74705SXin Li   C->setVarRefs(Vars);
2418*67e74705SXin Li 
2419*67e74705SXin Li   SmallVector<ValueDecl *, 16> Decls;
2420*67e74705SXin Li   Decls.reserve(UniqueDecls);
2421*67e74705SXin Li   for (unsigned i = 0; i < UniqueDecls; ++i)
2422*67e74705SXin Li     Decls.push_back(
2423*67e74705SXin Li         Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx));
2424*67e74705SXin Li   C->setUniqueDecls(Decls);
2425*67e74705SXin Li 
2426*67e74705SXin Li   SmallVector<unsigned, 16> ListsPerDecl;
2427*67e74705SXin Li   ListsPerDecl.reserve(UniqueDecls);
2428*67e74705SXin Li   for (unsigned i = 0; i < UniqueDecls; ++i)
2429*67e74705SXin Li     ListsPerDecl.push_back(Record[Idx++]);
2430*67e74705SXin Li   C->setDeclNumLists(ListsPerDecl);
2431*67e74705SXin Li 
2432*67e74705SXin Li   SmallVector<unsigned, 32> ListSizes;
2433*67e74705SXin Li   ListSizes.reserve(TotalLists);
2434*67e74705SXin Li   for (unsigned i = 0; i < TotalLists; ++i)
2435*67e74705SXin Li     ListSizes.push_back(Record[Idx++]);
2436*67e74705SXin Li   C->setComponentListSizes(ListSizes);
2437*67e74705SXin Li 
2438*67e74705SXin Li   SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components;
2439*67e74705SXin Li   Components.reserve(TotalComponents);
2440*67e74705SXin Li   for (unsigned i = 0; i < TotalComponents; ++i) {
2441*67e74705SXin Li     Expr *AssociatedExpr = Reader->Reader.ReadSubExpr();
2442*67e74705SXin Li     ValueDecl *AssociatedDecl =
2443*67e74705SXin Li         Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx);
2444*67e74705SXin Li     Components.push_back(OMPClauseMappableExprCommon::MappableComponent(
2445*67e74705SXin Li         AssociatedExpr, AssociatedDecl));
2446*67e74705SXin Li   }
2447*67e74705SXin Li   C->setComponents(Components, ListSizes);
2448*67e74705SXin Li }
2449*67e74705SXin Li 
VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause * C)2450*67e74705SXin Li void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) {
2451*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2452*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2453*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2454*67e74705SXin Li   Vars.reserve(NumVars);
2455*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2456*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2457*67e74705SXin Li   C->setVarRefs(Vars);
2458*67e74705SXin Li   Vars.clear();
2459*67e74705SXin Li }
2460*67e74705SXin Li 
VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause * C)2461*67e74705SXin Li void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
2462*67e74705SXin Li   C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx));
2463*67e74705SXin Li   unsigned NumVars = C->varlist_size();
2464*67e74705SXin Li   SmallVector<Expr *, 16> Vars;
2465*67e74705SXin Li   Vars.reserve(NumVars);
2466*67e74705SXin Li   for (unsigned i = 0; i != NumVars; ++i)
2467*67e74705SXin Li     Vars.push_back(Reader->Reader.ReadSubExpr());
2468*67e74705SXin Li   C->setVarRefs(Vars);
2469*67e74705SXin Li   Vars.clear();
2470*67e74705SXin Li }
2471*67e74705SXin Li 
2472*67e74705SXin Li //===----------------------------------------------------------------------===//
2473*67e74705SXin Li // OpenMP Directives.
2474*67e74705SXin Li //===----------------------------------------------------------------------===//
VisitOMPExecutableDirective(OMPExecutableDirective * E)2475*67e74705SXin Li void ASTStmtReader::VisitOMPExecutableDirective(OMPExecutableDirective *E) {
2476*67e74705SXin Li   E->setLocStart(ReadSourceLocation(Record, Idx));
2477*67e74705SXin Li   E->setLocEnd(ReadSourceLocation(Record, Idx));
2478*67e74705SXin Li   OMPClauseReader ClauseReader(this, Reader.getContext(), Record, Idx);
2479*67e74705SXin Li   SmallVector<OMPClause *, 5> Clauses;
2480*67e74705SXin Li   for (unsigned i = 0; i < E->getNumClauses(); ++i)
2481*67e74705SXin Li     Clauses.push_back(ClauseReader.readClause());
2482*67e74705SXin Li   E->setClauses(Clauses);
2483*67e74705SXin Li   if (E->hasAssociatedStmt())
2484*67e74705SXin Li     E->setAssociatedStmt(Reader.ReadSubStmt());
2485*67e74705SXin Li }
2486*67e74705SXin Li 
VisitOMPLoopDirective(OMPLoopDirective * D)2487*67e74705SXin Li void ASTStmtReader::VisitOMPLoopDirective(OMPLoopDirective *D) {
2488*67e74705SXin Li   VisitStmt(D);
2489*67e74705SXin Li   // Two fields (NumClauses and CollapsedNum) were read in ReadStmtFromStream.
2490*67e74705SXin Li   Idx += 2;
2491*67e74705SXin Li   VisitOMPExecutableDirective(D);
2492*67e74705SXin Li   D->setIterationVariable(Reader.ReadSubExpr());
2493*67e74705SXin Li   D->setLastIteration(Reader.ReadSubExpr());
2494*67e74705SXin Li   D->setCalcLastIteration(Reader.ReadSubExpr());
2495*67e74705SXin Li   D->setPreCond(Reader.ReadSubExpr());
2496*67e74705SXin Li   D->setCond(Reader.ReadSubExpr());
2497*67e74705SXin Li   D->setInit(Reader.ReadSubExpr());
2498*67e74705SXin Li   D->setInc(Reader.ReadSubExpr());
2499*67e74705SXin Li   D->setPreInits(Reader.ReadSubStmt());
2500*67e74705SXin Li   if (isOpenMPWorksharingDirective(D->getDirectiveKind()) ||
2501*67e74705SXin Li       isOpenMPTaskLoopDirective(D->getDirectiveKind()) ||
2502*67e74705SXin Li       isOpenMPDistributeDirective(D->getDirectiveKind())) {
2503*67e74705SXin Li     D->setIsLastIterVariable(Reader.ReadSubExpr());
2504*67e74705SXin Li     D->setLowerBoundVariable(Reader.ReadSubExpr());
2505*67e74705SXin Li     D->setUpperBoundVariable(Reader.ReadSubExpr());
2506*67e74705SXin Li     D->setStrideVariable(Reader.ReadSubExpr());
2507*67e74705SXin Li     D->setEnsureUpperBound(Reader.ReadSubExpr());
2508*67e74705SXin Li     D->setNextLowerBound(Reader.ReadSubExpr());
2509*67e74705SXin Li     D->setNextUpperBound(Reader.ReadSubExpr());
2510*67e74705SXin Li     D->setNumIterations(Reader.ReadSubExpr());
2511*67e74705SXin Li   }
2512*67e74705SXin Li   if (isOpenMPLoopBoundSharingDirective(D->getDirectiveKind())) {
2513*67e74705SXin Li     D->setPrevLowerBoundVariable(Reader.ReadSubExpr());
2514*67e74705SXin Li     D->setPrevUpperBoundVariable(Reader.ReadSubExpr());
2515*67e74705SXin Li   }
2516*67e74705SXin Li   SmallVector<Expr *, 4> Sub;
2517*67e74705SXin Li   unsigned CollapsedNum = D->getCollapsedNumber();
2518*67e74705SXin Li   Sub.reserve(CollapsedNum);
2519*67e74705SXin Li   for (unsigned i = 0; i < CollapsedNum; ++i)
2520*67e74705SXin Li     Sub.push_back(Reader.ReadSubExpr());
2521*67e74705SXin Li   D->setCounters(Sub);
2522*67e74705SXin Li   Sub.clear();
2523*67e74705SXin Li   for (unsigned i = 0; i < CollapsedNum; ++i)
2524*67e74705SXin Li     Sub.push_back(Reader.ReadSubExpr());
2525*67e74705SXin Li   D->setPrivateCounters(Sub);
2526*67e74705SXin Li   Sub.clear();
2527*67e74705SXin Li   for (unsigned i = 0; i < CollapsedNum; ++i)
2528*67e74705SXin Li     Sub.push_back(Reader.ReadSubExpr());
2529*67e74705SXin Li   D->setInits(Sub);
2530*67e74705SXin Li   Sub.clear();
2531*67e74705SXin Li   for (unsigned i = 0; i < CollapsedNum; ++i)
2532*67e74705SXin Li     Sub.push_back(Reader.ReadSubExpr());
2533*67e74705SXin Li   D->setUpdates(Sub);
2534*67e74705SXin Li   Sub.clear();
2535*67e74705SXin Li   for (unsigned i = 0; i < CollapsedNum; ++i)
2536*67e74705SXin Li     Sub.push_back(Reader.ReadSubExpr());
2537*67e74705SXin Li   D->setFinals(Sub);
2538*67e74705SXin Li }
2539*67e74705SXin Li 
VisitOMPParallelDirective(OMPParallelDirective * D)2540*67e74705SXin Li void ASTStmtReader::VisitOMPParallelDirective(OMPParallelDirective *D) {
2541*67e74705SXin Li   VisitStmt(D);
2542*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2543*67e74705SXin Li   ++Idx;
2544*67e74705SXin Li   VisitOMPExecutableDirective(D);
2545*67e74705SXin Li   D->setHasCancel(Record[Idx++]);
2546*67e74705SXin Li }
2547*67e74705SXin Li 
VisitOMPSimdDirective(OMPSimdDirective * D)2548*67e74705SXin Li void ASTStmtReader::VisitOMPSimdDirective(OMPSimdDirective *D) {
2549*67e74705SXin Li   VisitOMPLoopDirective(D);
2550*67e74705SXin Li }
2551*67e74705SXin Li 
VisitOMPForDirective(OMPForDirective * D)2552*67e74705SXin Li void ASTStmtReader::VisitOMPForDirective(OMPForDirective *D) {
2553*67e74705SXin Li   VisitOMPLoopDirective(D);
2554*67e74705SXin Li   D->setHasCancel(Record[Idx++]);
2555*67e74705SXin Li }
2556*67e74705SXin Li 
VisitOMPForSimdDirective(OMPForSimdDirective * D)2557*67e74705SXin Li void ASTStmtReader::VisitOMPForSimdDirective(OMPForSimdDirective *D) {
2558*67e74705SXin Li   VisitOMPLoopDirective(D);
2559*67e74705SXin Li }
2560*67e74705SXin Li 
VisitOMPSectionsDirective(OMPSectionsDirective * D)2561*67e74705SXin Li void ASTStmtReader::VisitOMPSectionsDirective(OMPSectionsDirective *D) {
2562*67e74705SXin Li   VisitStmt(D);
2563*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2564*67e74705SXin Li   ++Idx;
2565*67e74705SXin Li   VisitOMPExecutableDirective(D);
2566*67e74705SXin Li   D->setHasCancel(Record[Idx++]);
2567*67e74705SXin Li }
2568*67e74705SXin Li 
VisitOMPSectionDirective(OMPSectionDirective * D)2569*67e74705SXin Li void ASTStmtReader::VisitOMPSectionDirective(OMPSectionDirective *D) {
2570*67e74705SXin Li   VisitStmt(D);
2571*67e74705SXin Li   VisitOMPExecutableDirective(D);
2572*67e74705SXin Li   D->setHasCancel(Record[Idx++]);
2573*67e74705SXin Li }
2574*67e74705SXin Li 
VisitOMPSingleDirective(OMPSingleDirective * D)2575*67e74705SXin Li void ASTStmtReader::VisitOMPSingleDirective(OMPSingleDirective *D) {
2576*67e74705SXin Li   VisitStmt(D);
2577*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2578*67e74705SXin Li   ++Idx;
2579*67e74705SXin Li   VisitOMPExecutableDirective(D);
2580*67e74705SXin Li }
2581*67e74705SXin Li 
VisitOMPMasterDirective(OMPMasterDirective * D)2582*67e74705SXin Li void ASTStmtReader::VisitOMPMasterDirective(OMPMasterDirective *D) {
2583*67e74705SXin Li   VisitStmt(D);
2584*67e74705SXin Li   VisitOMPExecutableDirective(D);
2585*67e74705SXin Li }
2586*67e74705SXin Li 
VisitOMPCriticalDirective(OMPCriticalDirective * D)2587*67e74705SXin Li void ASTStmtReader::VisitOMPCriticalDirective(OMPCriticalDirective *D) {
2588*67e74705SXin Li   VisitStmt(D);
2589*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2590*67e74705SXin Li   ++Idx;
2591*67e74705SXin Li   VisitOMPExecutableDirective(D);
2592*67e74705SXin Li   ReadDeclarationNameInfo(D->DirName, Record, Idx);
2593*67e74705SXin Li }
2594*67e74705SXin Li 
VisitOMPParallelForDirective(OMPParallelForDirective * D)2595*67e74705SXin Li void ASTStmtReader::VisitOMPParallelForDirective(OMPParallelForDirective *D) {
2596*67e74705SXin Li   VisitOMPLoopDirective(D);
2597*67e74705SXin Li   D->setHasCancel(Record[Idx++]);
2598*67e74705SXin Li }
2599*67e74705SXin Li 
VisitOMPParallelForSimdDirective(OMPParallelForSimdDirective * D)2600*67e74705SXin Li void ASTStmtReader::VisitOMPParallelForSimdDirective(
2601*67e74705SXin Li     OMPParallelForSimdDirective *D) {
2602*67e74705SXin Li   VisitOMPLoopDirective(D);
2603*67e74705SXin Li }
2604*67e74705SXin Li 
VisitOMPParallelSectionsDirective(OMPParallelSectionsDirective * D)2605*67e74705SXin Li void ASTStmtReader::VisitOMPParallelSectionsDirective(
2606*67e74705SXin Li     OMPParallelSectionsDirective *D) {
2607*67e74705SXin Li   VisitStmt(D);
2608*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2609*67e74705SXin Li   ++Idx;
2610*67e74705SXin Li   VisitOMPExecutableDirective(D);
2611*67e74705SXin Li   D->setHasCancel(Record[Idx++]);
2612*67e74705SXin Li }
2613*67e74705SXin Li 
VisitOMPTaskDirective(OMPTaskDirective * D)2614*67e74705SXin Li void ASTStmtReader::VisitOMPTaskDirective(OMPTaskDirective *D) {
2615*67e74705SXin Li   VisitStmt(D);
2616*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2617*67e74705SXin Li   ++Idx;
2618*67e74705SXin Li   VisitOMPExecutableDirective(D);
2619*67e74705SXin Li   D->setHasCancel(Record[Idx++]);
2620*67e74705SXin Li }
2621*67e74705SXin Li 
VisitOMPTaskyieldDirective(OMPTaskyieldDirective * D)2622*67e74705SXin Li void ASTStmtReader::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) {
2623*67e74705SXin Li   VisitStmt(D);
2624*67e74705SXin Li   VisitOMPExecutableDirective(D);
2625*67e74705SXin Li }
2626*67e74705SXin Li 
VisitOMPBarrierDirective(OMPBarrierDirective * D)2627*67e74705SXin Li void ASTStmtReader::VisitOMPBarrierDirective(OMPBarrierDirective *D) {
2628*67e74705SXin Li   VisitStmt(D);
2629*67e74705SXin Li   VisitOMPExecutableDirective(D);
2630*67e74705SXin Li }
2631*67e74705SXin Li 
VisitOMPTaskwaitDirective(OMPTaskwaitDirective * D)2632*67e74705SXin Li void ASTStmtReader::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
2633*67e74705SXin Li   VisitStmt(D);
2634*67e74705SXin Li   VisitOMPExecutableDirective(D);
2635*67e74705SXin Li }
2636*67e74705SXin Li 
VisitOMPTaskgroupDirective(OMPTaskgroupDirective * D)2637*67e74705SXin Li void ASTStmtReader::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) {
2638*67e74705SXin Li   VisitStmt(D);
2639*67e74705SXin Li   VisitOMPExecutableDirective(D);
2640*67e74705SXin Li }
2641*67e74705SXin Li 
VisitOMPFlushDirective(OMPFlushDirective * D)2642*67e74705SXin Li void ASTStmtReader::VisitOMPFlushDirective(OMPFlushDirective *D) {
2643*67e74705SXin Li   VisitStmt(D);
2644*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2645*67e74705SXin Li   ++Idx;
2646*67e74705SXin Li   VisitOMPExecutableDirective(D);
2647*67e74705SXin Li }
2648*67e74705SXin Li 
VisitOMPOrderedDirective(OMPOrderedDirective * D)2649*67e74705SXin Li void ASTStmtReader::VisitOMPOrderedDirective(OMPOrderedDirective *D) {
2650*67e74705SXin Li   VisitStmt(D);
2651*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2652*67e74705SXin Li   ++Idx;
2653*67e74705SXin Li   VisitOMPExecutableDirective(D);
2654*67e74705SXin Li }
2655*67e74705SXin Li 
VisitOMPAtomicDirective(OMPAtomicDirective * D)2656*67e74705SXin Li void ASTStmtReader::VisitOMPAtomicDirective(OMPAtomicDirective *D) {
2657*67e74705SXin Li   VisitStmt(D);
2658*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2659*67e74705SXin Li   ++Idx;
2660*67e74705SXin Li   VisitOMPExecutableDirective(D);
2661*67e74705SXin Li   D->setX(Reader.ReadSubExpr());
2662*67e74705SXin Li   D->setV(Reader.ReadSubExpr());
2663*67e74705SXin Li   D->setExpr(Reader.ReadSubExpr());
2664*67e74705SXin Li   D->setUpdateExpr(Reader.ReadSubExpr());
2665*67e74705SXin Li   D->IsXLHSInRHSPart = Record[Idx++] != 0;
2666*67e74705SXin Li   D->IsPostfixUpdate = Record[Idx++] != 0;
2667*67e74705SXin Li }
2668*67e74705SXin Li 
VisitOMPTargetDirective(OMPTargetDirective * D)2669*67e74705SXin Li void ASTStmtReader::VisitOMPTargetDirective(OMPTargetDirective *D) {
2670*67e74705SXin Li   VisitStmt(D);
2671*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2672*67e74705SXin Li   ++Idx;
2673*67e74705SXin Li   VisitOMPExecutableDirective(D);
2674*67e74705SXin Li }
2675*67e74705SXin Li 
VisitOMPTargetDataDirective(OMPTargetDataDirective * D)2676*67e74705SXin Li void ASTStmtReader::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) {
2677*67e74705SXin Li   VisitStmt(D);
2678*67e74705SXin Li   ++Idx;
2679*67e74705SXin Li   VisitOMPExecutableDirective(D);
2680*67e74705SXin Li }
2681*67e74705SXin Li 
VisitOMPTargetEnterDataDirective(OMPTargetEnterDataDirective * D)2682*67e74705SXin Li void ASTStmtReader::VisitOMPTargetEnterDataDirective(
2683*67e74705SXin Li     OMPTargetEnterDataDirective *D) {
2684*67e74705SXin Li   VisitStmt(D);
2685*67e74705SXin Li   ++Idx;
2686*67e74705SXin Li   VisitOMPExecutableDirective(D);
2687*67e74705SXin Li }
2688*67e74705SXin Li 
VisitOMPTargetExitDataDirective(OMPTargetExitDataDirective * D)2689*67e74705SXin Li void ASTStmtReader::VisitOMPTargetExitDataDirective(
2690*67e74705SXin Li     OMPTargetExitDataDirective *D) {
2691*67e74705SXin Li   VisitStmt(D);
2692*67e74705SXin Li   ++Idx;
2693*67e74705SXin Li   VisitOMPExecutableDirective(D);
2694*67e74705SXin Li }
2695*67e74705SXin Li 
VisitOMPTargetParallelDirective(OMPTargetParallelDirective * D)2696*67e74705SXin Li void ASTStmtReader::VisitOMPTargetParallelDirective(
2697*67e74705SXin Li     OMPTargetParallelDirective *D) {
2698*67e74705SXin Li   VisitStmt(D);
2699*67e74705SXin Li   ++Idx;
2700*67e74705SXin Li   VisitOMPExecutableDirective(D);
2701*67e74705SXin Li }
2702*67e74705SXin Li 
VisitOMPTargetParallelForDirective(OMPTargetParallelForDirective * D)2703*67e74705SXin Li void ASTStmtReader::VisitOMPTargetParallelForDirective(
2704*67e74705SXin Li     OMPTargetParallelForDirective *D) {
2705*67e74705SXin Li   VisitOMPLoopDirective(D);
2706*67e74705SXin Li   D->setHasCancel(Record[Idx++]);
2707*67e74705SXin Li }
2708*67e74705SXin Li 
VisitOMPTeamsDirective(OMPTeamsDirective * D)2709*67e74705SXin Li void ASTStmtReader::VisitOMPTeamsDirective(OMPTeamsDirective *D) {
2710*67e74705SXin Li   VisitStmt(D);
2711*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2712*67e74705SXin Li   ++Idx;
2713*67e74705SXin Li   VisitOMPExecutableDirective(D);
2714*67e74705SXin Li }
2715*67e74705SXin Li 
VisitOMPCancellationPointDirective(OMPCancellationPointDirective * D)2716*67e74705SXin Li void ASTStmtReader::VisitOMPCancellationPointDirective(
2717*67e74705SXin Li     OMPCancellationPointDirective *D) {
2718*67e74705SXin Li   VisitStmt(D);
2719*67e74705SXin Li   VisitOMPExecutableDirective(D);
2720*67e74705SXin Li   D->setCancelRegion(static_cast<OpenMPDirectiveKind>(Record[Idx++]));
2721*67e74705SXin Li }
2722*67e74705SXin Li 
VisitOMPCancelDirective(OMPCancelDirective * D)2723*67e74705SXin Li void ASTStmtReader::VisitOMPCancelDirective(OMPCancelDirective *D) {
2724*67e74705SXin Li   VisitStmt(D);
2725*67e74705SXin Li   // The NumClauses field was read in ReadStmtFromStream.
2726*67e74705SXin Li   ++Idx;
2727*67e74705SXin Li   VisitOMPExecutableDirective(D);
2728*67e74705SXin Li   D->setCancelRegion(static_cast<OpenMPDirectiveKind>(Record[Idx++]));
2729*67e74705SXin Li }
2730*67e74705SXin Li 
VisitOMPTaskLoopDirective(OMPTaskLoopDirective * D)2731*67e74705SXin Li void ASTStmtReader::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
2732*67e74705SXin Li   VisitOMPLoopDirective(D);
2733*67e74705SXin Li }
2734*67e74705SXin Li 
VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective * D)2735*67e74705SXin Li void ASTStmtReader::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) {
2736*67e74705SXin Li   VisitOMPLoopDirective(D);
2737*67e74705SXin Li }
2738*67e74705SXin Li 
VisitOMPDistributeDirective(OMPDistributeDirective * D)2739*67e74705SXin Li void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective *D) {
2740*67e74705SXin Li   VisitOMPLoopDirective(D);
2741*67e74705SXin Li }
2742*67e74705SXin Li 
VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective * D)2743*67e74705SXin Li void ASTStmtReader::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) {
2744*67e74705SXin Li   VisitStmt(D);
2745*67e74705SXin Li   ++Idx;
2746*67e74705SXin Li   VisitOMPExecutableDirective(D);
2747*67e74705SXin Li }
VisitOMPDistributeParallelForDirective(OMPDistributeParallelForDirective * D)2748*67e74705SXin Li void ASTStmtReader::VisitOMPDistributeParallelForDirective(
2749*67e74705SXin Li     OMPDistributeParallelForDirective *D) {
2750*67e74705SXin Li   VisitOMPLoopDirective(D);
2751*67e74705SXin Li }
2752*67e74705SXin Li 
VisitOMPDistributeParallelForSimdDirective(OMPDistributeParallelForSimdDirective * D)2753*67e74705SXin Li void ASTStmtReader::VisitOMPDistributeParallelForSimdDirective(
2754*67e74705SXin Li     OMPDistributeParallelForSimdDirective *D) {
2755*67e74705SXin Li   VisitOMPLoopDirective(D);
2756*67e74705SXin Li }
2757*67e74705SXin Li 
VisitOMPDistributeSimdDirective(OMPDistributeSimdDirective * D)2758*67e74705SXin Li void ASTStmtReader::VisitOMPDistributeSimdDirective(
2759*67e74705SXin Li     OMPDistributeSimdDirective *D) {
2760*67e74705SXin Li   VisitOMPLoopDirective(D);
2761*67e74705SXin Li }
2762*67e74705SXin Li 
VisitOMPTargetParallelForSimdDirective(OMPTargetParallelForSimdDirective * D)2763*67e74705SXin Li void ASTStmtReader::VisitOMPTargetParallelForSimdDirective(
2764*67e74705SXin Li     OMPTargetParallelForSimdDirective *D) {
2765*67e74705SXin Li   VisitOMPLoopDirective(D);
2766*67e74705SXin Li }
2767*67e74705SXin Li 
2768*67e74705SXin Li //===----------------------------------------------------------------------===//
2769*67e74705SXin Li // ASTReader Implementation
2770*67e74705SXin Li //===----------------------------------------------------------------------===//
2771*67e74705SXin Li 
ReadStmt(ModuleFile & F)2772*67e74705SXin Li Stmt *ASTReader::ReadStmt(ModuleFile &F) {
2773*67e74705SXin Li   switch (ReadingKind) {
2774*67e74705SXin Li   case Read_None:
2775*67e74705SXin Li     llvm_unreachable("should not call this when not reading anything");
2776*67e74705SXin Li   case Read_Decl:
2777*67e74705SXin Li   case Read_Type:
2778*67e74705SXin Li     return ReadStmtFromStream(F);
2779*67e74705SXin Li   case Read_Stmt:
2780*67e74705SXin Li     return ReadSubStmt();
2781*67e74705SXin Li   }
2782*67e74705SXin Li 
2783*67e74705SXin Li   llvm_unreachable("ReadingKind not set ?");
2784*67e74705SXin Li }
2785*67e74705SXin Li 
ReadExpr(ModuleFile & F)2786*67e74705SXin Li Expr *ASTReader::ReadExpr(ModuleFile &F) {
2787*67e74705SXin Li   return cast_or_null<Expr>(ReadStmt(F));
2788*67e74705SXin Li }
2789*67e74705SXin Li 
ReadSubExpr()2790*67e74705SXin Li Expr *ASTReader::ReadSubExpr() {
2791*67e74705SXin Li   return cast_or_null<Expr>(ReadSubStmt());
2792*67e74705SXin Li }
2793*67e74705SXin Li 
2794*67e74705SXin Li // Within the bitstream, expressions are stored in Reverse Polish
2795*67e74705SXin Li // Notation, with each of the subexpressions preceding the
2796*67e74705SXin Li // expression they are stored in. Subexpressions are stored from last to first.
2797*67e74705SXin Li // To evaluate expressions, we continue reading expressions and placing them on
2798*67e74705SXin Li // the stack, with expressions having operands removing those operands from the
2799*67e74705SXin Li // stack. Evaluation terminates when we see a STMT_STOP record, and
2800*67e74705SXin Li // the single remaining expression on the stack is our result.
ReadStmtFromStream(ModuleFile & F)2801*67e74705SXin Li Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
2802*67e74705SXin Li 
2803*67e74705SXin Li   ReadingKindTracker ReadingKind(Read_Stmt, *this);
2804*67e74705SXin Li   llvm::BitstreamCursor &Cursor = F.DeclsCursor;
2805*67e74705SXin Li 
2806*67e74705SXin Li   // Map of offset to previously deserialized stmt. The offset points
2807*67e74705SXin Li   /// just after the stmt record.
2808*67e74705SXin Li   llvm::DenseMap<uint64_t, Stmt *> StmtEntries;
2809*67e74705SXin Li 
2810*67e74705SXin Li #ifndef NDEBUG
2811*67e74705SXin Li   unsigned PrevNumStmts = StmtStack.size();
2812*67e74705SXin Li #endif
2813*67e74705SXin Li 
2814*67e74705SXin Li   RecordData Record;
2815*67e74705SXin Li   unsigned Idx;
2816*67e74705SXin Li   ASTStmtReader Reader(*this, F, Cursor, Record, Idx);
2817*67e74705SXin Li   Stmt::EmptyShell Empty;
2818*67e74705SXin Li 
2819*67e74705SXin Li   while (true) {
2820*67e74705SXin Li     llvm::BitstreamEntry Entry = Cursor.advanceSkippingSubblocks();
2821*67e74705SXin Li 
2822*67e74705SXin Li     switch (Entry.Kind) {
2823*67e74705SXin Li     case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2824*67e74705SXin Li     case llvm::BitstreamEntry::Error:
2825*67e74705SXin Li       Error("malformed block record in AST file");
2826*67e74705SXin Li       return nullptr;
2827*67e74705SXin Li     case llvm::BitstreamEntry::EndBlock:
2828*67e74705SXin Li       goto Done;
2829*67e74705SXin Li     case llvm::BitstreamEntry::Record:
2830*67e74705SXin Li       // The interesting case.
2831*67e74705SXin Li       break;
2832*67e74705SXin Li     }
2833*67e74705SXin Li 
2834*67e74705SXin Li     Stmt *S = nullptr;
2835*67e74705SXin Li     Idx = 0;
2836*67e74705SXin Li     Record.clear();
2837*67e74705SXin Li     bool Finished = false;
2838*67e74705SXin Li     bool IsStmtReference = false;
2839*67e74705SXin Li     switch ((StmtCode)Cursor.readRecord(Entry.ID, Record)) {
2840*67e74705SXin Li     case STMT_STOP:
2841*67e74705SXin Li       Finished = true;
2842*67e74705SXin Li       break;
2843*67e74705SXin Li 
2844*67e74705SXin Li     case STMT_REF_PTR:
2845*67e74705SXin Li       IsStmtReference = true;
2846*67e74705SXin Li       assert(StmtEntries.find(Record[0]) != StmtEntries.end() &&
2847*67e74705SXin Li              "No stmt was recorded for this offset reference!");
2848*67e74705SXin Li       S = StmtEntries[Record[Idx++]];
2849*67e74705SXin Li       break;
2850*67e74705SXin Li 
2851*67e74705SXin Li     case STMT_NULL_PTR:
2852*67e74705SXin Li       S = nullptr;
2853*67e74705SXin Li       break;
2854*67e74705SXin Li 
2855*67e74705SXin Li     case STMT_NULL:
2856*67e74705SXin Li       S = new (Context) NullStmt(Empty);
2857*67e74705SXin Li       break;
2858*67e74705SXin Li 
2859*67e74705SXin Li     case STMT_COMPOUND:
2860*67e74705SXin Li       S = new (Context) CompoundStmt(Empty);
2861*67e74705SXin Li       break;
2862*67e74705SXin Li 
2863*67e74705SXin Li     case STMT_CASE:
2864*67e74705SXin Li       S = new (Context) CaseStmt(Empty);
2865*67e74705SXin Li       break;
2866*67e74705SXin Li 
2867*67e74705SXin Li     case STMT_DEFAULT:
2868*67e74705SXin Li       S = new (Context) DefaultStmt(Empty);
2869*67e74705SXin Li       break;
2870*67e74705SXin Li 
2871*67e74705SXin Li     case STMT_LABEL:
2872*67e74705SXin Li       S = new (Context) LabelStmt(Empty);
2873*67e74705SXin Li       break;
2874*67e74705SXin Li 
2875*67e74705SXin Li     case STMT_ATTRIBUTED:
2876*67e74705SXin Li       S = AttributedStmt::CreateEmpty(
2877*67e74705SXin Li         Context,
2878*67e74705SXin Li         /*NumAttrs*/Record[ASTStmtReader::NumStmtFields]);
2879*67e74705SXin Li       break;
2880*67e74705SXin Li 
2881*67e74705SXin Li     case STMT_IF:
2882*67e74705SXin Li       S = new (Context) IfStmt(Empty);
2883*67e74705SXin Li       break;
2884*67e74705SXin Li 
2885*67e74705SXin Li     case STMT_SWITCH:
2886*67e74705SXin Li       S = new (Context) SwitchStmt(Empty);
2887*67e74705SXin Li       break;
2888*67e74705SXin Li 
2889*67e74705SXin Li     case STMT_WHILE:
2890*67e74705SXin Li       S = new (Context) WhileStmt(Empty);
2891*67e74705SXin Li       break;
2892*67e74705SXin Li 
2893*67e74705SXin Li     case STMT_DO:
2894*67e74705SXin Li       S = new (Context) DoStmt(Empty);
2895*67e74705SXin Li       break;
2896*67e74705SXin Li 
2897*67e74705SXin Li     case STMT_FOR:
2898*67e74705SXin Li       S = new (Context) ForStmt(Empty);
2899*67e74705SXin Li       break;
2900*67e74705SXin Li 
2901*67e74705SXin Li     case STMT_GOTO:
2902*67e74705SXin Li       S = new (Context) GotoStmt(Empty);
2903*67e74705SXin Li       break;
2904*67e74705SXin Li 
2905*67e74705SXin Li     case STMT_INDIRECT_GOTO:
2906*67e74705SXin Li       S = new (Context) IndirectGotoStmt(Empty);
2907*67e74705SXin Li       break;
2908*67e74705SXin Li 
2909*67e74705SXin Li     case STMT_CONTINUE:
2910*67e74705SXin Li       S = new (Context) ContinueStmt(Empty);
2911*67e74705SXin Li       break;
2912*67e74705SXin Li 
2913*67e74705SXin Li     case STMT_BREAK:
2914*67e74705SXin Li       S = new (Context) BreakStmt(Empty);
2915*67e74705SXin Li       break;
2916*67e74705SXin Li 
2917*67e74705SXin Li     case STMT_RETURN:
2918*67e74705SXin Li       S = new (Context) ReturnStmt(Empty);
2919*67e74705SXin Li       break;
2920*67e74705SXin Li 
2921*67e74705SXin Li     case STMT_DECL:
2922*67e74705SXin Li       S = new (Context) DeclStmt(Empty);
2923*67e74705SXin Li       break;
2924*67e74705SXin Li 
2925*67e74705SXin Li     case STMT_GCCASM:
2926*67e74705SXin Li       S = new (Context) GCCAsmStmt(Empty);
2927*67e74705SXin Li       break;
2928*67e74705SXin Li 
2929*67e74705SXin Li     case STMT_MSASM:
2930*67e74705SXin Li       S = new (Context) MSAsmStmt(Empty);
2931*67e74705SXin Li       break;
2932*67e74705SXin Li 
2933*67e74705SXin Li     case STMT_CAPTURED:
2934*67e74705SXin Li       S = CapturedStmt::CreateDeserialized(Context,
2935*67e74705SXin Li                                            Record[ASTStmtReader::NumStmtFields]);
2936*67e74705SXin Li       break;
2937*67e74705SXin Li 
2938*67e74705SXin Li     case EXPR_PREDEFINED:
2939*67e74705SXin Li       S = new (Context) PredefinedExpr(Empty);
2940*67e74705SXin Li       break;
2941*67e74705SXin Li 
2942*67e74705SXin Li     case EXPR_DECL_REF:
2943*67e74705SXin Li       S = DeclRefExpr::CreateEmpty(
2944*67e74705SXin Li         Context,
2945*67e74705SXin Li         /*HasQualifier=*/Record[ASTStmtReader::NumExprFields],
2946*67e74705SXin Li         /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1],
2947*67e74705SXin Li         /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 2],
2948*67e74705SXin Li         /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ?
2949*67e74705SXin Li           Record[ASTStmtReader::NumExprFields + 5] : 0);
2950*67e74705SXin Li       break;
2951*67e74705SXin Li 
2952*67e74705SXin Li     case EXPR_INTEGER_LITERAL:
2953*67e74705SXin Li       S = IntegerLiteral::Create(Context, Empty);
2954*67e74705SXin Li       break;
2955*67e74705SXin Li 
2956*67e74705SXin Li     case EXPR_FLOATING_LITERAL:
2957*67e74705SXin Li       S = FloatingLiteral::Create(Context, Empty);
2958*67e74705SXin Li       break;
2959*67e74705SXin Li 
2960*67e74705SXin Li     case EXPR_IMAGINARY_LITERAL:
2961*67e74705SXin Li       S = new (Context) ImaginaryLiteral(Empty);
2962*67e74705SXin Li       break;
2963*67e74705SXin Li 
2964*67e74705SXin Li     case EXPR_STRING_LITERAL:
2965*67e74705SXin Li       S = StringLiteral::CreateEmpty(Context,
2966*67e74705SXin Li                                      Record[ASTStmtReader::NumExprFields + 1]);
2967*67e74705SXin Li       break;
2968*67e74705SXin Li 
2969*67e74705SXin Li     case EXPR_CHARACTER_LITERAL:
2970*67e74705SXin Li       S = new (Context) CharacterLiteral(Empty);
2971*67e74705SXin Li       break;
2972*67e74705SXin Li 
2973*67e74705SXin Li     case EXPR_PAREN:
2974*67e74705SXin Li       S = new (Context) ParenExpr(Empty);
2975*67e74705SXin Li       break;
2976*67e74705SXin Li 
2977*67e74705SXin Li     case EXPR_PAREN_LIST:
2978*67e74705SXin Li       S = new (Context) ParenListExpr(Empty);
2979*67e74705SXin Li       break;
2980*67e74705SXin Li 
2981*67e74705SXin Li     case EXPR_UNARY_OPERATOR:
2982*67e74705SXin Li       S = new (Context) UnaryOperator(Empty);
2983*67e74705SXin Li       break;
2984*67e74705SXin Li 
2985*67e74705SXin Li     case EXPR_OFFSETOF:
2986*67e74705SXin Li       S = OffsetOfExpr::CreateEmpty(Context,
2987*67e74705SXin Li                                     Record[ASTStmtReader::NumExprFields],
2988*67e74705SXin Li                                     Record[ASTStmtReader::NumExprFields + 1]);
2989*67e74705SXin Li       break;
2990*67e74705SXin Li 
2991*67e74705SXin Li     case EXPR_SIZEOF_ALIGN_OF:
2992*67e74705SXin Li       S = new (Context) UnaryExprOrTypeTraitExpr(Empty);
2993*67e74705SXin Li       break;
2994*67e74705SXin Li 
2995*67e74705SXin Li     case EXPR_ARRAY_SUBSCRIPT:
2996*67e74705SXin Li       S = new (Context) ArraySubscriptExpr(Empty);
2997*67e74705SXin Li       break;
2998*67e74705SXin Li 
2999*67e74705SXin Li     case EXPR_OMP_ARRAY_SECTION:
3000*67e74705SXin Li       S = new (Context) OMPArraySectionExpr(Empty);
3001*67e74705SXin Li       break;
3002*67e74705SXin Li 
3003*67e74705SXin Li     case EXPR_CALL:
3004*67e74705SXin Li       S = new (Context) CallExpr(Context, Stmt::CallExprClass, Empty);
3005*67e74705SXin Li       break;
3006*67e74705SXin Li 
3007*67e74705SXin Li     case EXPR_MEMBER: {
3008*67e74705SXin Li       // We load everything here and fully initialize it at creation.
3009*67e74705SXin Li       // That way we can use MemberExpr::Create and don't have to duplicate its
3010*67e74705SXin Li       // logic with a MemberExpr::CreateEmpty.
3011*67e74705SXin Li 
3012*67e74705SXin Li       assert(Idx == 0);
3013*67e74705SXin Li       NestedNameSpecifierLoc QualifierLoc;
3014*67e74705SXin Li       if (Record[Idx++]) { // HasQualifier.
3015*67e74705SXin Li         QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
3016*67e74705SXin Li       }
3017*67e74705SXin Li 
3018*67e74705SXin Li       SourceLocation TemplateKWLoc;
3019*67e74705SXin Li       TemplateArgumentListInfo ArgInfo;
3020*67e74705SXin Li       bool HasTemplateKWAndArgsInfo = Record[Idx++];
3021*67e74705SXin Li       if (HasTemplateKWAndArgsInfo) {
3022*67e74705SXin Li         TemplateKWLoc = ReadSourceLocation(F, Record, Idx);
3023*67e74705SXin Li         unsigned NumTemplateArgs = Record[Idx++];
3024*67e74705SXin Li         ArgInfo.setLAngleLoc(ReadSourceLocation(F, Record, Idx));
3025*67e74705SXin Li         ArgInfo.setRAngleLoc(ReadSourceLocation(F, Record, Idx));
3026*67e74705SXin Li         for (unsigned i = 0; i != NumTemplateArgs; ++i)
3027*67e74705SXin Li           ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx));
3028*67e74705SXin Li       }
3029*67e74705SXin Li 
3030*67e74705SXin Li       bool HadMultipleCandidates = Record[Idx++];
3031*67e74705SXin Li 
3032*67e74705SXin Li       NamedDecl *FoundD = ReadDeclAs<NamedDecl>(F, Record, Idx);
3033*67e74705SXin Li       AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
3034*67e74705SXin Li       DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
3035*67e74705SXin Li 
3036*67e74705SXin Li       QualType T = readType(F, Record, Idx);
3037*67e74705SXin Li       ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]);
3038*67e74705SXin Li       ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]);
3039*67e74705SXin Li       Expr *Base = ReadSubExpr();
3040*67e74705SXin Li       ValueDecl *MemberD = ReadDeclAs<ValueDecl>(F, Record, Idx);
3041*67e74705SXin Li       SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx);
3042*67e74705SXin Li       DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);
3043*67e74705SXin Li       bool IsArrow = Record[Idx++];
3044*67e74705SXin Li       SourceLocation OperatorLoc = ReadSourceLocation(F, Record, Idx);
3045*67e74705SXin Li 
3046*67e74705SXin Li       S = MemberExpr::Create(Context, Base, IsArrow, OperatorLoc, QualifierLoc,
3047*67e74705SXin Li                              TemplateKWLoc, MemberD, FoundDecl, MemberNameInfo,
3048*67e74705SXin Li                              HasTemplateKWAndArgsInfo ? &ArgInfo : nullptr, T,
3049*67e74705SXin Li                              VK, OK);
3050*67e74705SXin Li       ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc,
3051*67e74705SXin Li                              MemberD->getDeclName(), Record, Idx);
3052*67e74705SXin Li       if (HadMultipleCandidates)
3053*67e74705SXin Li         cast<MemberExpr>(S)->setHadMultipleCandidates(true);
3054*67e74705SXin Li       break;
3055*67e74705SXin Li     }
3056*67e74705SXin Li 
3057*67e74705SXin Li     case EXPR_BINARY_OPERATOR:
3058*67e74705SXin Li       S = new (Context) BinaryOperator(Empty);
3059*67e74705SXin Li       break;
3060*67e74705SXin Li 
3061*67e74705SXin Li     case EXPR_COMPOUND_ASSIGN_OPERATOR:
3062*67e74705SXin Li       S = new (Context) CompoundAssignOperator(Empty);
3063*67e74705SXin Li       break;
3064*67e74705SXin Li 
3065*67e74705SXin Li     case EXPR_CONDITIONAL_OPERATOR:
3066*67e74705SXin Li       S = new (Context) ConditionalOperator(Empty);
3067*67e74705SXin Li       break;
3068*67e74705SXin Li 
3069*67e74705SXin Li     case EXPR_BINARY_CONDITIONAL_OPERATOR:
3070*67e74705SXin Li       S = new (Context) BinaryConditionalOperator(Empty);
3071*67e74705SXin Li       break;
3072*67e74705SXin Li 
3073*67e74705SXin Li     case EXPR_IMPLICIT_CAST:
3074*67e74705SXin Li       S = ImplicitCastExpr::CreateEmpty(Context,
3075*67e74705SXin Li                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
3076*67e74705SXin Li       break;
3077*67e74705SXin Li 
3078*67e74705SXin Li     case EXPR_CSTYLE_CAST:
3079*67e74705SXin Li       S = CStyleCastExpr::CreateEmpty(Context,
3080*67e74705SXin Li                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
3081*67e74705SXin Li       break;
3082*67e74705SXin Li 
3083*67e74705SXin Li     case EXPR_COMPOUND_LITERAL:
3084*67e74705SXin Li       S = new (Context) CompoundLiteralExpr(Empty);
3085*67e74705SXin Li       break;
3086*67e74705SXin Li 
3087*67e74705SXin Li     case EXPR_EXT_VECTOR_ELEMENT:
3088*67e74705SXin Li       S = new (Context) ExtVectorElementExpr(Empty);
3089*67e74705SXin Li       break;
3090*67e74705SXin Li 
3091*67e74705SXin Li     case EXPR_INIT_LIST:
3092*67e74705SXin Li       S = new (Context) InitListExpr(Empty);
3093*67e74705SXin Li       break;
3094*67e74705SXin Li 
3095*67e74705SXin Li     case EXPR_DESIGNATED_INIT:
3096*67e74705SXin Li       S = DesignatedInitExpr::CreateEmpty(Context,
3097*67e74705SXin Li                                      Record[ASTStmtReader::NumExprFields] - 1);
3098*67e74705SXin Li 
3099*67e74705SXin Li       break;
3100*67e74705SXin Li 
3101*67e74705SXin Li     case EXPR_DESIGNATED_INIT_UPDATE:
3102*67e74705SXin Li       S = new (Context) DesignatedInitUpdateExpr(Empty);
3103*67e74705SXin Li       break;
3104*67e74705SXin Li 
3105*67e74705SXin Li     case EXPR_IMPLICIT_VALUE_INIT:
3106*67e74705SXin Li       S = new (Context) ImplicitValueInitExpr(Empty);
3107*67e74705SXin Li       break;
3108*67e74705SXin Li 
3109*67e74705SXin Li     case EXPR_NO_INIT:
3110*67e74705SXin Li       S = new (Context) NoInitExpr(Empty);
3111*67e74705SXin Li       break;
3112*67e74705SXin Li 
3113*67e74705SXin Li     case EXPR_VA_ARG:
3114*67e74705SXin Li       S = new (Context) VAArgExpr(Empty);
3115*67e74705SXin Li       break;
3116*67e74705SXin Li 
3117*67e74705SXin Li     case EXPR_ADDR_LABEL:
3118*67e74705SXin Li       S = new (Context) AddrLabelExpr(Empty);
3119*67e74705SXin Li       break;
3120*67e74705SXin Li 
3121*67e74705SXin Li     case EXPR_STMT:
3122*67e74705SXin Li       S = new (Context) StmtExpr(Empty);
3123*67e74705SXin Li       break;
3124*67e74705SXin Li 
3125*67e74705SXin Li     case EXPR_CHOOSE:
3126*67e74705SXin Li       S = new (Context) ChooseExpr(Empty);
3127*67e74705SXin Li       break;
3128*67e74705SXin Li 
3129*67e74705SXin Li     case EXPR_GNU_NULL:
3130*67e74705SXin Li       S = new (Context) GNUNullExpr(Empty);
3131*67e74705SXin Li       break;
3132*67e74705SXin Li 
3133*67e74705SXin Li     case EXPR_SHUFFLE_VECTOR:
3134*67e74705SXin Li       S = new (Context) ShuffleVectorExpr(Empty);
3135*67e74705SXin Li       break;
3136*67e74705SXin Li 
3137*67e74705SXin Li     case EXPR_CONVERT_VECTOR:
3138*67e74705SXin Li       S = new (Context) ConvertVectorExpr(Empty);
3139*67e74705SXin Li       break;
3140*67e74705SXin Li 
3141*67e74705SXin Li     case EXPR_BLOCK:
3142*67e74705SXin Li       S = new (Context) BlockExpr(Empty);
3143*67e74705SXin Li       break;
3144*67e74705SXin Li 
3145*67e74705SXin Li     case EXPR_GENERIC_SELECTION:
3146*67e74705SXin Li       S = new (Context) GenericSelectionExpr(Empty);
3147*67e74705SXin Li       break;
3148*67e74705SXin Li 
3149*67e74705SXin Li     case EXPR_OBJC_STRING_LITERAL:
3150*67e74705SXin Li       S = new (Context) ObjCStringLiteral(Empty);
3151*67e74705SXin Li       break;
3152*67e74705SXin Li     case EXPR_OBJC_BOXED_EXPRESSION:
3153*67e74705SXin Li       S = new (Context) ObjCBoxedExpr(Empty);
3154*67e74705SXin Li       break;
3155*67e74705SXin Li     case EXPR_OBJC_ARRAY_LITERAL:
3156*67e74705SXin Li       S = ObjCArrayLiteral::CreateEmpty(Context,
3157*67e74705SXin Li                                         Record[ASTStmtReader::NumExprFields]);
3158*67e74705SXin Li       break;
3159*67e74705SXin Li     case EXPR_OBJC_DICTIONARY_LITERAL:
3160*67e74705SXin Li       S = ObjCDictionaryLiteral::CreateEmpty(Context,
3161*67e74705SXin Li             Record[ASTStmtReader::NumExprFields],
3162*67e74705SXin Li             Record[ASTStmtReader::NumExprFields + 1]);
3163*67e74705SXin Li       break;
3164*67e74705SXin Li     case EXPR_OBJC_ENCODE:
3165*67e74705SXin Li       S = new (Context) ObjCEncodeExpr(Empty);
3166*67e74705SXin Li       break;
3167*67e74705SXin Li     case EXPR_OBJC_SELECTOR_EXPR:
3168*67e74705SXin Li       S = new (Context) ObjCSelectorExpr(Empty);
3169*67e74705SXin Li       break;
3170*67e74705SXin Li     case EXPR_OBJC_PROTOCOL_EXPR:
3171*67e74705SXin Li       S = new (Context) ObjCProtocolExpr(Empty);
3172*67e74705SXin Li       break;
3173*67e74705SXin Li     case EXPR_OBJC_IVAR_REF_EXPR:
3174*67e74705SXin Li       S = new (Context) ObjCIvarRefExpr(Empty);
3175*67e74705SXin Li       break;
3176*67e74705SXin Li     case EXPR_OBJC_PROPERTY_REF_EXPR:
3177*67e74705SXin Li       S = new (Context) ObjCPropertyRefExpr(Empty);
3178*67e74705SXin Li       break;
3179*67e74705SXin Li     case EXPR_OBJC_SUBSCRIPT_REF_EXPR:
3180*67e74705SXin Li       S = new (Context) ObjCSubscriptRefExpr(Empty);
3181*67e74705SXin Li       break;
3182*67e74705SXin Li     case EXPR_OBJC_KVC_REF_EXPR:
3183*67e74705SXin Li       llvm_unreachable("mismatching AST file");
3184*67e74705SXin Li     case EXPR_OBJC_MESSAGE_EXPR:
3185*67e74705SXin Li       S = ObjCMessageExpr::CreateEmpty(Context,
3186*67e74705SXin Li                                      Record[ASTStmtReader::NumExprFields],
3187*67e74705SXin Li                                      Record[ASTStmtReader::NumExprFields + 1]);
3188*67e74705SXin Li       break;
3189*67e74705SXin Li     case EXPR_OBJC_ISA:
3190*67e74705SXin Li       S = new (Context) ObjCIsaExpr(Empty);
3191*67e74705SXin Li       break;
3192*67e74705SXin Li     case EXPR_OBJC_INDIRECT_COPY_RESTORE:
3193*67e74705SXin Li       S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);
3194*67e74705SXin Li       break;
3195*67e74705SXin Li     case EXPR_OBJC_BRIDGED_CAST:
3196*67e74705SXin Li       S = new (Context) ObjCBridgedCastExpr(Empty);
3197*67e74705SXin Li       break;
3198*67e74705SXin Li     case STMT_OBJC_FOR_COLLECTION:
3199*67e74705SXin Li       S = new (Context) ObjCForCollectionStmt(Empty);
3200*67e74705SXin Li       break;
3201*67e74705SXin Li     case STMT_OBJC_CATCH:
3202*67e74705SXin Li       S = new (Context) ObjCAtCatchStmt(Empty);
3203*67e74705SXin Li       break;
3204*67e74705SXin Li     case STMT_OBJC_FINALLY:
3205*67e74705SXin Li       S = new (Context) ObjCAtFinallyStmt(Empty);
3206*67e74705SXin Li       break;
3207*67e74705SXin Li     case STMT_OBJC_AT_TRY:
3208*67e74705SXin Li       S = ObjCAtTryStmt::CreateEmpty(Context,
3209*67e74705SXin Li                                      Record[ASTStmtReader::NumStmtFields],
3210*67e74705SXin Li                                      Record[ASTStmtReader::NumStmtFields + 1]);
3211*67e74705SXin Li       break;
3212*67e74705SXin Li     case STMT_OBJC_AT_SYNCHRONIZED:
3213*67e74705SXin Li       S = new (Context) ObjCAtSynchronizedStmt(Empty);
3214*67e74705SXin Li       break;
3215*67e74705SXin Li     case STMT_OBJC_AT_THROW:
3216*67e74705SXin Li       S = new (Context) ObjCAtThrowStmt(Empty);
3217*67e74705SXin Li       break;
3218*67e74705SXin Li     case STMT_OBJC_AUTORELEASE_POOL:
3219*67e74705SXin Li       S = new (Context) ObjCAutoreleasePoolStmt(Empty);
3220*67e74705SXin Li       break;
3221*67e74705SXin Li     case EXPR_OBJC_BOOL_LITERAL:
3222*67e74705SXin Li       S = new (Context) ObjCBoolLiteralExpr(Empty);
3223*67e74705SXin Li       break;
3224*67e74705SXin Li     case STMT_SEH_LEAVE:
3225*67e74705SXin Li       S = new (Context) SEHLeaveStmt(Empty);
3226*67e74705SXin Li       break;
3227*67e74705SXin Li     case STMT_SEH_EXCEPT:
3228*67e74705SXin Li       S = new (Context) SEHExceptStmt(Empty);
3229*67e74705SXin Li       break;
3230*67e74705SXin Li     case STMT_SEH_FINALLY:
3231*67e74705SXin Li       S = new (Context) SEHFinallyStmt(Empty);
3232*67e74705SXin Li       break;
3233*67e74705SXin Li     case STMT_SEH_TRY:
3234*67e74705SXin Li       S = new (Context) SEHTryStmt(Empty);
3235*67e74705SXin Li       break;
3236*67e74705SXin Li     case STMT_CXX_CATCH:
3237*67e74705SXin Li       S = new (Context) CXXCatchStmt(Empty);
3238*67e74705SXin Li       break;
3239*67e74705SXin Li 
3240*67e74705SXin Li     case STMT_CXX_TRY:
3241*67e74705SXin Li       S = CXXTryStmt::Create(Context, Empty,
3242*67e74705SXin Li              /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]);
3243*67e74705SXin Li       break;
3244*67e74705SXin Li 
3245*67e74705SXin Li     case STMT_CXX_FOR_RANGE:
3246*67e74705SXin Li       S = new (Context) CXXForRangeStmt(Empty);
3247*67e74705SXin Li       break;
3248*67e74705SXin Li 
3249*67e74705SXin Li     case STMT_MS_DEPENDENT_EXISTS:
3250*67e74705SXin Li       S = new (Context) MSDependentExistsStmt(SourceLocation(), true,
3251*67e74705SXin Li                                               NestedNameSpecifierLoc(),
3252*67e74705SXin Li                                               DeclarationNameInfo(),
3253*67e74705SXin Li                                               nullptr);
3254*67e74705SXin Li       break;
3255*67e74705SXin Li 
3256*67e74705SXin Li     case STMT_OMP_PARALLEL_DIRECTIVE:
3257*67e74705SXin Li       S =
3258*67e74705SXin Li         OMPParallelDirective::CreateEmpty(Context,
3259*67e74705SXin Li                                           Record[ASTStmtReader::NumStmtFields],
3260*67e74705SXin Li                                           Empty);
3261*67e74705SXin Li       break;
3262*67e74705SXin Li 
3263*67e74705SXin Li     case STMT_OMP_SIMD_DIRECTIVE: {
3264*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3265*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3266*67e74705SXin Li       S = OMPSimdDirective::CreateEmpty(Context, NumClauses,
3267*67e74705SXin Li                                         CollapsedNum, Empty);
3268*67e74705SXin Li       break;
3269*67e74705SXin Li     }
3270*67e74705SXin Li 
3271*67e74705SXin Li     case STMT_OMP_FOR_DIRECTIVE: {
3272*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3273*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3274*67e74705SXin Li       S = OMPForDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3275*67e74705SXin Li                                        Empty);
3276*67e74705SXin Li       break;
3277*67e74705SXin Li     }
3278*67e74705SXin Li 
3279*67e74705SXin Li     case STMT_OMP_FOR_SIMD_DIRECTIVE: {
3280*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3281*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3282*67e74705SXin Li       S = OMPForSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3283*67e74705SXin Li                                            Empty);
3284*67e74705SXin Li       break;
3285*67e74705SXin Li     }
3286*67e74705SXin Li 
3287*67e74705SXin Li     case STMT_OMP_SECTIONS_DIRECTIVE:
3288*67e74705SXin Li       S = OMPSectionsDirective::CreateEmpty(
3289*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3290*67e74705SXin Li       break;
3291*67e74705SXin Li 
3292*67e74705SXin Li     case STMT_OMP_SECTION_DIRECTIVE:
3293*67e74705SXin Li       S = OMPSectionDirective::CreateEmpty(Context, Empty);
3294*67e74705SXin Li       break;
3295*67e74705SXin Li 
3296*67e74705SXin Li     case STMT_OMP_SINGLE_DIRECTIVE:
3297*67e74705SXin Li       S = OMPSingleDirective::CreateEmpty(
3298*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3299*67e74705SXin Li       break;
3300*67e74705SXin Li 
3301*67e74705SXin Li     case STMT_OMP_MASTER_DIRECTIVE:
3302*67e74705SXin Li       S = OMPMasterDirective::CreateEmpty(Context, Empty);
3303*67e74705SXin Li       break;
3304*67e74705SXin Li 
3305*67e74705SXin Li     case STMT_OMP_CRITICAL_DIRECTIVE:
3306*67e74705SXin Li       S = OMPCriticalDirective::CreateEmpty(
3307*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3308*67e74705SXin Li       break;
3309*67e74705SXin Li 
3310*67e74705SXin Li     case STMT_OMP_PARALLEL_FOR_DIRECTIVE: {
3311*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3312*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3313*67e74705SXin Li       S = OMPParallelForDirective::CreateEmpty(Context, NumClauses,
3314*67e74705SXin Li                                                CollapsedNum, Empty);
3315*67e74705SXin Li       break;
3316*67e74705SXin Li     }
3317*67e74705SXin Li 
3318*67e74705SXin Li     case STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE: {
3319*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3320*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3321*67e74705SXin Li       S = OMPParallelForSimdDirective::CreateEmpty(Context, NumClauses,
3322*67e74705SXin Li                                                    CollapsedNum, Empty);
3323*67e74705SXin Li       break;
3324*67e74705SXin Li     }
3325*67e74705SXin Li 
3326*67e74705SXin Li     case STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE:
3327*67e74705SXin Li       S = OMPParallelSectionsDirective::CreateEmpty(
3328*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3329*67e74705SXin Li       break;
3330*67e74705SXin Li 
3331*67e74705SXin Li     case STMT_OMP_TASK_DIRECTIVE:
3332*67e74705SXin Li       S = OMPTaskDirective::CreateEmpty(
3333*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3334*67e74705SXin Li       break;
3335*67e74705SXin Li 
3336*67e74705SXin Li     case STMT_OMP_TASKYIELD_DIRECTIVE:
3337*67e74705SXin Li       S = OMPTaskyieldDirective::CreateEmpty(Context, Empty);
3338*67e74705SXin Li       break;
3339*67e74705SXin Li 
3340*67e74705SXin Li     case STMT_OMP_BARRIER_DIRECTIVE:
3341*67e74705SXin Li       S = OMPBarrierDirective::CreateEmpty(Context, Empty);
3342*67e74705SXin Li       break;
3343*67e74705SXin Li 
3344*67e74705SXin Li     case STMT_OMP_TASKWAIT_DIRECTIVE:
3345*67e74705SXin Li       S = OMPTaskwaitDirective::CreateEmpty(Context, Empty);
3346*67e74705SXin Li       break;
3347*67e74705SXin Li 
3348*67e74705SXin Li     case STMT_OMP_TASKGROUP_DIRECTIVE:
3349*67e74705SXin Li       S = OMPTaskgroupDirective::CreateEmpty(Context, Empty);
3350*67e74705SXin Li       break;
3351*67e74705SXin Li 
3352*67e74705SXin Li     case STMT_OMP_FLUSH_DIRECTIVE:
3353*67e74705SXin Li       S = OMPFlushDirective::CreateEmpty(
3354*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3355*67e74705SXin Li       break;
3356*67e74705SXin Li 
3357*67e74705SXin Li     case STMT_OMP_ORDERED_DIRECTIVE:
3358*67e74705SXin Li       S = OMPOrderedDirective::CreateEmpty(
3359*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3360*67e74705SXin Li       break;
3361*67e74705SXin Li 
3362*67e74705SXin Li     case STMT_OMP_ATOMIC_DIRECTIVE:
3363*67e74705SXin Li       S = OMPAtomicDirective::CreateEmpty(
3364*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3365*67e74705SXin Li       break;
3366*67e74705SXin Li 
3367*67e74705SXin Li     case STMT_OMP_TARGET_DIRECTIVE:
3368*67e74705SXin Li       S = OMPTargetDirective::CreateEmpty(
3369*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3370*67e74705SXin Li       break;
3371*67e74705SXin Li 
3372*67e74705SXin Li     case STMT_OMP_TARGET_DATA_DIRECTIVE:
3373*67e74705SXin Li       S = OMPTargetDataDirective::CreateEmpty(
3374*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3375*67e74705SXin Li       break;
3376*67e74705SXin Li 
3377*67e74705SXin Li     case STMT_OMP_TARGET_ENTER_DATA_DIRECTIVE:
3378*67e74705SXin Li       S = OMPTargetEnterDataDirective::CreateEmpty(
3379*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3380*67e74705SXin Li       break;
3381*67e74705SXin Li 
3382*67e74705SXin Li     case STMT_OMP_TARGET_EXIT_DATA_DIRECTIVE:
3383*67e74705SXin Li       S = OMPTargetExitDataDirective::CreateEmpty(
3384*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3385*67e74705SXin Li       break;
3386*67e74705SXin Li 
3387*67e74705SXin Li     case STMT_OMP_TARGET_PARALLEL_DIRECTIVE:
3388*67e74705SXin Li       S = OMPTargetParallelDirective::CreateEmpty(
3389*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3390*67e74705SXin Li       break;
3391*67e74705SXin Li 
3392*67e74705SXin Li     case STMT_OMP_TARGET_PARALLEL_FOR_DIRECTIVE: {
3393*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3394*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3395*67e74705SXin Li       S = OMPTargetParallelForDirective::CreateEmpty(Context, NumClauses,
3396*67e74705SXin Li                                                      CollapsedNum, Empty);
3397*67e74705SXin Li       break;
3398*67e74705SXin Li     }
3399*67e74705SXin Li 
3400*67e74705SXin Li     case STMT_OMP_TARGET_UPDATE_DIRECTIVE:
3401*67e74705SXin Li       S = OMPTargetUpdateDirective::CreateEmpty(
3402*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3403*67e74705SXin Li       break;
3404*67e74705SXin Li 
3405*67e74705SXin Li     case STMT_OMP_TEAMS_DIRECTIVE:
3406*67e74705SXin Li       S = OMPTeamsDirective::CreateEmpty(
3407*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3408*67e74705SXin Li       break;
3409*67e74705SXin Li 
3410*67e74705SXin Li     case STMT_OMP_CANCELLATION_POINT_DIRECTIVE:
3411*67e74705SXin Li       S = OMPCancellationPointDirective::CreateEmpty(Context, Empty);
3412*67e74705SXin Li       break;
3413*67e74705SXin Li 
3414*67e74705SXin Li     case STMT_OMP_CANCEL_DIRECTIVE:
3415*67e74705SXin Li       S = OMPCancelDirective::CreateEmpty(
3416*67e74705SXin Li           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3417*67e74705SXin Li       break;
3418*67e74705SXin Li 
3419*67e74705SXin Li     case STMT_OMP_TASKLOOP_DIRECTIVE: {
3420*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3421*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3422*67e74705SXin Li       S = OMPTaskLoopDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3423*67e74705SXin Li                                             Empty);
3424*67e74705SXin Li       break;
3425*67e74705SXin Li     }
3426*67e74705SXin Li 
3427*67e74705SXin Li     case STMT_OMP_TASKLOOP_SIMD_DIRECTIVE: {
3428*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3429*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3430*67e74705SXin Li       S = OMPTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,
3431*67e74705SXin Li                                                 CollapsedNum, Empty);
3432*67e74705SXin Li       break;
3433*67e74705SXin Li     }
3434*67e74705SXin Li 
3435*67e74705SXin Li     case STMT_OMP_DISTRIBUTE_DIRECTIVE: {
3436*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3437*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3438*67e74705SXin Li       S = OMPDistributeDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3439*67e74705SXin Li                                               Empty);
3440*67e74705SXin Li       break;
3441*67e74705SXin Li     }
3442*67e74705SXin Li 
3443*67e74705SXin Li     case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: {
3444*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3445*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3446*67e74705SXin Li       S = OMPDistributeParallelForDirective::CreateEmpty(Context, NumClauses,
3447*67e74705SXin Li                                                          CollapsedNum, Empty);
3448*67e74705SXin Li       break;
3449*67e74705SXin Li     }
3450*67e74705SXin Li 
3451*67e74705SXin Li     case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: {
3452*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3453*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3454*67e74705SXin Li       S = OMPDistributeParallelForSimdDirective::CreateEmpty(Context, NumClauses,
3455*67e74705SXin Li                                                              CollapsedNum,
3456*67e74705SXin Li                                                              Empty);
3457*67e74705SXin Li       break;
3458*67e74705SXin Li     }
3459*67e74705SXin Li 
3460*67e74705SXin Li     case STMT_OMP_DISTRIBUTE_SIMD_DIRECTIVE: {
3461*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3462*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3463*67e74705SXin Li       S = OMPDistributeSimdDirective::CreateEmpty(Context, NumClauses,
3464*67e74705SXin Li                                                   CollapsedNum, Empty);
3465*67e74705SXin Li       break;
3466*67e74705SXin Li     }
3467*67e74705SXin Li 
3468*67e74705SXin Li     case STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE: {
3469*67e74705SXin Li       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3470*67e74705SXin Li       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3471*67e74705SXin Li       S = OMPTargetParallelForSimdDirective::CreateEmpty(Context, NumClauses,
3472*67e74705SXin Li                                                          CollapsedNum, Empty);
3473*67e74705SXin Li       break;
3474*67e74705SXin Li     }
3475*67e74705SXin Li 
3476*67e74705SXin Li     case EXPR_CXX_OPERATOR_CALL:
3477*67e74705SXin Li       S = new (Context) CXXOperatorCallExpr(Context, Empty);
3478*67e74705SXin Li       break;
3479*67e74705SXin Li 
3480*67e74705SXin Li     case EXPR_CXX_MEMBER_CALL:
3481*67e74705SXin Li       S = new (Context) CXXMemberCallExpr(Context, Empty);
3482*67e74705SXin Li       break;
3483*67e74705SXin Li 
3484*67e74705SXin Li     case EXPR_CXX_CONSTRUCT:
3485*67e74705SXin Li       S = new (Context) CXXConstructExpr(Empty);
3486*67e74705SXin Li       break;
3487*67e74705SXin Li 
3488*67e74705SXin Li     case EXPR_CXX_INHERITED_CTOR_INIT:
3489*67e74705SXin Li       S = new (Context) CXXInheritedCtorInitExpr(Empty);
3490*67e74705SXin Li       break;
3491*67e74705SXin Li 
3492*67e74705SXin Li     case EXPR_CXX_TEMPORARY_OBJECT:
3493*67e74705SXin Li       S = new (Context) CXXTemporaryObjectExpr(Empty);
3494*67e74705SXin Li       break;
3495*67e74705SXin Li 
3496*67e74705SXin Li     case EXPR_CXX_STATIC_CAST:
3497*67e74705SXin Li       S = CXXStaticCastExpr::CreateEmpty(Context,
3498*67e74705SXin Li                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
3499*67e74705SXin Li       break;
3500*67e74705SXin Li 
3501*67e74705SXin Li     case EXPR_CXX_DYNAMIC_CAST:
3502*67e74705SXin Li       S = CXXDynamicCastExpr::CreateEmpty(Context,
3503*67e74705SXin Li                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
3504*67e74705SXin Li       break;
3505*67e74705SXin Li 
3506*67e74705SXin Li     case EXPR_CXX_REINTERPRET_CAST:
3507*67e74705SXin Li       S = CXXReinterpretCastExpr::CreateEmpty(Context,
3508*67e74705SXin Li                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
3509*67e74705SXin Li       break;
3510*67e74705SXin Li 
3511*67e74705SXin Li     case EXPR_CXX_CONST_CAST:
3512*67e74705SXin Li       S = CXXConstCastExpr::CreateEmpty(Context);
3513*67e74705SXin Li       break;
3514*67e74705SXin Li 
3515*67e74705SXin Li     case EXPR_CXX_FUNCTIONAL_CAST:
3516*67e74705SXin Li       S = CXXFunctionalCastExpr::CreateEmpty(Context,
3517*67e74705SXin Li                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
3518*67e74705SXin Li       break;
3519*67e74705SXin Li 
3520*67e74705SXin Li     case EXPR_USER_DEFINED_LITERAL:
3521*67e74705SXin Li       S = new (Context) UserDefinedLiteral(Context, Empty);
3522*67e74705SXin Li       break;
3523*67e74705SXin Li 
3524*67e74705SXin Li     case EXPR_CXX_STD_INITIALIZER_LIST:
3525*67e74705SXin Li       S = new (Context) CXXStdInitializerListExpr(Empty);
3526*67e74705SXin Li       break;
3527*67e74705SXin Li 
3528*67e74705SXin Li     case EXPR_CXX_BOOL_LITERAL:
3529*67e74705SXin Li       S = new (Context) CXXBoolLiteralExpr(Empty);
3530*67e74705SXin Li       break;
3531*67e74705SXin Li 
3532*67e74705SXin Li     case EXPR_CXX_NULL_PTR_LITERAL:
3533*67e74705SXin Li       S = new (Context) CXXNullPtrLiteralExpr(Empty);
3534*67e74705SXin Li       break;
3535*67e74705SXin Li     case EXPR_CXX_TYPEID_EXPR:
3536*67e74705SXin Li       S = new (Context) CXXTypeidExpr(Empty, true);
3537*67e74705SXin Li       break;
3538*67e74705SXin Li     case EXPR_CXX_TYPEID_TYPE:
3539*67e74705SXin Li       S = new (Context) CXXTypeidExpr(Empty, false);
3540*67e74705SXin Li       break;
3541*67e74705SXin Li     case EXPR_CXX_UUIDOF_EXPR:
3542*67e74705SXin Li       S = new (Context) CXXUuidofExpr(Empty, true);
3543*67e74705SXin Li       break;
3544*67e74705SXin Li     case EXPR_CXX_PROPERTY_REF_EXPR:
3545*67e74705SXin Li       S = new (Context) MSPropertyRefExpr(Empty);
3546*67e74705SXin Li       break;
3547*67e74705SXin Li     case EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR:
3548*67e74705SXin Li       S = new (Context) MSPropertySubscriptExpr(Empty);
3549*67e74705SXin Li       break;
3550*67e74705SXin Li     case EXPR_CXX_UUIDOF_TYPE:
3551*67e74705SXin Li       S = new (Context) CXXUuidofExpr(Empty, false);
3552*67e74705SXin Li       break;
3553*67e74705SXin Li     case EXPR_CXX_THIS:
3554*67e74705SXin Li       S = new (Context) CXXThisExpr(Empty);
3555*67e74705SXin Li       break;
3556*67e74705SXin Li     case EXPR_CXX_THROW:
3557*67e74705SXin Li       S = new (Context) CXXThrowExpr(Empty);
3558*67e74705SXin Li       break;
3559*67e74705SXin Li     case EXPR_CXX_DEFAULT_ARG:
3560*67e74705SXin Li       S = new (Context) CXXDefaultArgExpr(Empty);
3561*67e74705SXin Li       break;
3562*67e74705SXin Li     case EXPR_CXX_DEFAULT_INIT:
3563*67e74705SXin Li       S = new (Context) CXXDefaultInitExpr(Empty);
3564*67e74705SXin Li       break;
3565*67e74705SXin Li     case EXPR_CXX_BIND_TEMPORARY:
3566*67e74705SXin Li       S = new (Context) CXXBindTemporaryExpr(Empty);
3567*67e74705SXin Li       break;
3568*67e74705SXin Li 
3569*67e74705SXin Li     case EXPR_CXX_SCALAR_VALUE_INIT:
3570*67e74705SXin Li       S = new (Context) CXXScalarValueInitExpr(Empty);
3571*67e74705SXin Li       break;
3572*67e74705SXin Li     case EXPR_CXX_NEW:
3573*67e74705SXin Li       S = new (Context) CXXNewExpr(Empty);
3574*67e74705SXin Li       break;
3575*67e74705SXin Li     case EXPR_CXX_DELETE:
3576*67e74705SXin Li       S = new (Context) CXXDeleteExpr(Empty);
3577*67e74705SXin Li       break;
3578*67e74705SXin Li     case EXPR_CXX_PSEUDO_DESTRUCTOR:
3579*67e74705SXin Li       S = new (Context) CXXPseudoDestructorExpr(Empty);
3580*67e74705SXin Li       break;
3581*67e74705SXin Li 
3582*67e74705SXin Li     case EXPR_EXPR_WITH_CLEANUPS:
3583*67e74705SXin Li       S = ExprWithCleanups::Create(Context, Empty,
3584*67e74705SXin Li                                    Record[ASTStmtReader::NumExprFields]);
3585*67e74705SXin Li       break;
3586*67e74705SXin Li 
3587*67e74705SXin Li     case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
3588*67e74705SXin Li       S = CXXDependentScopeMemberExpr::CreateEmpty(Context,
3589*67e74705SXin Li          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
3590*67e74705SXin Li                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
3591*67e74705SXin Li                                    ? Record[ASTStmtReader::NumExprFields + 1]
3592*67e74705SXin Li                                    : 0);
3593*67e74705SXin Li       break;
3594*67e74705SXin Li 
3595*67e74705SXin Li     case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
3596*67e74705SXin Li       S = DependentScopeDeclRefExpr::CreateEmpty(Context,
3597*67e74705SXin Li          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
3598*67e74705SXin Li                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
3599*67e74705SXin Li                                    ? Record[ASTStmtReader::NumExprFields + 1]
3600*67e74705SXin Li                                    : 0);
3601*67e74705SXin Li       break;
3602*67e74705SXin Li 
3603*67e74705SXin Li     case EXPR_CXX_UNRESOLVED_CONSTRUCT:
3604*67e74705SXin Li       S = CXXUnresolvedConstructExpr::CreateEmpty(Context,
3605*67e74705SXin Li                               /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
3606*67e74705SXin Li       break;
3607*67e74705SXin Li 
3608*67e74705SXin Li     case EXPR_CXX_UNRESOLVED_MEMBER:
3609*67e74705SXin Li       S = UnresolvedMemberExpr::CreateEmpty(Context,
3610*67e74705SXin Li          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
3611*67e74705SXin Li                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
3612*67e74705SXin Li                                    ? Record[ASTStmtReader::NumExprFields + 1]
3613*67e74705SXin Li                                    : 0);
3614*67e74705SXin Li       break;
3615*67e74705SXin Li 
3616*67e74705SXin Li     case EXPR_CXX_UNRESOLVED_LOOKUP:
3617*67e74705SXin Li       S = UnresolvedLookupExpr::CreateEmpty(Context,
3618*67e74705SXin Li          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
3619*67e74705SXin Li                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
3620*67e74705SXin Li                                    ? Record[ASTStmtReader::NumExprFields + 1]
3621*67e74705SXin Li                                    : 0);
3622*67e74705SXin Li       break;
3623*67e74705SXin Li 
3624*67e74705SXin Li     case EXPR_TYPE_TRAIT:
3625*67e74705SXin Li       S = TypeTraitExpr::CreateDeserialized(Context,
3626*67e74705SXin Li             Record[ASTStmtReader::NumExprFields]);
3627*67e74705SXin Li       break;
3628*67e74705SXin Li 
3629*67e74705SXin Li     case EXPR_ARRAY_TYPE_TRAIT:
3630*67e74705SXin Li       S = new (Context) ArrayTypeTraitExpr(Empty);
3631*67e74705SXin Li       break;
3632*67e74705SXin Li 
3633*67e74705SXin Li     case EXPR_CXX_EXPRESSION_TRAIT:
3634*67e74705SXin Li       S = new (Context) ExpressionTraitExpr(Empty);
3635*67e74705SXin Li       break;
3636*67e74705SXin Li 
3637*67e74705SXin Li     case EXPR_CXX_NOEXCEPT:
3638*67e74705SXin Li       S = new (Context) CXXNoexceptExpr(Empty);
3639*67e74705SXin Li       break;
3640*67e74705SXin Li 
3641*67e74705SXin Li     case EXPR_PACK_EXPANSION:
3642*67e74705SXin Li       S = new (Context) PackExpansionExpr(Empty);
3643*67e74705SXin Li       break;
3644*67e74705SXin Li 
3645*67e74705SXin Li     case EXPR_SIZEOF_PACK:
3646*67e74705SXin Li       S = SizeOfPackExpr::CreateDeserialized(
3647*67e74705SXin Li               Context,
3648*67e74705SXin Li               /*NumPartialArgs=*/Record[ASTStmtReader::NumExprFields]);
3649*67e74705SXin Li       break;
3650*67e74705SXin Li 
3651*67e74705SXin Li     case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:
3652*67e74705SXin Li       S = new (Context) SubstNonTypeTemplateParmExpr(Empty);
3653*67e74705SXin Li       break;
3654*67e74705SXin Li 
3655*67e74705SXin Li     case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:
3656*67e74705SXin Li       S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);
3657*67e74705SXin Li       break;
3658*67e74705SXin Li 
3659*67e74705SXin Li     case EXPR_FUNCTION_PARM_PACK:
3660*67e74705SXin Li       S = FunctionParmPackExpr::CreateEmpty(Context,
3661*67e74705SXin Li                                           Record[ASTStmtReader::NumExprFields]);
3662*67e74705SXin Li       break;
3663*67e74705SXin Li 
3664*67e74705SXin Li     case EXPR_MATERIALIZE_TEMPORARY:
3665*67e74705SXin Li       S = new (Context) MaterializeTemporaryExpr(Empty);
3666*67e74705SXin Li       break;
3667*67e74705SXin Li 
3668*67e74705SXin Li     case EXPR_CXX_FOLD:
3669*67e74705SXin Li       S = new (Context) CXXFoldExpr(Empty);
3670*67e74705SXin Li       break;
3671*67e74705SXin Li 
3672*67e74705SXin Li     case EXPR_OPAQUE_VALUE:
3673*67e74705SXin Li       S = new (Context) OpaqueValueExpr(Empty);
3674*67e74705SXin Li       break;
3675*67e74705SXin Li 
3676*67e74705SXin Li     case EXPR_CUDA_KERNEL_CALL:
3677*67e74705SXin Li       S = new (Context) CUDAKernelCallExpr(Context, Empty);
3678*67e74705SXin Li       break;
3679*67e74705SXin Li 
3680*67e74705SXin Li     case EXPR_ASTYPE:
3681*67e74705SXin Li       S = new (Context) AsTypeExpr(Empty);
3682*67e74705SXin Li       break;
3683*67e74705SXin Li 
3684*67e74705SXin Li     case EXPR_PSEUDO_OBJECT: {
3685*67e74705SXin Li       unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields];
3686*67e74705SXin Li       S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs);
3687*67e74705SXin Li       break;
3688*67e74705SXin Li     }
3689*67e74705SXin Li 
3690*67e74705SXin Li     case EXPR_ATOMIC:
3691*67e74705SXin Li       S = new (Context) AtomicExpr(Empty);
3692*67e74705SXin Li       break;
3693*67e74705SXin Li 
3694*67e74705SXin Li     case EXPR_LAMBDA: {
3695*67e74705SXin Li       unsigned NumCaptures = Record[ASTStmtReader::NumExprFields];
3696*67e74705SXin Li       unsigned NumArrayIndexVars = Record[ASTStmtReader::NumExprFields + 1];
3697*67e74705SXin Li       S = LambdaExpr::CreateDeserialized(Context, NumCaptures,
3698*67e74705SXin Li                                          NumArrayIndexVars);
3699*67e74705SXin Li       break;
3700*67e74705SXin Li     }
3701*67e74705SXin Li     }
3702*67e74705SXin Li 
3703*67e74705SXin Li     // We hit a STMT_STOP, so we're done with this expression.
3704*67e74705SXin Li     if (Finished)
3705*67e74705SXin Li       break;
3706*67e74705SXin Li 
3707*67e74705SXin Li     ++NumStatementsRead;
3708*67e74705SXin Li 
3709*67e74705SXin Li     if (S && !IsStmtReference) {
3710*67e74705SXin Li       Reader.Visit(S);
3711*67e74705SXin Li       StmtEntries[Cursor.GetCurrentBitNo()] = S;
3712*67e74705SXin Li     }
3713*67e74705SXin Li 
3714*67e74705SXin Li 
3715*67e74705SXin Li     assert(Idx == Record.size() && "Invalid deserialization of statement");
3716*67e74705SXin Li     StmtStack.push_back(S);
3717*67e74705SXin Li   }
3718*67e74705SXin Li Done:
3719*67e74705SXin Li   assert(StmtStack.size() > PrevNumStmts && "Read too many sub-stmts!");
3720*67e74705SXin Li   assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
3721*67e74705SXin Li   return StmtStack.pop_back_val();
3722*67e74705SXin Li }
3723