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