blob: f6313633f520ce44a8f7d6862415ef179e22460f [file] [log] [blame]
Chris Lattner4c6f9522009-04-27 05:14:47 +00001//===--- PCHReaderStmt.cpp - Stmt/Expr Deserialization ----------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Statement/expression deserialization. This implements the
11// PCHReader::ReadStmt method.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Frontend/PCHReader.h"
Douglas Gregor39da0b82009-09-09 23:08:42 +000016#include "clang/AST/DeclCXX.h"
Chris Lattner4c6f9522009-04-27 05:14:47 +000017#include "clang/AST/StmtVisitor.h"
18using namespace clang;
19
Argyrios Kyrtzidis37bdfe22010-06-30 08:49:18 +000020namespace clang {
Argyrios Kyrtzidis17cfded2010-06-28 09:31:42 +000021
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +000022 class PCHStmtReader : public StmtVisitor<PCHStmtReader> {
Chris Lattner4c6f9522009-04-27 05:14:47 +000023 PCHReader &Reader;
24 const PCHReader::RecordData &Record;
25 unsigned &Idx;
Chris Lattner4c6f9522009-04-27 05:14:47 +000026
27 public:
28 PCHStmtReader(PCHReader &Reader, const PCHReader::RecordData &Record,
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +000029 unsigned &Idx)
30 : Reader(Reader), Record(Record), Idx(Idx) { }
Chris Lattner4c6f9522009-04-27 05:14:47 +000031
32 /// \brief The number of record fields required for the Stmt class
33 /// itself.
34 static const unsigned NumStmtFields = 0;
35
36 /// \brief The number of record fields required for the Expr class
37 /// itself.
38 static const unsigned NumExprFields = NumStmtFields + 3;
Argyrios Kyrtzidis36c76f02010-06-28 09:31:48 +000039
40 /// \brief Read and initialize a ExplicitTemplateArgumentList structure.
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +000041 void ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
42 unsigned NumTemplateArgs);
Chris Lattner4c6f9522009-04-27 05:14:47 +000043
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +000044 void VisitStmt(Stmt *S);
45 void VisitNullStmt(NullStmt *S);
46 void VisitCompoundStmt(CompoundStmt *S);
47 void VisitSwitchCase(SwitchCase *S);
48 void VisitCaseStmt(CaseStmt *S);
49 void VisitDefaultStmt(DefaultStmt *S);
50 void VisitLabelStmt(LabelStmt *S);
51 void VisitIfStmt(IfStmt *S);
52 void VisitSwitchStmt(SwitchStmt *S);
53 void VisitWhileStmt(WhileStmt *S);
54 void VisitDoStmt(DoStmt *S);
55 void VisitForStmt(ForStmt *S);
56 void VisitGotoStmt(GotoStmt *S);
57 void VisitIndirectGotoStmt(IndirectGotoStmt *S);
58 void VisitContinueStmt(ContinueStmt *S);
59 void VisitBreakStmt(BreakStmt *S);
60 void VisitReturnStmt(ReturnStmt *S);
61 void VisitDeclStmt(DeclStmt *S);
62 void VisitAsmStmt(AsmStmt *S);
63 void VisitExpr(Expr *E);
64 void VisitPredefinedExpr(PredefinedExpr *E);
65 void VisitDeclRefExpr(DeclRefExpr *E);
66 void VisitIntegerLiteral(IntegerLiteral *E);
67 void VisitFloatingLiteral(FloatingLiteral *E);
68 void VisitImaginaryLiteral(ImaginaryLiteral *E);
69 void VisitStringLiteral(StringLiteral *E);
70 void VisitCharacterLiteral(CharacterLiteral *E);
71 void VisitParenExpr(ParenExpr *E);
Argyrios Kyrtzidis37bdfe22010-06-30 08:49:18 +000072 void VisitParenListExpr(ParenListExpr *E);
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +000073 void VisitUnaryOperator(UnaryOperator *E);
74 void VisitOffsetOfExpr(OffsetOfExpr *E);
75 void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
76 void VisitArraySubscriptExpr(ArraySubscriptExpr *E);
77 void VisitCallExpr(CallExpr *E);
78 void VisitMemberExpr(MemberExpr *E);
79 void VisitCastExpr(CastExpr *E);
80 void VisitBinaryOperator(BinaryOperator *E);
81 void VisitCompoundAssignOperator(CompoundAssignOperator *E);
82 void VisitConditionalOperator(ConditionalOperator *E);
83 void VisitImplicitCastExpr(ImplicitCastExpr *E);
84 void VisitExplicitCastExpr(ExplicitCastExpr *E);
85 void VisitCStyleCastExpr(CStyleCastExpr *E);
86 void VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
87 void VisitExtVectorElementExpr(ExtVectorElementExpr *E);
88 void VisitInitListExpr(InitListExpr *E);
89 void VisitDesignatedInitExpr(DesignatedInitExpr *E);
90 void VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
91 void VisitVAArgExpr(VAArgExpr *E);
92 void VisitAddrLabelExpr(AddrLabelExpr *E);
93 void VisitStmtExpr(StmtExpr *E);
94 void VisitTypesCompatibleExpr(TypesCompatibleExpr *E);
95 void VisitChooseExpr(ChooseExpr *E);
96 void VisitGNUNullExpr(GNUNullExpr *E);
97 void VisitShuffleVectorExpr(ShuffleVectorExpr *E);
98 void VisitBlockExpr(BlockExpr *E);
99 void VisitBlockDeclRefExpr(BlockDeclRefExpr *E);
100 void VisitObjCStringLiteral(ObjCStringLiteral *E);
101 void VisitObjCEncodeExpr(ObjCEncodeExpr *E);
102 void VisitObjCSelectorExpr(ObjCSelectorExpr *E);
103 void VisitObjCProtocolExpr(ObjCProtocolExpr *E);
104 void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E);
105 void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E);
106 void VisitObjCImplicitSetterGetterRefExpr(
Fariborz Jahanian09105f52009-08-20 17:02:02 +0000107 ObjCImplicitSetterGetterRefExpr *E);
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000108 void VisitObjCMessageExpr(ObjCMessageExpr *E);
109 void VisitObjCSuperExpr(ObjCSuperExpr *E);
110 void VisitObjCIsaExpr(ObjCIsaExpr *E);
Mike Stump1eb44332009-09-09 15:08:12 +0000111
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000112 void VisitObjCForCollectionStmt(ObjCForCollectionStmt *);
113 void VisitObjCAtCatchStmt(ObjCAtCatchStmt *);
114 void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *);
115 void VisitObjCAtTryStmt(ObjCAtTryStmt *);
116 void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *);
117 void VisitObjCAtThrowStmt(ObjCAtThrowStmt *);
Argyrios Kyrtzidisba0a9002009-07-14 03:19:21 +0000118
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000119 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
120 void VisitCXXConstructExpr(CXXConstructExpr *E);
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +0000121 void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000122 void VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
123 void VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
124 void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
125 void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
126 void VisitCXXConstCastExpr(CXXConstCastExpr *E);
127 void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
128 void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
129 void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
130 void VisitCXXTypeidExpr(CXXTypeidExpr *E);
131 void VisitCXXThisExpr(CXXThisExpr *E);
132 void VisitCXXThrowExpr(CXXThrowExpr *E);
133 void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
134 void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +0000135 void VisitCXXBindReferenceExpr(CXXBindReferenceExpr *E);
Chris Lattnerd2598362010-05-10 00:25:06 +0000136
Douglas Gregored8abf12010-07-08 06:14:04 +0000137 void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000138 void VisitCXXNewExpr(CXXNewExpr *E);
139 void VisitCXXDeleteExpr(CXXDeleteExpr *E);
140 void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
Chris Lattner59218632010-05-10 01:22:27 +0000141
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000142 void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +0000143
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000144 void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
145 void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
146 void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +0000147
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000148 void VisitOverloadExpr(OverloadExpr *E);
149 void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
150 void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +0000151
152 void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000153 };
154}
155
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000156void PCHStmtReader::
Argyrios Kyrtzidis36c76f02010-06-28 09:31:48 +0000157ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000158 unsigned NumTemplateArgs) {
Argyrios Kyrtzidis36c76f02010-06-28 09:31:48 +0000159 TemplateArgumentListInfo ArgInfo;
160 ArgInfo.setLAngleLoc(Reader.ReadSourceLocation(Record, Idx));
161 ArgInfo.setRAngleLoc(Reader.ReadSourceLocation(Record, Idx));
Argyrios Kyrtzidis36c76f02010-06-28 09:31:48 +0000162 for (unsigned i = 0; i != NumTemplateArgs; ++i)
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000163 ArgInfo.addArgument(Reader.ReadTemplateArgumentLoc(Record, Idx));
Argyrios Kyrtzidis36c76f02010-06-28 09:31:48 +0000164 ArgList.initializeFrom(ArgInfo);
Argyrios Kyrtzidis36c76f02010-06-28 09:31:48 +0000165}
166
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000167void PCHStmtReader::VisitStmt(Stmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000168 assert(Idx == NumStmtFields && "Incorrect statement field count");
Chris Lattner4c6f9522009-04-27 05:14:47 +0000169}
170
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000171void PCHStmtReader::VisitNullStmt(NullStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000172 VisitStmt(S);
173 S->setSemiLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000174}
175
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000176void PCHStmtReader::VisitCompoundStmt(CompoundStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000177 VisitStmt(S);
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000178 llvm::SmallVector<Stmt *, 16> Stmts;
Chris Lattner4c6f9522009-04-27 05:14:47 +0000179 unsigned NumStmts = Record[Idx++];
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000180 while (NumStmts--)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000181 Stmts.push_back(Reader.ReadSubStmt());
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000182 S->setStmts(*Reader.getContext(), Stmts.data(), Stmts.size());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000183 S->setLBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
184 S->setRBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000185}
186
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000187void PCHStmtReader::VisitSwitchCase(SwitchCase *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000188 VisitStmt(S);
189 Reader.RecordSwitchCaseID(S, Record[Idx++]);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000190}
191
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000192void PCHStmtReader::VisitCaseStmt(CaseStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000193 VisitSwitchCase(S);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000194 S->setLHS(Reader.ReadSubExpr());
195 S->setRHS(Reader.ReadSubExpr());
196 S->setSubStmt(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000197 S->setCaseLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Douglas Gregordbb26db2009-05-15 23:57:33 +0000198 S->setEllipsisLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
199 S->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000200}
201
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000202void PCHStmtReader::VisitDefaultStmt(DefaultStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000203 VisitSwitchCase(S);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000204 S->setSubStmt(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000205 S->setDefaultLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Douglas Gregordbb26db2009-05-15 23:57:33 +0000206 S->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000207}
208
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000209void PCHStmtReader::VisitLabelStmt(LabelStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000210 VisitStmt(S);
211 S->setID(Reader.GetIdentifierInfo(Record, Idx));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000212 S->setSubStmt(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000213 S->setIdentLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
214 Reader.RecordLabelStmt(S, Record[Idx++]);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000215}
216
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000217void PCHStmtReader::VisitIfStmt(IfStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000218 VisitStmt(S);
Douglas Gregor43dec6b2010-06-21 23:44:13 +0000219 S->setConditionVariable(*Reader.getContext(),
220 cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000221 S->setCond(Reader.ReadSubExpr());
222 S->setThen(Reader.ReadSubStmt());
223 S->setElse(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000224 S->setIfLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Douglas Gregord06f6ca2009-05-15 18:53:42 +0000225 S->setElseLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000226}
227
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000228void PCHStmtReader::VisitSwitchStmt(SwitchStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000229 VisitStmt(S);
Douglas Gregor43dec6b2010-06-21 23:44:13 +0000230 S->setConditionVariable(*Reader.getContext(),
231 cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000232 S->setCond(Reader.ReadSubExpr());
233 S->setBody(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000234 S->setSwitchLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
235 SwitchCase *PrevSC = 0;
236 for (unsigned N = Record.size(); Idx != N; ++Idx) {
237 SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]);
238 if (PrevSC)
239 PrevSC->setNextSwitchCase(SC);
240 else
241 S->setSwitchCaseList(SC);
Mike Stump1eb44332009-09-09 15:08:12 +0000242
Douglas Gregor43d9d922009-08-08 01:41:12 +0000243 // Retain this SwitchCase, since SwitchStmt::addSwitchCase() would
244 // normally retain it (but we aren't calling addSwitchCase).
245 SC->Retain();
Chris Lattner4c6f9522009-04-27 05:14:47 +0000246 PrevSC = SC;
247 }
Chris Lattner4c6f9522009-04-27 05:14:47 +0000248}
249
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000250void PCHStmtReader::VisitWhileStmt(WhileStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000251 VisitStmt(S);
Douglas Gregor43dec6b2010-06-21 23:44:13 +0000252 S->setConditionVariable(*Reader.getContext(),
253 cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000254 S->setCond(Reader.ReadSubExpr());
255 S->setBody(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000256 S->setWhileLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000257}
258
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000259void PCHStmtReader::VisitDoStmt(DoStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000260 VisitStmt(S);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000261 S->setCond(Reader.ReadSubExpr());
262 S->setBody(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000263 S->setDoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Douglas Gregor9f3ca2a2009-05-15 21:56:04 +0000264 S->setWhileLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner98913592009-06-12 23:04:47 +0000265 S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000266}
267
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000268void PCHStmtReader::VisitForStmt(ForStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000269 VisitStmt(S);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000270 S->setInit(Reader.ReadSubStmt());
271 S->setCond(Reader.ReadSubExpr());
Douglas Gregor43dec6b2010-06-21 23:44:13 +0000272 S->setConditionVariable(*Reader.getContext(),
273 cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000274 S->setInc(Reader.ReadSubExpr());
275 S->setBody(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000276 S->setForLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Douglas Gregor5831c6a2009-05-15 22:12:32 +0000277 S->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
278 S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000279}
280
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000281void PCHStmtReader::VisitGotoStmt(GotoStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000282 VisitStmt(S);
283 Reader.SetLabelOf(S, Record[Idx++]);
284 S->setGotoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
285 S->setLabelLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000286}
287
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000288void PCHStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000289 VisitStmt(S);
290 S->setGotoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Douglas Gregor5f1b9e62009-05-16 00:20:29 +0000291 S->setStarLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000292 S->setTarget(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000293}
294
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000295void PCHStmtReader::VisitContinueStmt(ContinueStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000296 VisitStmt(S);
297 S->setContinueLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000298}
299
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000300void PCHStmtReader::VisitBreakStmt(BreakStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000301 VisitStmt(S);
302 S->setBreakLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000303}
304
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000305void PCHStmtReader::VisitReturnStmt(ReturnStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000306 VisitStmt(S);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000307 S->setRetValue(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000308 S->setReturnLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Douglas Gregor5077c382010-05-15 06:01:05 +0000309 S->setNRVOCandidate(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000310}
311
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000312void PCHStmtReader::VisitDeclStmt(DeclStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000313 VisitStmt(S);
314 S->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
315 S->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
316
317 if (Idx + 1 == Record.size()) {
318 // Single declaration
319 S->setDeclGroup(DeclGroupRef(Reader.GetDecl(Record[Idx++])));
320 } else {
321 llvm::SmallVector<Decl *, 16> Decls;
322 Decls.reserve(Record.size() - Idx);
323 for (unsigned N = Record.size(); Idx != N; ++Idx)
324 Decls.push_back(Reader.GetDecl(Record[Idx]));
Chris Lattnerd1d64a02009-04-27 21:45:14 +0000325 S->setDeclGroup(DeclGroupRef(DeclGroup::Create(*Reader.getContext(),
Douglas Gregor75fdb232009-05-22 22:45:36 +0000326 Decls.data(),
327 Decls.size())));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000328 }
Chris Lattner4c6f9522009-04-27 05:14:47 +0000329}
330
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000331void PCHStmtReader::VisitAsmStmt(AsmStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000332 VisitStmt(S);
333 unsigned NumOutputs = Record[Idx++];
334 unsigned NumInputs = Record[Idx++];
335 unsigned NumClobbers = Record[Idx++];
336 S->setAsmLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
337 S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
338 S->setVolatile(Record[Idx++]);
339 S->setSimple(Record[Idx++]);
Mike Stump3b11fd32010-01-04 22:37:17 +0000340 S->setMSAsm(Record[Idx++]);
Mike Stump1eb44332009-09-09 15:08:12 +0000341
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000342 S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000343
344 // Outputs and inputs
Anders Carlssonff93dbd2010-01-30 22:25:16 +0000345 llvm::SmallVector<IdentifierInfo *, 16> Names;
Chris Lattner4c6f9522009-04-27 05:14:47 +0000346 llvm::SmallVector<StringLiteral*, 16> Constraints;
347 llvm::SmallVector<Stmt*, 16> Exprs;
348 for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {
Anders Carlssonff93dbd2010-01-30 22:25:16 +0000349 Names.push_back(Reader.GetIdentifierInfo(Record, Idx));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000350 Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
351 Exprs.push_back(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000352 }
Chris Lattner4c6f9522009-04-27 05:14:47 +0000353
354 // Constraints
355 llvm::SmallVector<StringLiteral*, 16> Clobbers;
356 for (unsigned I = 0; I != NumClobbers; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000357 Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
Anders Carlssonfdba9c02010-01-30 19:34:25 +0000358
Anders Carlssonacb6bcb2010-01-30 20:38:10 +0000359 S->setOutputsAndInputsAndClobbers(*Reader.getContext(),
360 Names.data(), Constraints.data(),
Anders Carlssonfdba9c02010-01-30 19:34:25 +0000361 Exprs.data(), NumOutputs, NumInputs,
362 Clobbers.data(), NumClobbers);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000363}
364
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000365void PCHStmtReader::VisitExpr(Expr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000366 VisitStmt(E);
367 E->setType(Reader.GetType(Record[Idx++]));
368 E->setTypeDependent(Record[Idx++]);
369 E->setValueDependent(Record[Idx++]);
370 assert(Idx == NumExprFields && "Incorrect expression field count");
Chris Lattner4c6f9522009-04-27 05:14:47 +0000371}
372
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000373void PCHStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000374 VisitExpr(E);
375 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
376 E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000377}
378
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000379void PCHStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000380 VisitExpr(E);
Argyrios Kyrtzidis663e3802010-07-08 13:09:47 +0000381
382 bool HasQualifier = Record[Idx++];
383 unsigned NumTemplateArgs = Record[Idx++];
384
385 E->DecoratedD.setInt((HasQualifier? DeclRefExpr::HasQualifierFlag : 0) |
386 (NumTemplateArgs ? DeclRefExpr::HasExplicitTemplateArgumentListFlag : 0));
387
388 if (HasQualifier) {
389 E->getNameQualifier()->NNS = Reader.ReadNestedNameSpecifier(Record, Idx);
390 E->getNameQualifier()->Range = Reader.ReadSourceRange(Record, Idx);
391 }
392
393 if (NumTemplateArgs)
394 ReadExplicitTemplateArgumentList(*E->getExplicitTemplateArgumentList(),
395 NumTemplateArgs);
396
John McCalldbd872f2009-12-08 09:08:17 +0000397 E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++])));
Argyrios Kyrtzidis663e3802010-07-08 13:09:47 +0000398 E->setLocation(Reader.ReadSourceLocation(Record, Idx));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000399}
400
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000401void PCHStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000402 VisitExpr(E);
403 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
404 E->setValue(Reader.ReadAPInt(Record, Idx));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000405}
406
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000407void PCHStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000408 VisitExpr(E);
409 E->setValue(Reader.ReadAPFloat(Record, Idx));
410 E->setExact(Record[Idx++]);
411 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000412}
413
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000414void PCHStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000415 VisitExpr(E);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000416 E->setSubExpr(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000417}
418
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000419void PCHStmtReader::VisitStringLiteral(StringLiteral *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000420 VisitExpr(E);
421 unsigned Len = Record[Idx++];
Mike Stump1eb44332009-09-09 15:08:12 +0000422 assert(Record[Idx] == E->getNumConcatenated() &&
Chris Lattner4c6f9522009-04-27 05:14:47 +0000423 "Wrong number of concatenated tokens!");
424 ++Idx;
425 E->setWide(Record[Idx++]);
426
Mike Stump1eb44332009-09-09 15:08:12 +0000427 // Read string data
Daniel Dunbarb6480232009-09-22 03:27:33 +0000428 llvm::SmallString<16> Str(&Record[Idx], &Record[Idx] + Len);
429 E->setString(*Reader.getContext(), Str.str());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000430 Idx += Len;
431
432 // Read source locations
433 for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
434 E->setStrTokenLoc(I, SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000435}
436
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000437void PCHStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000438 VisitExpr(E);
439 E->setValue(Record[Idx++]);
440 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
441 E->setWide(Record[Idx++]);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000442}
443
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000444void PCHStmtReader::VisitParenExpr(ParenExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000445 VisitExpr(E);
446 E->setLParen(SourceLocation::getFromRawEncoding(Record[Idx++]));
447 E->setRParen(SourceLocation::getFromRawEncoding(Record[Idx++]));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000448 E->setSubExpr(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000449}
450
Argyrios Kyrtzidis37bdfe22010-06-30 08:49:18 +0000451void PCHStmtReader::VisitParenListExpr(ParenListExpr *E) {
452 VisitExpr(E);
453 unsigned NumExprs = Record[Idx++];
454 E->Exprs = new (*Reader.getContext()) Stmt*[NumExprs];
455 for (unsigned i = 0; i != NumExprs; ++i)
456 E->Exprs[i] = Reader.ReadSubStmt();
457 E->NumExprs = NumExprs;
458 E->LParenLoc = Reader.ReadSourceLocation(Record, Idx);
459 E->RParenLoc = Reader.ReadSourceLocation(Record, Idx);
460}
461
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000462void PCHStmtReader::VisitUnaryOperator(UnaryOperator *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000463 VisitExpr(E);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000464 E->setSubExpr(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000465 E->setOpcode((UnaryOperator::Opcode)Record[Idx++]);
466 E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000467}
468
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000469void PCHStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
Douglas Gregor8ecdb652010-04-28 22:16:22 +0000470 typedef OffsetOfExpr::OffsetOfNode Node;
471 VisitExpr(E);
472 assert(E->getNumComponents() == Record[Idx]);
473 ++Idx;
474 assert(E->getNumExpressions() == Record[Idx]);
475 ++Idx;
476 E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
477 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
478 E->setTypeSourceInfo(Reader.GetTypeSourceInfo(Record, Idx));
479 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
480 Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]);
481 SourceLocation Start = SourceLocation::getFromRawEncoding(Record[Idx++]);
482 SourceLocation End = SourceLocation::getFromRawEncoding(Record[Idx++]);
483 switch (Kind) {
484 case Node::Array:
485 E->setComponent(I, Node(Start, Record[Idx++], End));
486 break;
487
488 case Node::Field:
489 E->setComponent(I,
490 Node(Start,
491 dyn_cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])),
492 End));
493 break;
494
495 case Node::Identifier:
496 E->setComponent(I, Node(Start, Reader.GetIdentifier(Record[Idx++]), End));
497 break;
Douglas Gregorcc8a5d52010-04-29 00:18:15 +0000498
499 case Node::Base:
500 // FIXME: Implement this!
501 llvm_unreachable("PCH for offsetof(base-specifier) not implemented");
502 break;
Douglas Gregor8ecdb652010-04-28 22:16:22 +0000503 }
504 }
505
506 for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000507 E->setIndexExpr(I, Reader.ReadSubExpr());
Douglas Gregor8ecdb652010-04-28 22:16:22 +0000508}
509
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000510void PCHStmtReader::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000511 VisitExpr(E);
512 E->setSizeof(Record[Idx++]);
513 if (Record[Idx] == 0) {
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000514 E->setArgument(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000515 ++Idx;
516 } else {
John McCalla93c9342009-12-07 02:54:59 +0000517 E->setArgument(Reader.GetTypeSourceInfo(Record, Idx));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000518 }
519 E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
520 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000521}
522
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000523void PCHStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000524 VisitExpr(E);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000525 E->setLHS(Reader.ReadSubExpr());
526 E->setRHS(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000527 E->setRBracketLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000528}
529
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000530void PCHStmtReader::VisitCallExpr(CallExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000531 VisitExpr(E);
Chris Lattnerd1d64a02009-04-27 21:45:14 +0000532 E->setNumArgs(*Reader.getContext(), Record[Idx++]);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000533 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000534 E->setCallee(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000535 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000536 E->setArg(I, Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000537}
538
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000539void PCHStmtReader::VisitMemberExpr(MemberExpr *E) {
Argyrios Kyrtzidis663e3802010-07-08 13:09:47 +0000540 // Don't call VisitExpr, this is fully initialized at creation.
541 assert(E->getStmtClass() == Stmt::MemberExprClass &&
542 "It's a subclass, we must advance Idx!");
Chris Lattner4c6f9522009-04-27 05:14:47 +0000543}
544
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000545void PCHStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
Steve Narofff242b1b2009-07-24 17:54:45 +0000546 VisitExpr(E);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000547 E->setBase(Reader.ReadSubExpr());
Steve Narofff242b1b2009-07-24 17:54:45 +0000548 E->setIsaMemberLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
549 E->setArrow(Record[Idx++]);
Steve Narofff242b1b2009-07-24 17:54:45 +0000550}
551
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000552void PCHStmtReader::VisitCastExpr(CastExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000553 VisitExpr(E);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000554 E->setSubExpr(Reader.ReadSubExpr());
Anders Carlssoncdef2b72009-07-31 00:48:10 +0000555 E->setCastKind((CastExpr::CastKind)Record[Idx++]);
Argyrios Kyrtzidis0745d0a2010-07-02 23:30:27 +0000556 CXXBaseSpecifierArray &BasePath = E->getBasePath();
557 unsigned NumBaseSpecs = Record[Idx++];
558 while (NumBaseSpecs--) {
559 // FIXME: These gets leaked.
560 CXXBaseSpecifier *BaseSpec = new (*Reader.getContext()) CXXBaseSpecifier;
561 *BaseSpec = Reader.ReadCXXBaseSpecifier(Record, Idx);
562 BasePath.push_back(BaseSpec);
563 }
Chris Lattner4c6f9522009-04-27 05:14:47 +0000564}
565
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000566void PCHStmtReader::VisitBinaryOperator(BinaryOperator *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000567 VisitExpr(E);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000568 E->setLHS(Reader.ReadSubExpr());
569 E->setRHS(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000570 E->setOpcode((BinaryOperator::Opcode)Record[Idx++]);
571 E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000572}
573
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000574void PCHStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000575 VisitBinaryOperator(E);
576 E->setComputationLHSType(Reader.GetType(Record[Idx++]));
577 E->setComputationResultType(Reader.GetType(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000578}
579
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000580void PCHStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000581 VisitExpr(E);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000582 E->setCond(Reader.ReadSubExpr());
583 E->setLHS(Reader.ReadSubExpr());
584 E->setRHS(Reader.ReadSubExpr());
Douglas Gregor47e1f7c2009-08-26 14:37:04 +0000585 E->setQuestionLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
586 E->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000587}
588
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000589void PCHStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000590 VisitCastExpr(E);
591 E->setLvalueCast(Record[Idx++]);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000592}
593
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000594void PCHStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000595 VisitCastExpr(E);
John McCall9d125032010-01-15 18:39:57 +0000596 E->setTypeInfoAsWritten(Reader.GetTypeSourceInfo(Record, Idx));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000597}
598
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000599void PCHStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000600 VisitExplicitCastExpr(E);
601 E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
602 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000603}
604
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000605void PCHStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000606 VisitExpr(E);
607 E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
John McCall42f56b52010-01-18 19:35:47 +0000608 E->setTypeSourceInfo(Reader.GetTypeSourceInfo(Record, Idx));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000609 E->setInitializer(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000610 E->setFileScope(Record[Idx++]);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000611}
612
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000613void PCHStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000614 VisitExpr(E);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000615 E->setBase(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000616 E->setAccessor(Reader.GetIdentifierInfo(Record, Idx));
617 E->setAccessorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000618}
619
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000620void PCHStmtReader::VisitInitListExpr(InitListExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000621 VisitExpr(E);
622 unsigned NumInits = Record[Idx++];
Ted Kremenek709210f2010-04-13 23:39:13 +0000623 E->reserveInits(*Reader.getContext(), NumInits);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000624 for (unsigned I = 0; I != NumInits; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000625 E->updateInit(*Reader.getContext(), I, Reader.ReadSubExpr());
626 E->setSyntacticForm(cast_or_null<InitListExpr>(Reader.ReadSubStmt()));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000627 E->setLBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
628 E->setRBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
629 E->setInitializedFieldInUnion(
630 cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])));
631 E->sawArrayRangeDesignator(Record[Idx++]);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000632}
633
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000634void PCHStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000635 typedef DesignatedInitExpr::Designator Designator;
636
637 VisitExpr(E);
638 unsigned NumSubExprs = Record[Idx++];
639 assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
640 for (unsigned I = 0; I != NumSubExprs; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000641 E->setSubExpr(I, Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000642 E->setEqualOrColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
643 E->setGNUSyntax(Record[Idx++]);
644
645 llvm::SmallVector<Designator, 4> Designators;
646 while (Idx < Record.size()) {
647 switch ((pch::DesignatorTypes)Record[Idx++]) {
648 case pch::DESIG_FIELD_DECL: {
649 FieldDecl *Field = cast<FieldDecl>(Reader.GetDecl(Record[Idx++]));
Mike Stump1eb44332009-09-09 15:08:12 +0000650 SourceLocation DotLoc
Chris Lattner4c6f9522009-04-27 05:14:47 +0000651 = SourceLocation::getFromRawEncoding(Record[Idx++]);
Mike Stump1eb44332009-09-09 15:08:12 +0000652 SourceLocation FieldLoc
Chris Lattner4c6f9522009-04-27 05:14:47 +0000653 = SourceLocation::getFromRawEncoding(Record[Idx++]);
Mike Stump1eb44332009-09-09 15:08:12 +0000654 Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
Chris Lattner4c6f9522009-04-27 05:14:47 +0000655 FieldLoc));
656 Designators.back().setField(Field);
657 break;
658 }
659
660 case pch::DESIG_FIELD_NAME: {
661 const IdentifierInfo *Name = Reader.GetIdentifierInfo(Record, Idx);
Mike Stump1eb44332009-09-09 15:08:12 +0000662 SourceLocation DotLoc
Chris Lattner4c6f9522009-04-27 05:14:47 +0000663 = SourceLocation::getFromRawEncoding(Record[Idx++]);
Mike Stump1eb44332009-09-09 15:08:12 +0000664 SourceLocation FieldLoc
Chris Lattner4c6f9522009-04-27 05:14:47 +0000665 = SourceLocation::getFromRawEncoding(Record[Idx++]);
666 Designators.push_back(Designator(Name, DotLoc, FieldLoc));
667 break;
668 }
Mike Stump1eb44332009-09-09 15:08:12 +0000669
Chris Lattner4c6f9522009-04-27 05:14:47 +0000670 case pch::DESIG_ARRAY: {
671 unsigned Index = Record[Idx++];
672 SourceLocation LBracketLoc
673 = SourceLocation::getFromRawEncoding(Record[Idx++]);
674 SourceLocation RBracketLoc
675 = SourceLocation::getFromRawEncoding(Record[Idx++]);
676 Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
677 break;
678 }
679
680 case pch::DESIG_ARRAY_RANGE: {
681 unsigned Index = Record[Idx++];
682 SourceLocation LBracketLoc
683 = SourceLocation::getFromRawEncoding(Record[Idx++]);
684 SourceLocation EllipsisLoc
685 = SourceLocation::getFromRawEncoding(Record[Idx++]);
686 SourceLocation RBracketLoc
687 = SourceLocation::getFromRawEncoding(Record[Idx++]);
688 Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
689 RBracketLoc));
690 break;
691 }
692 }
693 }
Douglas Gregor319d57f2010-01-06 23:17:19 +0000694 E->setDesignators(*Reader.getContext(),
695 Designators.data(), Designators.size());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000696}
697
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000698void PCHStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000699 VisitExpr(E);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000700}
701
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000702void PCHStmtReader::VisitVAArgExpr(VAArgExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000703 VisitExpr(E);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000704 E->setSubExpr(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000705 E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
706 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000707}
708
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000709void PCHStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000710 VisitExpr(E);
711 E->setAmpAmpLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
712 E->setLabelLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
713 Reader.SetLabelOf(E, Record[Idx++]);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000714}
715
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000716void PCHStmtReader::VisitStmtExpr(StmtExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000717 VisitExpr(E);
718 E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
719 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000720 E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt()));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000721}
722
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000723void PCHStmtReader::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000724 VisitExpr(E);
725 E->setArgType1(Reader.GetType(Record[Idx++]));
726 E->setArgType2(Reader.GetType(Record[Idx++]));
727 E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
728 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000729}
730
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000731void PCHStmtReader::VisitChooseExpr(ChooseExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000732 VisitExpr(E);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000733 E->setCond(Reader.ReadSubExpr());
734 E->setLHS(Reader.ReadSubExpr());
735 E->setRHS(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000736 E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
737 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000738}
739
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000740void PCHStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000741 VisitExpr(E);
742 E->setTokenLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000743}
744
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000745void PCHStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000746 VisitExpr(E);
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000747 llvm::SmallVector<Expr *, 16> Exprs;
Chris Lattner4c6f9522009-04-27 05:14:47 +0000748 unsigned NumExprs = Record[Idx++];
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000749 while (NumExprs--)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000750 Exprs.push_back(Reader.ReadSubExpr());
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000751 E->setExprs(*Reader.getContext(), Exprs.data(), Exprs.size());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000752 E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
753 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000754}
755
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000756void PCHStmtReader::VisitBlockExpr(BlockExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000757 VisitExpr(E);
758 E->setBlockDecl(cast_or_null<BlockDecl>(Reader.GetDecl(Record[Idx++])));
759 E->setHasBlockDeclRefExprs(Record[Idx++]);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000760}
761
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000762void PCHStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000763 VisitExpr(E);
764 E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++])));
765 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
766 E->setByRef(Record[Idx++]);
Fariborz Jahanian9b0b57c2009-06-20 00:02:26 +0000767 E->setConstQualAdded(Record[Idx++]);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000768 E->setCopyConstructorExpr(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000769}
770
771//===----------------------------------------------------------------------===//
772// Objective-C Expressions and Statements
773
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000774void PCHStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000775 VisitExpr(E);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000776 E->setString(cast<StringLiteral>(Reader.ReadSubStmt()));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000777 E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000778}
779
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000780void PCHStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000781 VisitExpr(E);
Douglas Gregor81d34662010-04-20 15:39:42 +0000782 E->setEncodedTypeSourceInfo(Reader.GetTypeSourceInfo(Record, Idx));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000783 E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
784 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000785}
786
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000787void PCHStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000788 VisitExpr(E);
789 E->setSelector(Reader.GetSelector(Record, Idx));
790 E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
791 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000792}
793
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000794void PCHStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000795 VisitExpr(E);
796 E->setProtocol(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
797 E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
798 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000799}
800
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000801void PCHStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000802 VisitExpr(E);
803 E->setDecl(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
804 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000805 E->setBase(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000806 E->setIsArrow(Record[Idx++]);
807 E->setIsFreeIvar(Record[Idx++]);
Chris Lattner4c6f9522009-04-27 05:14:47 +0000808}
809
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000810void PCHStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000811 VisitExpr(E);
812 E->setProperty(cast<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++])));
813 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000814 E->setBase(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000815}
816
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000817void PCHStmtReader::VisitObjCImplicitSetterGetterRefExpr(
Fariborz Jahanian09105f52009-08-20 17:02:02 +0000818 ObjCImplicitSetterGetterRefExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000819 VisitExpr(E);
820 E->setGetterMethod(
821 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
822 E->setSetterMethod(
823 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
Fariborz Jahaniand2ae5aa2009-08-18 21:37:33 +0000824 E->setInterfaceDecl(
Chris Lattner4c6f9522009-04-27 05:14:47 +0000825 cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000826 E->setBase(Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000827 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
828 E->setClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000829}
830
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000831void PCHStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000832 VisitExpr(E);
Douglas Gregor04badcf2010-04-21 00:45:42 +0000833 assert(Record[Idx] == E->getNumArgs());
834 ++Idx;
835 ObjCMessageExpr::ReceiverKind Kind
836 = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
837 switch (Kind) {
838 case ObjCMessageExpr::Instance:
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000839 E->setInstanceReceiver(Reader.ReadSubExpr());
Douglas Gregor04badcf2010-04-21 00:45:42 +0000840 break;
841
842 case ObjCMessageExpr::Class:
843 E->setClassReceiver(Reader.GetTypeSourceInfo(Record, Idx));
844 break;
845
846 case ObjCMessageExpr::SuperClass:
847 case ObjCMessageExpr::SuperInstance: {
848 QualType T = Reader.GetType(Record[Idx++]);
849 SourceLocation SuperLoc = SourceLocation::getFromRawEncoding(Record[Idx++]);
850 E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
851 break;
852 }
853 }
854
855 assert(Kind == E->getReceiverKind());
856
857 if (Record[Idx++])
858 E->setMethodDecl(cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
859 else
860 E->setSelector(Reader.GetSelector(Record, Idx));
861
Chris Lattner4c6f9522009-04-27 05:14:47 +0000862 E->setLeftLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
863 E->setRightLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000864
865 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000866 E->setArg(I, Reader.ReadSubExpr());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000867}
868
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000869void PCHStmtReader::VisitObjCSuperExpr(ObjCSuperExpr *E) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000870 VisitExpr(E);
871 E->setLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000872}
873
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000874void PCHStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000875 VisitStmt(S);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000876 S->setElement(Reader.ReadSubStmt());
877 S->setCollection(Reader.ReadSubExpr());
878 S->setBody(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000879 S->setForLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
880 S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000881}
882
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000883void PCHStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000884 VisitStmt(S);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000885 S->setCatchBody(Reader.ReadSubStmt());
Douglas Gregorc00d8e12010-04-26 16:46:50 +0000886 S->setCatchParamDecl(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000887 S->setAtCatchLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
888 S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000889}
890
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000891void PCHStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000892 VisitStmt(S);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000893 S->setFinallyBody(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000894 S->setAtFinallyLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000895}
896
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000897void PCHStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000898 VisitStmt(S);
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +0000899 assert(Record[Idx] == S->getNumCatchStmts());
900 ++Idx;
901 bool HasFinally = Record[Idx++];
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000902 S->setTryBody(Reader.ReadSubStmt());
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000903 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000904 S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +0000905
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +0000906 if (HasFinally)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000907 S->setFinallyStmt(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000908 S->setAtTryLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000909}
910
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000911void PCHStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000912 VisitStmt(S);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000913 S->setSynchExpr(Reader.ReadSubStmt());
914 S->setSynchBody(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000915 S->setAtSynchronizedLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000916}
917
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000918void PCHStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
Chris Lattner4c6f9522009-04-27 05:14:47 +0000919 VisitStmt(S);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000920 S->setThrowExpr(Reader.ReadSubStmt());
Chris Lattner4c6f9522009-04-27 05:14:47 +0000921 S->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner4c6f9522009-04-27 05:14:47 +0000922}
923
Argyrios Kyrtzidisba0a9002009-07-14 03:19:21 +0000924//===----------------------------------------------------------------------===//
925// C++ Expressions and Statements
926
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000927void PCHStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
928 VisitCallExpr(E);
Argyrios Kyrtzidisba0a9002009-07-14 03:19:21 +0000929 E->setOperator((OverloadedOperatorKind)Record[Idx++]);
Argyrios Kyrtzidisba0a9002009-07-14 03:19:21 +0000930}
931
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000932void PCHStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
Douglas Gregor39da0b82009-09-09 23:08:42 +0000933 VisitExpr(E);
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +0000934 E->NumArgs = Record[Idx++];
935 if (E->NumArgs)
936 E->Args = new (*Reader.getContext()) Stmt*[E->NumArgs];
Argyrios Kyrtzidis5e1b7c22010-06-24 08:57:09 +0000937 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000938 E->setArg(I, Reader.ReadSubExpr());
Douglas Gregor39da0b82009-09-09 23:08:42 +0000939 E->setConstructor(cast<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
Douglas Gregor99a2e602009-12-16 01:38:02 +0000940 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
Douglas Gregor39da0b82009-09-09 23:08:42 +0000941 E->setElidable(Record[Idx++]);
Douglas Gregor16006c92009-12-16 18:50:27 +0000942 E->setRequiresZeroInitialization(Record[Idx++]);
Douglas Gregor3c9034c2010-05-15 00:13:29 +0000943 E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
Douglas Gregor39da0b82009-09-09 23:08:42 +0000944}
Chris Lattner4c6f9522009-04-27 05:14:47 +0000945
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +0000946void PCHStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
947 VisitCXXConstructExpr(E);
948 E->TyBeginLoc = Reader.ReadSourceLocation(Record, Idx);
949 E->RParenLoc = Reader.ReadSourceLocation(Record, Idx);
950}
951
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000952void PCHStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
953 VisitExplicitCastExpr(E);
Sam Weinigce757a72010-01-16 21:21:01 +0000954 E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Sam Weinigce757a72010-01-16 21:21:01 +0000955}
956
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000957void PCHStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
Sam Weinigce757a72010-01-16 21:21:01 +0000958 return VisitCXXNamedCastExpr(E);
959}
960
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000961void PCHStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
Sam Weinigce757a72010-01-16 21:21:01 +0000962 return VisitCXXNamedCastExpr(E);
963}
964
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000965void PCHStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
Sam Weinigce757a72010-01-16 21:21:01 +0000966 return VisitCXXNamedCastExpr(E);
967}
968
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000969void PCHStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
Sam Weinigce757a72010-01-16 21:21:01 +0000970 return VisitCXXNamedCastExpr(E);
971}
972
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000973void PCHStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
974 VisitExplicitCastExpr(E);
Sam Weinigce757a72010-01-16 21:21:01 +0000975 E->setTypeBeginLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
976 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Sam Weinigce757a72010-01-16 21:21:01 +0000977}
978
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000979void PCHStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
Sam Weinigeb7f9612010-02-07 06:32:43 +0000980 VisitExpr(E);
981 E->setValue(Record[Idx++]);
982 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
Sam Weinigeb7f9612010-02-07 06:32:43 +0000983}
984
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000985void PCHStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
Sam Weinigeb7f9612010-02-07 06:32:43 +0000986 VisitExpr(E);
987 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
Sam Weinigeb7f9612010-02-07 06:32:43 +0000988}
989
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000990void PCHStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
Chris Lattner14ab24f2010-05-09 06:03:39 +0000991 VisitExpr(E);
992 E->setSourceRange(Reader.ReadSourceRange(Record, Idx));
993 if (E->isTypeOperand()) { // typeid(int)
994 E->setTypeOperandSourceInfo(Reader.GetTypeSourceInfo(Record, Idx));
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +0000995 return;
Chris Lattner14ab24f2010-05-09 06:03:39 +0000996 }
997
998 // typeid(42+2)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +0000999 E->setExprOperand(Reader.ReadSubExpr());
Chris Lattner14ab24f2010-05-09 06:03:39 +00001000}
1001
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001002void PCHStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
Chris Lattner2fbdfcd2010-05-09 06:15:05 +00001003 VisitExpr(E);
1004 E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
1005 E->setImplicit(Record[Idx++]);
Chris Lattner2fbdfcd2010-05-09 06:15:05 +00001006}
1007
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001008void PCHStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
Chris Lattner2fbdfcd2010-05-09 06:15:05 +00001009 VisitExpr(E);
1010 E->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001011 E->setSubExpr(Reader.ReadSubExpr());
Chris Lattner2fbdfcd2010-05-09 06:15:05 +00001012}
Chris Lattner14ab24f2010-05-09 06:03:39 +00001013
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001014void PCHStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
Chris Lattner030854b2010-05-09 06:40:08 +00001015 VisitExpr(E);
Argyrios Kyrtzidis8a507332010-07-02 23:30:15 +00001016
1017 assert(Record[Idx] == E->Param.getInt() && "We messed up at creation ?");
1018 ++Idx; // HasOtherExprStored and SubExpr was handled during creation.
1019 E->Param.setPointer(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
1020 E->Loc = Reader.ReadSourceLocation(Record, Idx);
Chris Lattnerd2598362010-05-10 00:25:06 +00001021}
1022
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001023void PCHStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
Chris Lattnerd2598362010-05-10 00:25:06 +00001024 VisitExpr(E);
1025 E->setTemporary(Reader.ReadCXXTemporary(Record, Idx));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001026 E->setSubExpr(Reader.ReadSubExpr());
Chris Lattnerd2598362010-05-10 00:25:06 +00001027}
1028
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +00001029void PCHStmtReader::VisitCXXBindReferenceExpr(CXXBindReferenceExpr *E) {
1030 VisitExpr(E);
1031 E->SubExpr = Reader.ReadSubExpr();
1032 E->ExtendsLifetime = Record[Idx++];
1033 E->RequiresTemporaryCopy = Record[Idx++];
1034}
1035
Douglas Gregored8abf12010-07-08 06:14:04 +00001036void PCHStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
Chris Lattner59218632010-05-10 01:22:27 +00001037 VisitExpr(E);
1038 E->setTypeBeginLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1039 E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Chris Lattner59218632010-05-10 01:22:27 +00001040}
1041
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001042void PCHStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
Chris Lattner59218632010-05-10 01:22:27 +00001043 VisitExpr(E);
1044 E->setGlobalNew(Record[Idx++]);
1045 E->setParenTypeId(Record[Idx++]);
1046 E->setHasInitializer(Record[Idx++]);
1047 bool isArray = Record[Idx++];
1048 unsigned NumPlacementArgs = Record[Idx++];
1049 unsigned NumCtorArgs = Record[Idx++];
1050 E->setOperatorNew(cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
1051 E->setOperatorDelete(
1052 cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
1053 E->setConstructor(
1054 cast_or_null<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
1055 E->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1056 E->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1057
1058 E->AllocateArgsArray(*Reader.getContext(), isArray, NumPlacementArgs,
1059 NumCtorArgs);
1060
1061 // Install all the subexpressions.
Chris Lattner59218632010-05-10 01:22:27 +00001062 for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
1063 I != e; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001064 *I = Reader.ReadSubStmt();
Chris Lattner59218632010-05-10 01:22:27 +00001065}
1066
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001067void PCHStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
Argyrios Kyrtzidis95fc98c2010-06-22 17:07:59 +00001068 VisitExpr(E);
1069 E->setGlobalDelete(Record[Idx++]);
1070 E->setArrayForm(Record[Idx++]);
1071 E->setOperatorDelete(
1072 cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001073 E->setArgument(Reader.ReadSubExpr());
Argyrios Kyrtzidis95fc98c2010-06-22 17:07:59 +00001074 E->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Argyrios Kyrtzidis95fc98c2010-06-22 17:07:59 +00001075}
Chris Lattnerd2598362010-05-10 00:25:06 +00001076
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001077void PCHStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
Argyrios Kyrtzidisde4bd182010-06-28 09:32:03 +00001078 VisitExpr(E);
1079
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001080 E->setBase(Reader.ReadSubExpr());
Argyrios Kyrtzidisde4bd182010-06-28 09:32:03 +00001081 E->setArrow(Record[Idx++]);
1082 E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1083 E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1084 E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1085 E->setScopeTypeInfo(Reader.GetTypeSourceInfo(Record, Idx));
1086 E->setColonColonLoc(Reader.ReadSourceLocation(Record, Idx));
1087 E->setTildeLoc(Reader.ReadSourceLocation(Record, Idx));
1088
1089 IdentifierInfo *II = Reader.GetIdentifierInfo(Record, Idx);
1090 if (II)
1091 E->setDestroyedType(II, Reader.ReadSourceLocation(Record, Idx));
1092 else
1093 E->setDestroyedType(Reader.GetTypeSourceInfo(Record, Idx));
Argyrios Kyrtzidisde4bd182010-06-28 09:32:03 +00001094}
1095
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001096void PCHStmtReader::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
Chris Lattnerd2598362010-05-10 00:25:06 +00001097 VisitExpr(E);
1098 unsigned NumTemps = Record[Idx++];
1099 if (NumTemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +00001100 E->setNumTemporaries(*Reader.getContext(), NumTemps);
Chris Lattnerd2598362010-05-10 00:25:06 +00001101 for (unsigned i = 0; i != NumTemps; ++i)
1102 E->setTemporary(i, Reader.ReadCXXTemporary(Record, Idx));
1103 }
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001104 E->setSubExpr(Reader.ReadSubExpr());
Chris Lattner030854b2010-05-09 06:40:08 +00001105}
1106
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001107void
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001108PCHStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
1109 VisitExpr(E);
1110
1111 unsigned NumTemplateArgs = Record[Idx++];
1112 assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1113 "Read wrong record during creation ?");
Argyrios Kyrtzidis36c76f02010-06-28 09:31:48 +00001114 if (E->hasExplicitTemplateArgs())
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001115 ReadExplicitTemplateArgumentList(*E->getExplicitTemplateArgumentList(),
1116 NumTemplateArgs);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001117
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001118 E->setBase(Reader.ReadSubExpr());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001119 E->setBaseType(Reader.GetType(Record[Idx++]));
1120 E->setArrow(Record[Idx++]);
1121 E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1122 E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1123 E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1124 E->setFirstQualifierFoundInScope(
1125 cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])));
1126 E->setMember(Reader.ReadDeclarationName(Record, Idx));
1127 E->setMemberLoc(Reader.ReadSourceLocation(Record, Idx));
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001128}
1129
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001130void
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +00001131PCHStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
1132 VisitExpr(E);
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +00001133
1134 unsigned NumTemplateArgs = Record[Idx++];
1135 assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1136 "Read wrong record during creation ?");
1137 if (E->hasExplicitTemplateArgs())
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001138 ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1139 NumTemplateArgs);
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +00001140
1141 E->setDeclName(Reader.ReadDeclarationName(Record, Idx));
1142 E->setLocation(Reader.ReadSourceLocation(Record, Idx));
1143 E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1144 E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +00001145}
1146
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001147void
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001148PCHStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1149 VisitExpr(E);
1150 assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
1151 ++Idx; // NumArgs;
1152 for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001153 E->setArg(I, Reader.ReadSubExpr());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001154 E->setTypeBeginLoc(Reader.ReadSourceLocation(Record, Idx));
1155 E->setTypeAsWritten(Reader.GetType(Record[Idx++]));
1156 E->setLParenLoc(Reader.ReadSourceLocation(Record, Idx));
1157 E->setRParenLoc(Reader.ReadSourceLocation(Record, Idx));
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001158}
1159
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001160void PCHStmtReader::VisitOverloadExpr(OverloadExpr *E) {
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001161 VisitExpr(E);
1162
1163 unsigned NumTemplateArgs = Record[Idx++];
1164 assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1165 "Read wrong record during creation ?");
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001166 if (E->hasExplicitTemplateArgs())
1167 ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1168 NumTemplateArgs);
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001169
1170 unsigned NumDecls = Record[Idx++];
1171 UnresolvedSet<8> Decls;
1172 for (unsigned i = 0; i != NumDecls; ++i) {
1173 NamedDecl *D = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
1174 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1175 Decls.addDecl(D, AS);
1176 }
1177 E->initializeResults(*Reader.getContext(), Decls.begin(), Decls.end());
1178
1179 E->setName(Reader.ReadDeclarationName(Record, Idx));
1180 E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1181 E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1182 E->setNameLoc(Reader.ReadSourceLocation(Record, Idx));
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001183}
1184
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001185void PCHStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1186 VisitOverloadExpr(E);
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001187 E->setArrow(Record[Idx++]);
1188 E->setHasUnresolvedUsing(Record[Idx++]);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001189 E->setBase(Reader.ReadSubExpr());
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001190 E->setBaseType(Reader.GetType(Record[Idx++]));
1191 E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001192}
1193
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001194void PCHStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1195 VisitOverloadExpr(E);
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +00001196 E->setRequiresADL(Record[Idx++]);
1197 E->setOverloaded(Record[Idx++]);
1198 E->setNamingClass(cast_or_null<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])));
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +00001199}
1200
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +00001201void PCHStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1202 VisitExpr(E);
1203 E->UTT = (UnaryTypeTrait)Record[Idx++];
1204 SourceRange Range = Reader.ReadSourceRange(Record, Idx);
1205 E->Loc = Range.getBegin();
1206 E->RParen = Range.getEnd();
1207 E->QueriedType = Reader.GetType(Record[Idx++]);
1208}
1209
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001210Stmt *PCHReader::ReadStmt() {
1211 switch (ReadingKind) {
1212 case Read_Decl:
1213 case Read_Type:
1214 // Read a statement from the current DeclCursor.
1215 return ReadStmtFromStream(DeclsCursor);
1216 case Read_Stmt:
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001217 return ReadSubStmt();
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001218 }
1219
1220 llvm_unreachable("ReadingKind not set ?");
1221 return 0;
1222}
1223
1224Expr *PCHReader::ReadExpr() {
1225 return cast_or_null<Expr>(ReadStmt());
1226}
Chris Lattner030854b2010-05-09 06:40:08 +00001227
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001228Expr *PCHReader::ReadSubExpr() {
1229 return cast_or_null<Expr>(ReadSubStmt());
1230}
1231
Chris Lattner52e97d12009-04-27 05:41:06 +00001232// Within the bitstream, expressions are stored in Reverse Polish
1233// Notation, with each of the subexpressions preceding the
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001234// expression they are stored in. Subexpressions are stored from last to first.
1235// To evaluate expressions, we continue reading expressions and placing them on
1236// the stack, with expressions having operands removing those operands from the
Chris Lattner52e97d12009-04-27 05:41:06 +00001237// stack. Evaluation terminates when we see a STMT_STOP record, and
1238// the single remaining expression on the stack is our result.
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001239Stmt *PCHReader::ReadStmtFromStream(llvm::BitstreamCursor &Cursor) {
1240
1241 ReadingKindTracker ReadingKind(Read_Stmt, *this);
1242
1243#ifndef NDEBUG
1244 unsigned PrevNumStmts = StmtStack.size();
1245#endif
1246
Chris Lattner4c6f9522009-04-27 05:14:47 +00001247 RecordData Record;
1248 unsigned Idx;
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001249 PCHStmtReader Reader(*this, Record, Idx);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001250 Stmt::EmptyShell Empty;
1251
1252 while (true) {
Chris Lattner52e97d12009-04-27 05:41:06 +00001253 unsigned Code = Cursor.ReadCode();
Chris Lattner4c6f9522009-04-27 05:14:47 +00001254 if (Code == llvm::bitc::END_BLOCK) {
Chris Lattner52e97d12009-04-27 05:41:06 +00001255 if (Cursor.ReadBlockEnd()) {
Douglas Gregora02b1472009-04-28 21:53:25 +00001256 Error("error at end of block in PCH file");
Chris Lattner4c6f9522009-04-27 05:14:47 +00001257 return 0;
1258 }
1259 break;
1260 }
1261
1262 if (Code == llvm::bitc::ENTER_SUBBLOCK) {
1263 // No known subblocks, always skip them.
Chris Lattner52e97d12009-04-27 05:41:06 +00001264 Cursor.ReadSubBlockID();
1265 if (Cursor.SkipBlock()) {
Douglas Gregora02b1472009-04-28 21:53:25 +00001266 Error("malformed block record in PCH file");
Chris Lattner4c6f9522009-04-27 05:14:47 +00001267 return 0;
1268 }
1269 continue;
1270 }
1271
1272 if (Code == llvm::bitc::DEFINE_ABBREV) {
Chris Lattner52e97d12009-04-27 05:41:06 +00001273 Cursor.ReadAbbrevRecord();
Chris Lattner4c6f9522009-04-27 05:14:47 +00001274 continue;
1275 }
1276
1277 Stmt *S = 0;
1278 Idx = 0;
1279 Record.clear();
1280 bool Finished = false;
Chris Lattner52e97d12009-04-27 05:41:06 +00001281 switch ((pch::StmtCode)Cursor.ReadRecord(Code, Record)) {
Chris Lattner4c6f9522009-04-27 05:14:47 +00001282 case pch::STMT_STOP:
1283 Finished = true;
1284 break;
1285
Mike Stump1eb44332009-09-09 15:08:12 +00001286 case pch::STMT_NULL_PTR:
1287 S = 0;
Chris Lattner4c6f9522009-04-27 05:14:47 +00001288 break;
1289
1290 case pch::STMT_NULL:
1291 S = new (Context) NullStmt(Empty);
1292 break;
1293
1294 case pch::STMT_COMPOUND:
1295 S = new (Context) CompoundStmt(Empty);
1296 break;
1297
1298 case pch::STMT_CASE:
1299 S = new (Context) CaseStmt(Empty);
1300 break;
1301
1302 case pch::STMT_DEFAULT:
1303 S = new (Context) DefaultStmt(Empty);
1304 break;
1305
1306 case pch::STMT_LABEL:
1307 S = new (Context) LabelStmt(Empty);
1308 break;
1309
1310 case pch::STMT_IF:
1311 S = new (Context) IfStmt(Empty);
1312 break;
1313
1314 case pch::STMT_SWITCH:
1315 S = new (Context) SwitchStmt(Empty);
1316 break;
1317
1318 case pch::STMT_WHILE:
1319 S = new (Context) WhileStmt(Empty);
1320 break;
1321
1322 case pch::STMT_DO:
1323 S = new (Context) DoStmt(Empty);
1324 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001325
Chris Lattner4c6f9522009-04-27 05:14:47 +00001326 case pch::STMT_FOR:
1327 S = new (Context) ForStmt(Empty);
1328 break;
1329
1330 case pch::STMT_GOTO:
1331 S = new (Context) GotoStmt(Empty);
1332 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001333
Chris Lattner4c6f9522009-04-27 05:14:47 +00001334 case pch::STMT_INDIRECT_GOTO:
1335 S = new (Context) IndirectGotoStmt(Empty);
1336 break;
1337
1338 case pch::STMT_CONTINUE:
1339 S = new (Context) ContinueStmt(Empty);
1340 break;
1341
1342 case pch::STMT_BREAK:
1343 S = new (Context) BreakStmt(Empty);
1344 break;
1345
1346 case pch::STMT_RETURN:
1347 S = new (Context) ReturnStmt(Empty);
1348 break;
1349
1350 case pch::STMT_DECL:
1351 S = new (Context) DeclStmt(Empty);
1352 break;
1353
1354 case pch::STMT_ASM:
1355 S = new (Context) AsmStmt(Empty);
1356 break;
1357
1358 case pch::EXPR_PREDEFINED:
1359 S = new (Context) PredefinedExpr(Empty);
1360 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001361
1362 case pch::EXPR_DECL_REF:
Argyrios Kyrtzidis663e3802010-07-08 13:09:47 +00001363 S = DeclRefExpr::CreateEmpty(*Context,
1364 /*HasQualifier=*/Record[PCHStmtReader::NumExprFields],
1365 /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields + 1]);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001366 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001367
1368 case pch::EXPR_INTEGER_LITERAL:
Chris Lattner4c6f9522009-04-27 05:14:47 +00001369 S = new (Context) IntegerLiteral(Empty);
1370 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001371
Chris Lattner4c6f9522009-04-27 05:14:47 +00001372 case pch::EXPR_FLOATING_LITERAL:
1373 S = new (Context) FloatingLiteral(Empty);
1374 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001375
Chris Lattner4c6f9522009-04-27 05:14:47 +00001376 case pch::EXPR_IMAGINARY_LITERAL:
1377 S = new (Context) ImaginaryLiteral(Empty);
1378 break;
1379
1380 case pch::EXPR_STRING_LITERAL:
Mike Stump1eb44332009-09-09 15:08:12 +00001381 S = StringLiteral::CreateEmpty(*Context,
Chris Lattner4c6f9522009-04-27 05:14:47 +00001382 Record[PCHStmtReader::NumExprFields + 1]);
1383 break;
1384
1385 case pch::EXPR_CHARACTER_LITERAL:
1386 S = new (Context) CharacterLiteral(Empty);
1387 break;
1388
1389 case pch::EXPR_PAREN:
1390 S = new (Context) ParenExpr(Empty);
1391 break;
1392
Argyrios Kyrtzidis37bdfe22010-06-30 08:49:18 +00001393 case pch::EXPR_PAREN_LIST:
1394 S = new (Context) ParenListExpr(Empty);
1395 break;
1396
Chris Lattner4c6f9522009-04-27 05:14:47 +00001397 case pch::EXPR_UNARY_OPERATOR:
1398 S = new (Context) UnaryOperator(Empty);
1399 break;
1400
Douglas Gregor8ecdb652010-04-28 22:16:22 +00001401 case pch::EXPR_OFFSETOF:
1402 S = OffsetOfExpr::CreateEmpty(*Context,
1403 Record[PCHStmtReader::NumExprFields],
1404 Record[PCHStmtReader::NumExprFields + 1]);
1405 break;
1406
Chris Lattner4c6f9522009-04-27 05:14:47 +00001407 case pch::EXPR_SIZEOF_ALIGN_OF:
1408 S = new (Context) SizeOfAlignOfExpr(Empty);
1409 break;
1410
1411 case pch::EXPR_ARRAY_SUBSCRIPT:
1412 S = new (Context) ArraySubscriptExpr(Empty);
1413 break;
1414
1415 case pch::EXPR_CALL:
Argyrios Kyrtzidisba0a9002009-07-14 03:19:21 +00001416 S = new (Context) CallExpr(*Context, Stmt::CallExprClass, Empty);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001417 break;
1418
Argyrios Kyrtzidis663e3802010-07-08 13:09:47 +00001419 case pch::EXPR_MEMBER: {
1420 // We load everything here and fully initialize it at creation.
1421 // That way we can use MemberExpr::Create and don't have to duplicate its
1422 // logic with a MemberExpr::CreateEmpty.
1423
1424 assert(Idx == 0);
1425 NestedNameSpecifier *NNS = 0;
1426 SourceRange QualifierRange;
1427 if (Record[Idx++]) { // HasQualifier.
1428 NNS = ReadNestedNameSpecifier(Record, Idx);
1429 QualifierRange = ReadSourceRange(Record, Idx);
1430 }
1431
1432 TemplateArgumentListInfo ArgInfo;
1433 unsigned NumTemplateArgs = Record[Idx++];
1434 if (NumTemplateArgs) {
1435 ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx));
1436 ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx));
1437 for (unsigned i = 0; i != NumTemplateArgs; ++i)
1438 ArgInfo.addArgument(ReadTemplateArgumentLoc(Record, Idx));
1439 }
1440
1441 NamedDecl *FoundD = cast_or_null<NamedDecl>(GetDecl(Record[Idx++]));
1442 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1443 DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
1444
1445 QualType T = GetType(Record[Idx++]);
1446 Expr *Base = ReadSubExpr();
1447 ValueDecl *MemberD = cast<ValueDecl>(GetDecl(Record[Idx++]));
1448 SourceLocation MemberLoc = ReadSourceLocation(Record, Idx);
1449 bool IsArrow = Record[Idx++];
1450
1451 S = MemberExpr::Create(*Context, Base, IsArrow, NNS, QualifierRange,
1452 MemberD, FoundDecl, MemberLoc,
1453 NumTemplateArgs ? &ArgInfo : 0, T);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001454 break;
Argyrios Kyrtzidis663e3802010-07-08 13:09:47 +00001455 }
Chris Lattner4c6f9522009-04-27 05:14:47 +00001456
1457 case pch::EXPR_BINARY_OPERATOR:
1458 S = new (Context) BinaryOperator(Empty);
1459 break;
1460
1461 case pch::EXPR_COMPOUND_ASSIGN_OPERATOR:
1462 S = new (Context) CompoundAssignOperator(Empty);
1463 break;
1464
1465 case pch::EXPR_CONDITIONAL_OPERATOR:
1466 S = new (Context) ConditionalOperator(Empty);
1467 break;
1468
1469 case pch::EXPR_IMPLICIT_CAST:
1470 S = new (Context) ImplicitCastExpr(Empty);
1471 break;
1472
1473 case pch::EXPR_CSTYLE_CAST:
1474 S = new (Context) CStyleCastExpr(Empty);
1475 break;
1476
1477 case pch::EXPR_COMPOUND_LITERAL:
1478 S = new (Context) CompoundLiteralExpr(Empty);
1479 break;
1480
1481 case pch::EXPR_EXT_VECTOR_ELEMENT:
1482 S = new (Context) ExtVectorElementExpr(Empty);
1483 break;
1484
1485 case pch::EXPR_INIT_LIST:
Ted Kremenek709210f2010-04-13 23:39:13 +00001486 S = new (Context) InitListExpr(*getContext(), Empty);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001487 break;
1488
1489 case pch::EXPR_DESIGNATED_INIT:
Chris Lattnerd1d64a02009-04-27 21:45:14 +00001490 S = DesignatedInitExpr::CreateEmpty(*Context,
Chris Lattner4c6f9522009-04-27 05:14:47 +00001491 Record[PCHStmtReader::NumExprFields] - 1);
Mike Stump1eb44332009-09-09 15:08:12 +00001492
Chris Lattner4c6f9522009-04-27 05:14:47 +00001493 break;
1494
1495 case pch::EXPR_IMPLICIT_VALUE_INIT:
1496 S = new (Context) ImplicitValueInitExpr(Empty);
1497 break;
1498
1499 case pch::EXPR_VA_ARG:
1500 S = new (Context) VAArgExpr(Empty);
1501 break;
1502
1503 case pch::EXPR_ADDR_LABEL:
1504 S = new (Context) AddrLabelExpr(Empty);
1505 break;
1506
1507 case pch::EXPR_STMT:
1508 S = new (Context) StmtExpr(Empty);
1509 break;
1510
1511 case pch::EXPR_TYPES_COMPATIBLE:
1512 S = new (Context) TypesCompatibleExpr(Empty);
1513 break;
1514
1515 case pch::EXPR_CHOOSE:
1516 S = new (Context) ChooseExpr(Empty);
1517 break;
1518
1519 case pch::EXPR_GNU_NULL:
1520 S = new (Context) GNUNullExpr(Empty);
1521 break;
1522
1523 case pch::EXPR_SHUFFLE_VECTOR:
1524 S = new (Context) ShuffleVectorExpr(Empty);
1525 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001526
Chris Lattner4c6f9522009-04-27 05:14:47 +00001527 case pch::EXPR_BLOCK:
1528 S = new (Context) BlockExpr(Empty);
1529 break;
1530
1531 case pch::EXPR_BLOCK_DECL_REF:
1532 S = new (Context) BlockDeclRefExpr(Empty);
1533 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001534
Chris Lattner4c6f9522009-04-27 05:14:47 +00001535 case pch::EXPR_OBJC_STRING_LITERAL:
1536 S = new (Context) ObjCStringLiteral(Empty);
1537 break;
1538 case pch::EXPR_OBJC_ENCODE:
1539 S = new (Context) ObjCEncodeExpr(Empty);
1540 break;
1541 case pch::EXPR_OBJC_SELECTOR_EXPR:
1542 S = new (Context) ObjCSelectorExpr(Empty);
1543 break;
1544 case pch::EXPR_OBJC_PROTOCOL_EXPR:
1545 S = new (Context) ObjCProtocolExpr(Empty);
1546 break;
1547 case pch::EXPR_OBJC_IVAR_REF_EXPR:
1548 S = new (Context) ObjCIvarRefExpr(Empty);
1549 break;
1550 case pch::EXPR_OBJC_PROPERTY_REF_EXPR:
1551 S = new (Context) ObjCPropertyRefExpr(Empty);
1552 break;
1553 case pch::EXPR_OBJC_KVC_REF_EXPR:
Fariborz Jahanian09105f52009-08-20 17:02:02 +00001554 S = new (Context) ObjCImplicitSetterGetterRefExpr(Empty);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001555 break;
1556 case pch::EXPR_OBJC_MESSAGE_EXPR:
Douglas Gregor04badcf2010-04-21 00:45:42 +00001557 S = ObjCMessageExpr::CreateEmpty(*Context,
1558 Record[PCHStmtReader::NumExprFields]);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001559 break;
1560 case pch::EXPR_OBJC_SUPER_EXPR:
1561 S = new (Context) ObjCSuperExpr(Empty);
1562 break;
Steve Narofff242b1b2009-07-24 17:54:45 +00001563 case pch::EXPR_OBJC_ISA:
1564 S = new (Context) ObjCIsaExpr(Empty);
1565 break;
Chris Lattner4c6f9522009-04-27 05:14:47 +00001566 case pch::STMT_OBJC_FOR_COLLECTION:
1567 S = new (Context) ObjCForCollectionStmt(Empty);
1568 break;
1569 case pch::STMT_OBJC_CATCH:
1570 S = new (Context) ObjCAtCatchStmt(Empty);
1571 break;
1572 case pch::STMT_OBJC_FINALLY:
1573 S = new (Context) ObjCAtFinallyStmt(Empty);
1574 break;
1575 case pch::STMT_OBJC_AT_TRY:
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +00001576 S = ObjCAtTryStmt::CreateEmpty(*Context,
1577 Record[PCHStmtReader::NumStmtFields],
1578 Record[PCHStmtReader::NumStmtFields + 1]);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001579 break;
1580 case pch::STMT_OBJC_AT_SYNCHRONIZED:
1581 S = new (Context) ObjCAtSynchronizedStmt(Empty);
1582 break;
1583 case pch::STMT_OBJC_AT_THROW:
1584 S = new (Context) ObjCAtThrowStmt(Empty);
1585 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001586
Argyrios Kyrtzidisba0a9002009-07-14 03:19:21 +00001587 case pch::EXPR_CXX_OPERATOR_CALL:
1588 S = new (Context) CXXOperatorCallExpr(*Context, Empty);
1589 break;
Chris Lattner1817bd42010-05-09 05:36:05 +00001590
1591 case pch::EXPR_CXX_MEMBER_CALL:
1592 S = new (Context) CXXMemberCallExpr(*Context, Empty);
1593 break;
Douglas Gregor39da0b82009-09-09 23:08:42 +00001594
1595 case pch::EXPR_CXX_CONSTRUCT:
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +00001596 S = new (Context) CXXConstructExpr(Empty);
1597 break;
1598
1599 case pch::EXPR_CXX_TEMPORARY_OBJECT:
1600 S = new (Context) CXXTemporaryObjectExpr(Empty);
Douglas Gregor39da0b82009-09-09 23:08:42 +00001601 break;
Sam Weinigce757a72010-01-16 21:21:01 +00001602
1603 case pch::EXPR_CXX_STATIC_CAST:
1604 S = new (Context) CXXStaticCastExpr(Empty);
1605 break;
1606
1607 case pch::EXPR_CXX_DYNAMIC_CAST:
1608 S = new (Context) CXXDynamicCastExpr(Empty);
1609 break;
1610
1611 case pch::EXPR_CXX_REINTERPRET_CAST:
1612 S = new (Context) CXXReinterpretCastExpr(Empty);
1613 break;
1614
1615 case pch::EXPR_CXX_CONST_CAST:
1616 S = new (Context) CXXConstCastExpr(Empty);
1617 break;
1618
1619 case pch::EXPR_CXX_FUNCTIONAL_CAST:
1620 S = new (Context) CXXFunctionalCastExpr(Empty);
1621 break;
1622
Sam Weinigeb7f9612010-02-07 06:32:43 +00001623 case pch::EXPR_CXX_BOOL_LITERAL:
1624 S = new (Context) CXXBoolLiteralExpr(Empty);
1625 break;
Sam Weinigce757a72010-01-16 21:21:01 +00001626
Sam Weinigeb7f9612010-02-07 06:32:43 +00001627 case pch::EXPR_CXX_NULL_PTR_LITERAL:
1628 S = new (Context) CXXNullPtrLiteralExpr(Empty);
1629 break;
Chris Lattner14ab24f2010-05-09 06:03:39 +00001630 case pch::EXPR_CXX_TYPEID_EXPR:
1631 S = new (Context) CXXTypeidExpr(Empty, true);
1632 break;
1633 case pch::EXPR_CXX_TYPEID_TYPE:
1634 S = new (Context) CXXTypeidExpr(Empty, false);
1635 break;
Chris Lattner2fbdfcd2010-05-09 06:15:05 +00001636 case pch::EXPR_CXX_THIS:
1637 S = new (Context) CXXThisExpr(Empty);
1638 break;
1639 case pch::EXPR_CXX_THROW:
1640 S = new (Context) CXXThrowExpr(Empty);
1641 break;
Argyrios Kyrtzidis8a507332010-07-02 23:30:15 +00001642 case pch::EXPR_CXX_DEFAULT_ARG: {
1643 bool HasOtherExprStored = Record[PCHStmtReader::NumExprFields];
1644 if (HasOtherExprStored) {
1645 Expr *SubExpr = ReadSubExpr();
1646 S = CXXDefaultArgExpr::Create(*Context, SourceLocation(), 0, SubExpr);
1647 } else
1648 S = new (Context) CXXDefaultArgExpr(Empty);
Chris Lattner030854b2010-05-09 06:40:08 +00001649 break;
Argyrios Kyrtzidis8a507332010-07-02 23:30:15 +00001650 }
Chris Lattnerd2598362010-05-10 00:25:06 +00001651 case pch::EXPR_CXX_BIND_TEMPORARY:
1652 S = new (Context) CXXBindTemporaryExpr(Empty);
1653 break;
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +00001654 case pch::EXPR_CXX_BIND_REFERENCE:
1655 S = new (Context) CXXBindReferenceExpr(Empty);
1656 break;
Chris Lattner59218632010-05-10 01:22:27 +00001657
Douglas Gregored8abf12010-07-08 06:14:04 +00001658 case pch::EXPR_CXX_SCALAR_VALUE_INIT:
1659 S = new (Context) CXXScalarValueInitExpr(Empty);
Chris Lattner59218632010-05-10 01:22:27 +00001660 break;
1661 case pch::EXPR_CXX_NEW:
1662 S = new (Context) CXXNewExpr(Empty);
1663 break;
Argyrios Kyrtzidis95fc98c2010-06-22 17:07:59 +00001664 case pch::EXPR_CXX_DELETE:
1665 S = new (Context) CXXDeleteExpr(Empty);
1666 break;
Argyrios Kyrtzidisde4bd182010-06-28 09:32:03 +00001667 case pch::EXPR_CXX_PSEUDO_DESTRUCTOR:
1668 S = new (Context) CXXPseudoDestructorExpr(Empty);
1669 break;
Chris Lattner59218632010-05-10 01:22:27 +00001670
Chris Lattnerd2598362010-05-10 00:25:06 +00001671 case pch::EXPR_CXX_EXPR_WITH_TEMPORARIES:
1672 S = new (Context) CXXExprWithTemporaries(Empty);
1673 break;
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001674
1675 case pch::EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
1676 S = CXXDependentScopeMemberExpr::CreateEmpty(*Context,
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001677 /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001678 break;
1679
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +00001680 case pch::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
1681 S = DependentScopeDeclRefExpr::CreateEmpty(*Context,
1682 /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]);
1683 break;
1684
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001685 case pch::EXPR_CXX_UNRESOLVED_CONSTRUCT:
1686 S = CXXUnresolvedConstructExpr::CreateEmpty(*Context,
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001687 /*NumArgs=*/Record[PCHStmtReader::NumExprFields]);
1688 break;
1689
1690 case pch::EXPR_CXX_UNRESOLVED_MEMBER:
1691 S = UnresolvedMemberExpr::CreateEmpty(*Context,
1692 /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001693 break;
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +00001694
1695 case pch::EXPR_CXX_UNRESOLVED_LOOKUP:
1696 S = UnresolvedLookupExpr::CreateEmpty(*Context,
1697 /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]);
1698 break;
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +00001699
1700 case pch::EXPR_CXX_UNARY_TYPE_TRAIT:
1701 S = new (Context) UnaryTypeTraitExpr(Empty);
1702 break;
Chris Lattner4c6f9522009-04-27 05:14:47 +00001703 }
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +00001704
Chris Lattner4c6f9522009-04-27 05:14:47 +00001705 // We hit a STMT_STOP, so we're done with this expression.
1706 if (Finished)
1707 break;
1708
1709 ++NumStatementsRead;
1710
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001711 if (S)
1712 Reader.Visit(S);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001713
1714 assert(Idx == Record.size() && "Invalid deserialization of statement");
1715 StmtStack.push_back(S);
1716 }
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001717
1718#ifndef NDEBUG
1719 assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
1720 assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
1721#endif
1722
1723 return StmtStack.pop_back_val();
Chris Lattner4c6f9522009-04-27 05:14:47 +00001724}