blob: 03df4d78d930a2b1188dfd12ef138a9ae67a423c [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);
Sebastian Redl906082e2010-07-20 04:20:21 +0000591 E->setCategory(static_cast<ImplicitCastExpr::ResultCategory>(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++]);
Chris Lattner59218632010-05-10 01:22:27 +00001045 E->setHasInitializer(Record[Idx++]);
1046 bool isArray = Record[Idx++];
1047 unsigned NumPlacementArgs = Record[Idx++];
1048 unsigned NumCtorArgs = Record[Idx++];
1049 E->setOperatorNew(cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
1050 E->setOperatorDelete(
1051 cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
1052 E->setConstructor(
1053 cast_or_null<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
Douglas Gregor4bd40312010-07-13 15:54:32 +00001054 SourceRange TypeIdParens;
1055 TypeIdParens.setBegin(SourceLocation::getFromRawEncoding(Record[Idx++]));
1056 TypeIdParens.setEnd(SourceLocation::getFromRawEncoding(Record[Idx++]));
1057 E->TypeIdParens = TypeIdParens;
Chris Lattner59218632010-05-10 01:22:27 +00001058 E->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1059 E->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1060
1061 E->AllocateArgsArray(*Reader.getContext(), isArray, NumPlacementArgs,
1062 NumCtorArgs);
1063
1064 // Install all the subexpressions.
Chris Lattner59218632010-05-10 01:22:27 +00001065 for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
1066 I != e; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001067 *I = Reader.ReadSubStmt();
Chris Lattner59218632010-05-10 01:22:27 +00001068}
1069
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001070void PCHStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
Argyrios Kyrtzidis95fc98c2010-06-22 17:07:59 +00001071 VisitExpr(E);
1072 E->setGlobalDelete(Record[Idx++]);
1073 E->setArrayForm(Record[Idx++]);
1074 E->setOperatorDelete(
1075 cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001076 E->setArgument(Reader.ReadSubExpr());
Argyrios Kyrtzidis95fc98c2010-06-22 17:07:59 +00001077 E->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
Argyrios Kyrtzidis95fc98c2010-06-22 17:07:59 +00001078}
Chris Lattnerd2598362010-05-10 00:25:06 +00001079
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001080void PCHStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
Argyrios Kyrtzidisde4bd182010-06-28 09:32:03 +00001081 VisitExpr(E);
1082
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001083 E->setBase(Reader.ReadSubExpr());
Argyrios Kyrtzidisde4bd182010-06-28 09:32:03 +00001084 E->setArrow(Record[Idx++]);
1085 E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1086 E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1087 E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1088 E->setScopeTypeInfo(Reader.GetTypeSourceInfo(Record, Idx));
1089 E->setColonColonLoc(Reader.ReadSourceLocation(Record, Idx));
1090 E->setTildeLoc(Reader.ReadSourceLocation(Record, Idx));
1091
1092 IdentifierInfo *II = Reader.GetIdentifierInfo(Record, Idx);
1093 if (II)
1094 E->setDestroyedType(II, Reader.ReadSourceLocation(Record, Idx));
1095 else
1096 E->setDestroyedType(Reader.GetTypeSourceInfo(Record, Idx));
Argyrios Kyrtzidisde4bd182010-06-28 09:32:03 +00001097}
1098
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001099void PCHStmtReader::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
Chris Lattnerd2598362010-05-10 00:25:06 +00001100 VisitExpr(E);
1101 unsigned NumTemps = Record[Idx++];
1102 if (NumTemps) {
Ted Kremenekd04ed412010-05-10 20:06:30 +00001103 E->setNumTemporaries(*Reader.getContext(), NumTemps);
Chris Lattnerd2598362010-05-10 00:25:06 +00001104 for (unsigned i = 0; i != NumTemps; ++i)
1105 E->setTemporary(i, Reader.ReadCXXTemporary(Record, Idx));
1106 }
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001107 E->setSubExpr(Reader.ReadSubExpr());
Chris Lattner030854b2010-05-09 06:40:08 +00001108}
1109
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001110void
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001111PCHStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
1112 VisitExpr(E);
1113
1114 unsigned NumTemplateArgs = Record[Idx++];
1115 assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1116 "Read wrong record during creation ?");
Argyrios Kyrtzidis36c76f02010-06-28 09:31:48 +00001117 if (E->hasExplicitTemplateArgs())
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001118 ReadExplicitTemplateArgumentList(*E->getExplicitTemplateArgumentList(),
1119 NumTemplateArgs);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001120
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001121 E->setBase(Reader.ReadSubExpr());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001122 E->setBaseType(Reader.GetType(Record[Idx++]));
1123 E->setArrow(Record[Idx++]);
1124 E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1125 E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1126 E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1127 E->setFirstQualifierFoundInScope(
1128 cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])));
1129 E->setMember(Reader.ReadDeclarationName(Record, Idx));
1130 E->setMemberLoc(Reader.ReadSourceLocation(Record, Idx));
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001131}
1132
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001133void
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +00001134PCHStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
1135 VisitExpr(E);
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +00001136
1137 unsigned NumTemplateArgs = Record[Idx++];
1138 assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1139 "Read wrong record during creation ?");
1140 if (E->hasExplicitTemplateArgs())
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001141 ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1142 NumTemplateArgs);
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +00001143
1144 E->setDeclName(Reader.ReadDeclarationName(Record, Idx));
1145 E->setLocation(Reader.ReadSourceLocation(Record, Idx));
1146 E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1147 E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +00001148}
1149
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001150void
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001151PCHStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
1152 VisitExpr(E);
1153 assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
1154 ++Idx; // NumArgs;
1155 for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001156 E->setArg(I, Reader.ReadSubExpr());
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001157 E->setTypeBeginLoc(Reader.ReadSourceLocation(Record, Idx));
1158 E->setTypeAsWritten(Reader.GetType(Record[Idx++]));
1159 E->setLParenLoc(Reader.ReadSourceLocation(Record, Idx));
1160 E->setRParenLoc(Reader.ReadSourceLocation(Record, Idx));
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001161}
1162
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001163void PCHStmtReader::VisitOverloadExpr(OverloadExpr *E) {
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001164 VisitExpr(E);
1165
1166 unsigned NumTemplateArgs = Record[Idx++];
1167 assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1168 "Read wrong record during creation ?");
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001169 if (E->hasExplicitTemplateArgs())
1170 ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1171 NumTemplateArgs);
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001172
1173 unsigned NumDecls = Record[Idx++];
1174 UnresolvedSet<8> Decls;
1175 for (unsigned i = 0; i != NumDecls; ++i) {
1176 NamedDecl *D = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
1177 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1178 Decls.addDecl(D, AS);
1179 }
1180 E->initializeResults(*Reader.getContext(), Decls.begin(), Decls.end());
1181
1182 E->setName(Reader.ReadDeclarationName(Record, Idx));
1183 E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1184 E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1185 E->setNameLoc(Reader.ReadSourceLocation(Record, Idx));
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001186}
1187
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001188void PCHStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1189 VisitOverloadExpr(E);
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001190 E->setArrow(Record[Idx++]);
1191 E->setHasUnresolvedUsing(Record[Idx++]);
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001192 E->setBase(Reader.ReadSubExpr());
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001193 E->setBaseType(Reader.GetType(Record[Idx++]));
1194 E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001195}
1196
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001197void PCHStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1198 VisitOverloadExpr(E);
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +00001199 E->setRequiresADL(Record[Idx++]);
1200 E->setOverloaded(Record[Idx++]);
1201 E->setNamingClass(cast_or_null<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])));
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +00001202}
1203
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +00001204void PCHStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1205 VisitExpr(E);
1206 E->UTT = (UnaryTypeTrait)Record[Idx++];
1207 SourceRange Range = Reader.ReadSourceRange(Record, Idx);
1208 E->Loc = Range.getBegin();
1209 E->RParen = Range.getEnd();
1210 E->QueriedType = Reader.GetType(Record[Idx++]);
1211}
1212
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001213Stmt *PCHReader::ReadStmt() {
1214 switch (ReadingKind) {
1215 case Read_Decl:
1216 case Read_Type:
1217 // Read a statement from the current DeclCursor.
Sebastian Redl9137a522010-07-16 17:50:48 +00001218 return ReadStmtFromStream(Chain[0]->DeclsCursor);
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001219 case Read_Stmt:
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001220 return ReadSubStmt();
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001221 }
1222
1223 llvm_unreachable("ReadingKind not set ?");
1224 return 0;
1225}
1226
1227Expr *PCHReader::ReadExpr() {
1228 return cast_or_null<Expr>(ReadStmt());
1229}
Chris Lattner030854b2010-05-09 06:40:08 +00001230
Argyrios Kyrtzidisd98a2ab2010-06-29 22:46:25 +00001231Expr *PCHReader::ReadSubExpr() {
1232 return cast_or_null<Expr>(ReadSubStmt());
1233}
1234
Chris Lattner52e97d12009-04-27 05:41:06 +00001235// Within the bitstream, expressions are stored in Reverse Polish
1236// Notation, with each of the subexpressions preceding the
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001237// expression they are stored in. Subexpressions are stored from last to first.
1238// To evaluate expressions, we continue reading expressions and placing them on
1239// the stack, with expressions having operands removing those operands from the
Chris Lattner52e97d12009-04-27 05:41:06 +00001240// stack. Evaluation terminates when we see a STMT_STOP record, and
1241// the single remaining expression on the stack is our result.
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001242Stmt *PCHReader::ReadStmtFromStream(llvm::BitstreamCursor &Cursor) {
1243
1244 ReadingKindTracker ReadingKind(Read_Stmt, *this);
1245
1246#ifndef NDEBUG
1247 unsigned PrevNumStmts = StmtStack.size();
1248#endif
1249
Chris Lattner4c6f9522009-04-27 05:14:47 +00001250 RecordData Record;
1251 unsigned Idx;
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001252 PCHStmtReader Reader(*this, Record, Idx);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001253 Stmt::EmptyShell Empty;
1254
1255 while (true) {
Chris Lattner52e97d12009-04-27 05:41:06 +00001256 unsigned Code = Cursor.ReadCode();
Chris Lattner4c6f9522009-04-27 05:14:47 +00001257 if (Code == llvm::bitc::END_BLOCK) {
Chris Lattner52e97d12009-04-27 05:41:06 +00001258 if (Cursor.ReadBlockEnd()) {
Douglas Gregora02b1472009-04-28 21:53:25 +00001259 Error("error at end of block in PCH file");
Chris Lattner4c6f9522009-04-27 05:14:47 +00001260 return 0;
1261 }
1262 break;
1263 }
1264
1265 if (Code == llvm::bitc::ENTER_SUBBLOCK) {
1266 // No known subblocks, always skip them.
Chris Lattner52e97d12009-04-27 05:41:06 +00001267 Cursor.ReadSubBlockID();
1268 if (Cursor.SkipBlock()) {
Douglas Gregora02b1472009-04-28 21:53:25 +00001269 Error("malformed block record in PCH file");
Chris Lattner4c6f9522009-04-27 05:14:47 +00001270 return 0;
1271 }
1272 continue;
1273 }
1274
1275 if (Code == llvm::bitc::DEFINE_ABBREV) {
Chris Lattner52e97d12009-04-27 05:41:06 +00001276 Cursor.ReadAbbrevRecord();
Chris Lattner4c6f9522009-04-27 05:14:47 +00001277 continue;
1278 }
1279
1280 Stmt *S = 0;
1281 Idx = 0;
1282 Record.clear();
1283 bool Finished = false;
Chris Lattner52e97d12009-04-27 05:41:06 +00001284 switch ((pch::StmtCode)Cursor.ReadRecord(Code, Record)) {
Chris Lattner4c6f9522009-04-27 05:14:47 +00001285 case pch::STMT_STOP:
1286 Finished = true;
1287 break;
1288
Mike Stump1eb44332009-09-09 15:08:12 +00001289 case pch::STMT_NULL_PTR:
1290 S = 0;
Chris Lattner4c6f9522009-04-27 05:14:47 +00001291 break;
1292
1293 case pch::STMT_NULL:
1294 S = new (Context) NullStmt(Empty);
1295 break;
1296
1297 case pch::STMT_COMPOUND:
1298 S = new (Context) CompoundStmt(Empty);
1299 break;
1300
1301 case pch::STMT_CASE:
1302 S = new (Context) CaseStmt(Empty);
1303 break;
1304
1305 case pch::STMT_DEFAULT:
1306 S = new (Context) DefaultStmt(Empty);
1307 break;
1308
1309 case pch::STMT_LABEL:
1310 S = new (Context) LabelStmt(Empty);
1311 break;
1312
1313 case pch::STMT_IF:
1314 S = new (Context) IfStmt(Empty);
1315 break;
1316
1317 case pch::STMT_SWITCH:
1318 S = new (Context) SwitchStmt(Empty);
1319 break;
1320
1321 case pch::STMT_WHILE:
1322 S = new (Context) WhileStmt(Empty);
1323 break;
1324
1325 case pch::STMT_DO:
1326 S = new (Context) DoStmt(Empty);
1327 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001328
Chris Lattner4c6f9522009-04-27 05:14:47 +00001329 case pch::STMT_FOR:
1330 S = new (Context) ForStmt(Empty);
1331 break;
1332
1333 case pch::STMT_GOTO:
1334 S = new (Context) GotoStmt(Empty);
1335 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001336
Chris Lattner4c6f9522009-04-27 05:14:47 +00001337 case pch::STMT_INDIRECT_GOTO:
1338 S = new (Context) IndirectGotoStmt(Empty);
1339 break;
1340
1341 case pch::STMT_CONTINUE:
1342 S = new (Context) ContinueStmt(Empty);
1343 break;
1344
1345 case pch::STMT_BREAK:
1346 S = new (Context) BreakStmt(Empty);
1347 break;
1348
1349 case pch::STMT_RETURN:
1350 S = new (Context) ReturnStmt(Empty);
1351 break;
1352
1353 case pch::STMT_DECL:
1354 S = new (Context) DeclStmt(Empty);
1355 break;
1356
1357 case pch::STMT_ASM:
1358 S = new (Context) AsmStmt(Empty);
1359 break;
1360
1361 case pch::EXPR_PREDEFINED:
1362 S = new (Context) PredefinedExpr(Empty);
1363 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001364
1365 case pch::EXPR_DECL_REF:
Argyrios Kyrtzidis663e3802010-07-08 13:09:47 +00001366 S = DeclRefExpr::CreateEmpty(*Context,
1367 /*HasQualifier=*/Record[PCHStmtReader::NumExprFields],
1368 /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields + 1]);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001369 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001370
1371 case pch::EXPR_INTEGER_LITERAL:
Chris Lattner4c6f9522009-04-27 05:14:47 +00001372 S = new (Context) IntegerLiteral(Empty);
1373 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001374
Chris Lattner4c6f9522009-04-27 05:14:47 +00001375 case pch::EXPR_FLOATING_LITERAL:
1376 S = new (Context) FloatingLiteral(Empty);
1377 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001378
Chris Lattner4c6f9522009-04-27 05:14:47 +00001379 case pch::EXPR_IMAGINARY_LITERAL:
1380 S = new (Context) ImaginaryLiteral(Empty);
1381 break;
1382
1383 case pch::EXPR_STRING_LITERAL:
Mike Stump1eb44332009-09-09 15:08:12 +00001384 S = StringLiteral::CreateEmpty(*Context,
Chris Lattner4c6f9522009-04-27 05:14:47 +00001385 Record[PCHStmtReader::NumExprFields + 1]);
1386 break;
1387
1388 case pch::EXPR_CHARACTER_LITERAL:
1389 S = new (Context) CharacterLiteral(Empty);
1390 break;
1391
1392 case pch::EXPR_PAREN:
1393 S = new (Context) ParenExpr(Empty);
1394 break;
1395
Argyrios Kyrtzidis37bdfe22010-06-30 08:49:18 +00001396 case pch::EXPR_PAREN_LIST:
1397 S = new (Context) ParenListExpr(Empty);
1398 break;
1399
Chris Lattner4c6f9522009-04-27 05:14:47 +00001400 case pch::EXPR_UNARY_OPERATOR:
1401 S = new (Context) UnaryOperator(Empty);
1402 break;
1403
Douglas Gregor8ecdb652010-04-28 22:16:22 +00001404 case pch::EXPR_OFFSETOF:
1405 S = OffsetOfExpr::CreateEmpty(*Context,
1406 Record[PCHStmtReader::NumExprFields],
1407 Record[PCHStmtReader::NumExprFields + 1]);
1408 break;
1409
Chris Lattner4c6f9522009-04-27 05:14:47 +00001410 case pch::EXPR_SIZEOF_ALIGN_OF:
1411 S = new (Context) SizeOfAlignOfExpr(Empty);
1412 break;
1413
1414 case pch::EXPR_ARRAY_SUBSCRIPT:
1415 S = new (Context) ArraySubscriptExpr(Empty);
1416 break;
1417
1418 case pch::EXPR_CALL:
Argyrios Kyrtzidisba0a9002009-07-14 03:19:21 +00001419 S = new (Context) CallExpr(*Context, Stmt::CallExprClass, Empty);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001420 break;
1421
Argyrios Kyrtzidis663e3802010-07-08 13:09:47 +00001422 case pch::EXPR_MEMBER: {
1423 // We load everything here and fully initialize it at creation.
1424 // That way we can use MemberExpr::Create and don't have to duplicate its
1425 // logic with a MemberExpr::CreateEmpty.
1426
1427 assert(Idx == 0);
1428 NestedNameSpecifier *NNS = 0;
1429 SourceRange QualifierRange;
1430 if (Record[Idx++]) { // HasQualifier.
1431 NNS = ReadNestedNameSpecifier(Record, Idx);
1432 QualifierRange = ReadSourceRange(Record, Idx);
1433 }
1434
1435 TemplateArgumentListInfo ArgInfo;
1436 unsigned NumTemplateArgs = Record[Idx++];
1437 if (NumTemplateArgs) {
1438 ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx));
1439 ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx));
1440 for (unsigned i = 0; i != NumTemplateArgs; ++i)
1441 ArgInfo.addArgument(ReadTemplateArgumentLoc(Record, Idx));
1442 }
1443
1444 NamedDecl *FoundD = cast_or_null<NamedDecl>(GetDecl(Record[Idx++]));
1445 AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1446 DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
1447
1448 QualType T = GetType(Record[Idx++]);
1449 Expr *Base = ReadSubExpr();
1450 ValueDecl *MemberD = cast<ValueDecl>(GetDecl(Record[Idx++]));
1451 SourceLocation MemberLoc = ReadSourceLocation(Record, Idx);
1452 bool IsArrow = Record[Idx++];
1453
1454 S = MemberExpr::Create(*Context, Base, IsArrow, NNS, QualifierRange,
1455 MemberD, FoundDecl, MemberLoc,
1456 NumTemplateArgs ? &ArgInfo : 0, T);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001457 break;
Argyrios Kyrtzidis663e3802010-07-08 13:09:47 +00001458 }
Chris Lattner4c6f9522009-04-27 05:14:47 +00001459
1460 case pch::EXPR_BINARY_OPERATOR:
1461 S = new (Context) BinaryOperator(Empty);
1462 break;
1463
1464 case pch::EXPR_COMPOUND_ASSIGN_OPERATOR:
1465 S = new (Context) CompoundAssignOperator(Empty);
1466 break;
1467
1468 case pch::EXPR_CONDITIONAL_OPERATOR:
1469 S = new (Context) ConditionalOperator(Empty);
1470 break;
1471
1472 case pch::EXPR_IMPLICIT_CAST:
1473 S = new (Context) ImplicitCastExpr(Empty);
1474 break;
1475
1476 case pch::EXPR_CSTYLE_CAST:
1477 S = new (Context) CStyleCastExpr(Empty);
1478 break;
1479
1480 case pch::EXPR_COMPOUND_LITERAL:
1481 S = new (Context) CompoundLiteralExpr(Empty);
1482 break;
1483
1484 case pch::EXPR_EXT_VECTOR_ELEMENT:
1485 S = new (Context) ExtVectorElementExpr(Empty);
1486 break;
1487
1488 case pch::EXPR_INIT_LIST:
Ted Kremenek709210f2010-04-13 23:39:13 +00001489 S = new (Context) InitListExpr(*getContext(), Empty);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001490 break;
1491
1492 case pch::EXPR_DESIGNATED_INIT:
Chris Lattnerd1d64a02009-04-27 21:45:14 +00001493 S = DesignatedInitExpr::CreateEmpty(*Context,
Chris Lattner4c6f9522009-04-27 05:14:47 +00001494 Record[PCHStmtReader::NumExprFields] - 1);
Mike Stump1eb44332009-09-09 15:08:12 +00001495
Chris Lattner4c6f9522009-04-27 05:14:47 +00001496 break;
1497
1498 case pch::EXPR_IMPLICIT_VALUE_INIT:
1499 S = new (Context) ImplicitValueInitExpr(Empty);
1500 break;
1501
1502 case pch::EXPR_VA_ARG:
1503 S = new (Context) VAArgExpr(Empty);
1504 break;
1505
1506 case pch::EXPR_ADDR_LABEL:
1507 S = new (Context) AddrLabelExpr(Empty);
1508 break;
1509
1510 case pch::EXPR_STMT:
1511 S = new (Context) StmtExpr(Empty);
1512 break;
1513
1514 case pch::EXPR_TYPES_COMPATIBLE:
1515 S = new (Context) TypesCompatibleExpr(Empty);
1516 break;
1517
1518 case pch::EXPR_CHOOSE:
1519 S = new (Context) ChooseExpr(Empty);
1520 break;
1521
1522 case pch::EXPR_GNU_NULL:
1523 S = new (Context) GNUNullExpr(Empty);
1524 break;
1525
1526 case pch::EXPR_SHUFFLE_VECTOR:
1527 S = new (Context) ShuffleVectorExpr(Empty);
1528 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001529
Chris Lattner4c6f9522009-04-27 05:14:47 +00001530 case pch::EXPR_BLOCK:
1531 S = new (Context) BlockExpr(Empty);
1532 break;
1533
1534 case pch::EXPR_BLOCK_DECL_REF:
1535 S = new (Context) BlockDeclRefExpr(Empty);
1536 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001537
Chris Lattner4c6f9522009-04-27 05:14:47 +00001538 case pch::EXPR_OBJC_STRING_LITERAL:
1539 S = new (Context) ObjCStringLiteral(Empty);
1540 break;
1541 case pch::EXPR_OBJC_ENCODE:
1542 S = new (Context) ObjCEncodeExpr(Empty);
1543 break;
1544 case pch::EXPR_OBJC_SELECTOR_EXPR:
1545 S = new (Context) ObjCSelectorExpr(Empty);
1546 break;
1547 case pch::EXPR_OBJC_PROTOCOL_EXPR:
1548 S = new (Context) ObjCProtocolExpr(Empty);
1549 break;
1550 case pch::EXPR_OBJC_IVAR_REF_EXPR:
1551 S = new (Context) ObjCIvarRefExpr(Empty);
1552 break;
1553 case pch::EXPR_OBJC_PROPERTY_REF_EXPR:
1554 S = new (Context) ObjCPropertyRefExpr(Empty);
1555 break;
1556 case pch::EXPR_OBJC_KVC_REF_EXPR:
Fariborz Jahanian09105f52009-08-20 17:02:02 +00001557 S = new (Context) ObjCImplicitSetterGetterRefExpr(Empty);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001558 break;
1559 case pch::EXPR_OBJC_MESSAGE_EXPR:
Douglas Gregor04badcf2010-04-21 00:45:42 +00001560 S = ObjCMessageExpr::CreateEmpty(*Context,
1561 Record[PCHStmtReader::NumExprFields]);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001562 break;
1563 case pch::EXPR_OBJC_SUPER_EXPR:
1564 S = new (Context) ObjCSuperExpr(Empty);
1565 break;
Steve Narofff242b1b2009-07-24 17:54:45 +00001566 case pch::EXPR_OBJC_ISA:
1567 S = new (Context) ObjCIsaExpr(Empty);
1568 break;
Chris Lattner4c6f9522009-04-27 05:14:47 +00001569 case pch::STMT_OBJC_FOR_COLLECTION:
1570 S = new (Context) ObjCForCollectionStmt(Empty);
1571 break;
1572 case pch::STMT_OBJC_CATCH:
1573 S = new (Context) ObjCAtCatchStmt(Empty);
1574 break;
1575 case pch::STMT_OBJC_FINALLY:
1576 S = new (Context) ObjCAtFinallyStmt(Empty);
1577 break;
1578 case pch::STMT_OBJC_AT_TRY:
Douglas Gregor8f5e3dd2010-04-23 22:50:49 +00001579 S = ObjCAtTryStmt::CreateEmpty(*Context,
1580 Record[PCHStmtReader::NumStmtFields],
1581 Record[PCHStmtReader::NumStmtFields + 1]);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001582 break;
1583 case pch::STMT_OBJC_AT_SYNCHRONIZED:
1584 S = new (Context) ObjCAtSynchronizedStmt(Empty);
1585 break;
1586 case pch::STMT_OBJC_AT_THROW:
1587 S = new (Context) ObjCAtThrowStmt(Empty);
1588 break;
Mike Stump1eb44332009-09-09 15:08:12 +00001589
Argyrios Kyrtzidisba0a9002009-07-14 03:19:21 +00001590 case pch::EXPR_CXX_OPERATOR_CALL:
1591 S = new (Context) CXXOperatorCallExpr(*Context, Empty);
1592 break;
Chris Lattner1817bd42010-05-09 05:36:05 +00001593
1594 case pch::EXPR_CXX_MEMBER_CALL:
1595 S = new (Context) CXXMemberCallExpr(*Context, Empty);
1596 break;
Douglas Gregor39da0b82009-09-09 23:08:42 +00001597
1598 case pch::EXPR_CXX_CONSTRUCT:
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +00001599 S = new (Context) CXXConstructExpr(Empty);
1600 break;
1601
1602 case pch::EXPR_CXX_TEMPORARY_OBJECT:
1603 S = new (Context) CXXTemporaryObjectExpr(Empty);
Douglas Gregor39da0b82009-09-09 23:08:42 +00001604 break;
Sam Weinigce757a72010-01-16 21:21:01 +00001605
1606 case pch::EXPR_CXX_STATIC_CAST:
1607 S = new (Context) CXXStaticCastExpr(Empty);
1608 break;
1609
1610 case pch::EXPR_CXX_DYNAMIC_CAST:
1611 S = new (Context) CXXDynamicCastExpr(Empty);
1612 break;
1613
1614 case pch::EXPR_CXX_REINTERPRET_CAST:
1615 S = new (Context) CXXReinterpretCastExpr(Empty);
1616 break;
1617
1618 case pch::EXPR_CXX_CONST_CAST:
1619 S = new (Context) CXXConstCastExpr(Empty);
1620 break;
1621
1622 case pch::EXPR_CXX_FUNCTIONAL_CAST:
1623 S = new (Context) CXXFunctionalCastExpr(Empty);
1624 break;
1625
Sam Weinigeb7f9612010-02-07 06:32:43 +00001626 case pch::EXPR_CXX_BOOL_LITERAL:
1627 S = new (Context) CXXBoolLiteralExpr(Empty);
1628 break;
Sam Weinigce757a72010-01-16 21:21:01 +00001629
Sam Weinigeb7f9612010-02-07 06:32:43 +00001630 case pch::EXPR_CXX_NULL_PTR_LITERAL:
1631 S = new (Context) CXXNullPtrLiteralExpr(Empty);
1632 break;
Chris Lattner14ab24f2010-05-09 06:03:39 +00001633 case pch::EXPR_CXX_TYPEID_EXPR:
1634 S = new (Context) CXXTypeidExpr(Empty, true);
1635 break;
1636 case pch::EXPR_CXX_TYPEID_TYPE:
1637 S = new (Context) CXXTypeidExpr(Empty, false);
1638 break;
Chris Lattner2fbdfcd2010-05-09 06:15:05 +00001639 case pch::EXPR_CXX_THIS:
1640 S = new (Context) CXXThisExpr(Empty);
1641 break;
1642 case pch::EXPR_CXX_THROW:
1643 S = new (Context) CXXThrowExpr(Empty);
1644 break;
Argyrios Kyrtzidis8a507332010-07-02 23:30:15 +00001645 case pch::EXPR_CXX_DEFAULT_ARG: {
1646 bool HasOtherExprStored = Record[PCHStmtReader::NumExprFields];
1647 if (HasOtherExprStored) {
1648 Expr *SubExpr = ReadSubExpr();
1649 S = CXXDefaultArgExpr::Create(*Context, SourceLocation(), 0, SubExpr);
1650 } else
1651 S = new (Context) CXXDefaultArgExpr(Empty);
Chris Lattner030854b2010-05-09 06:40:08 +00001652 break;
Argyrios Kyrtzidis8a507332010-07-02 23:30:15 +00001653 }
Chris Lattnerd2598362010-05-10 00:25:06 +00001654 case pch::EXPR_CXX_BIND_TEMPORARY:
1655 S = new (Context) CXXBindTemporaryExpr(Empty);
1656 break;
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +00001657 case pch::EXPR_CXX_BIND_REFERENCE:
1658 S = new (Context) CXXBindReferenceExpr(Empty);
1659 break;
Chris Lattner59218632010-05-10 01:22:27 +00001660
Douglas Gregored8abf12010-07-08 06:14:04 +00001661 case pch::EXPR_CXX_SCALAR_VALUE_INIT:
1662 S = new (Context) CXXScalarValueInitExpr(Empty);
Chris Lattner59218632010-05-10 01:22:27 +00001663 break;
1664 case pch::EXPR_CXX_NEW:
1665 S = new (Context) CXXNewExpr(Empty);
1666 break;
Argyrios Kyrtzidis95fc98c2010-06-22 17:07:59 +00001667 case pch::EXPR_CXX_DELETE:
1668 S = new (Context) CXXDeleteExpr(Empty);
1669 break;
Argyrios Kyrtzidisde4bd182010-06-28 09:32:03 +00001670 case pch::EXPR_CXX_PSEUDO_DESTRUCTOR:
1671 S = new (Context) CXXPseudoDestructorExpr(Empty);
1672 break;
Chris Lattner59218632010-05-10 01:22:27 +00001673
Chris Lattnerd2598362010-05-10 00:25:06 +00001674 case pch::EXPR_CXX_EXPR_WITH_TEMPORARIES:
1675 S = new (Context) CXXExprWithTemporaries(Empty);
1676 break;
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001677
1678 case pch::EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
1679 S = CXXDependentScopeMemberExpr::CreateEmpty(*Context,
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001680 /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001681 break;
1682
Argyrios Kyrtzidis12dffcd2010-06-28 09:31:56 +00001683 case pch::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
1684 S = DependentScopeDeclRefExpr::CreateEmpty(*Context,
1685 /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]);
1686 break;
1687
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001688 case pch::EXPR_CXX_UNRESOLVED_CONSTRUCT:
1689 S = CXXUnresolvedConstructExpr::CreateEmpty(*Context,
Argyrios Kyrtzidisa77eb082010-06-25 09:03:26 +00001690 /*NumArgs=*/Record[PCHStmtReader::NumExprFields]);
1691 break;
1692
1693 case pch::EXPR_CXX_UNRESOLVED_MEMBER:
1694 S = UnresolvedMemberExpr::CreateEmpty(*Context,
1695 /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]);
Argyrios Kyrtzidis8dfbd8b2010-06-24 08:57:31 +00001696 break;
Argyrios Kyrtzidisbd65bb52010-06-25 09:03:34 +00001697
1698 case pch::EXPR_CXX_UNRESOLVED_LOOKUP:
1699 S = UnresolvedLookupExpr::CreateEmpty(*Context,
1700 /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]);
1701 break;
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +00001702
1703 case pch::EXPR_CXX_UNARY_TYPE_TRAIT:
1704 S = new (Context) UnaryTypeTraitExpr(Empty);
1705 break;
Chris Lattner4c6f9522009-04-27 05:14:47 +00001706 }
Argyrios Kyrtzidis6d00c132010-07-10 11:46:15 +00001707
Chris Lattner4c6f9522009-04-27 05:14:47 +00001708 // We hit a STMT_STOP, so we're done with this expression.
1709 if (Finished)
1710 break;
1711
1712 ++NumStatementsRead;
1713
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001714 if (S)
1715 Reader.Visit(S);
Chris Lattner4c6f9522009-04-27 05:14:47 +00001716
1717 assert(Idx == Record.size() && "Invalid deserialization of statement");
1718 StmtStack.push_back(S);
1719 }
Argyrios Kyrtzidis919e6932010-06-28 22:28:35 +00001720
1721#ifndef NDEBUG
1722 assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
1723 assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
1724#endif
1725
1726 return StmtStack.pop_back_val();
Chris Lattner4c6f9522009-04-27 05:14:47 +00001727}