1 //===--- ASTReaderStmt.cpp - Stmt/Expr Deserialization ----------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Statement/expression deserialization. This implements the
11 // ASTReader::ReadStmt method.
13 //===----------------------------------------------------------------------===//
15 #include "clang/Serialization/ASTReader.h"
16 #include "clang/AST/DeclCXX.h"
17 #include "clang/AST/StmtVisitor.h"
18 using namespace clang
;
19 using namespace clang::serialization
;
23 class ASTStmtReader
: public StmtVisitor
<ASTStmtReader
> {
25 ASTReader::PerFileData
&F
;
26 llvm::BitstreamCursor
&DeclsCursor
;
27 const ASTReader::RecordData
&Record
;
30 SourceLocation
ReadSourceLocation(const ASTReader::RecordData
&R
,
32 return Reader
.ReadSourceLocation(F
, R
, I
);
34 SourceRange
ReadSourceRange(const ASTReader::RecordData
&R
, unsigned &I
) {
35 return Reader
.ReadSourceRange(F
, R
, I
);
37 TypeSourceInfo
*GetTypeSourceInfo(const ASTReader::RecordData
&R
,
39 return Reader
.GetTypeSourceInfo(F
, R
, I
);
41 void ReadDeclarationNameLoc(DeclarationNameLoc
&DNLoc
, DeclarationName Name
,
42 const ASTReader::RecordData
&R
, unsigned &I
) {
43 Reader
.ReadDeclarationNameLoc(F
, DNLoc
, Name
, R
, I
);
45 void ReadDeclarationNameInfo(DeclarationNameInfo
&NameInfo
,
46 const ASTReader::RecordData
&R
, unsigned &I
) {
47 Reader
.ReadDeclarationNameInfo(F
, NameInfo
, R
, I
);
51 ASTStmtReader(ASTReader
&Reader
, ASTReader::PerFileData
&F
,
52 llvm::BitstreamCursor
&Cursor
,
53 const ASTReader::RecordData
&Record
, unsigned &Idx
)
54 : Reader(Reader
), F(F
), DeclsCursor(Cursor
), Record(Record
), Idx(Idx
) { }
56 /// \brief The number of record fields required for the Stmt class
58 static const unsigned NumStmtFields
= 0;
60 /// \brief The number of record fields required for the Expr class
62 static const unsigned NumExprFields
= NumStmtFields
+ 5;
64 /// \brief Read and initialize a ExplicitTemplateArgumentList structure.
65 void ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList
&ArgList
,
66 unsigned NumTemplateArgs
);
68 void VisitStmt(Stmt
*S
);
69 void VisitNullStmt(NullStmt
*S
);
70 void VisitCompoundStmt(CompoundStmt
*S
);
71 void VisitSwitchCase(SwitchCase
*S
);
72 void VisitCaseStmt(CaseStmt
*S
);
73 void VisitDefaultStmt(DefaultStmt
*S
);
74 void VisitLabelStmt(LabelStmt
*S
);
75 void VisitIfStmt(IfStmt
*S
);
76 void VisitSwitchStmt(SwitchStmt
*S
);
77 void VisitWhileStmt(WhileStmt
*S
);
78 void VisitDoStmt(DoStmt
*S
);
79 void VisitForStmt(ForStmt
*S
);
80 void VisitGotoStmt(GotoStmt
*S
);
81 void VisitIndirectGotoStmt(IndirectGotoStmt
*S
);
82 void VisitContinueStmt(ContinueStmt
*S
);
83 void VisitBreakStmt(BreakStmt
*S
);
84 void VisitReturnStmt(ReturnStmt
*S
);
85 void VisitDeclStmt(DeclStmt
*S
);
86 void VisitAsmStmt(AsmStmt
*S
);
87 void VisitExpr(Expr
*E
);
88 void VisitPredefinedExpr(PredefinedExpr
*E
);
89 void VisitDeclRefExpr(DeclRefExpr
*E
);
90 void VisitIntegerLiteral(IntegerLiteral
*E
);
91 void VisitFloatingLiteral(FloatingLiteral
*E
);
92 void VisitImaginaryLiteral(ImaginaryLiteral
*E
);
93 void VisitStringLiteral(StringLiteral
*E
);
94 void VisitCharacterLiteral(CharacterLiteral
*E
);
95 void VisitParenExpr(ParenExpr
*E
);
96 void VisitParenListExpr(ParenListExpr
*E
);
97 void VisitUnaryOperator(UnaryOperator
*E
);
98 void VisitOffsetOfExpr(OffsetOfExpr
*E
);
99 void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr
*E
);
100 void VisitArraySubscriptExpr(ArraySubscriptExpr
*E
);
101 void VisitCallExpr(CallExpr
*E
);
102 void VisitMemberExpr(MemberExpr
*E
);
103 void VisitCastExpr(CastExpr
*E
);
104 void VisitBinaryOperator(BinaryOperator
*E
);
105 void VisitCompoundAssignOperator(CompoundAssignOperator
*E
);
106 void VisitConditionalOperator(ConditionalOperator
*E
);
107 void VisitImplicitCastExpr(ImplicitCastExpr
*E
);
108 void VisitExplicitCastExpr(ExplicitCastExpr
*E
);
109 void VisitCStyleCastExpr(CStyleCastExpr
*E
);
110 void VisitCompoundLiteralExpr(CompoundLiteralExpr
*E
);
111 void VisitExtVectorElementExpr(ExtVectorElementExpr
*E
);
112 void VisitInitListExpr(InitListExpr
*E
);
113 void VisitDesignatedInitExpr(DesignatedInitExpr
*E
);
114 void VisitImplicitValueInitExpr(ImplicitValueInitExpr
*E
);
115 void VisitVAArgExpr(VAArgExpr
*E
);
116 void VisitAddrLabelExpr(AddrLabelExpr
*E
);
117 void VisitStmtExpr(StmtExpr
*E
);
118 void VisitChooseExpr(ChooseExpr
*E
);
119 void VisitGNUNullExpr(GNUNullExpr
*E
);
120 void VisitShuffleVectorExpr(ShuffleVectorExpr
*E
);
121 void VisitBlockExpr(BlockExpr
*E
);
122 void VisitBlockDeclRefExpr(BlockDeclRefExpr
*E
);
123 void VisitObjCStringLiteral(ObjCStringLiteral
*E
);
124 void VisitObjCEncodeExpr(ObjCEncodeExpr
*E
);
125 void VisitObjCSelectorExpr(ObjCSelectorExpr
*E
);
126 void VisitObjCProtocolExpr(ObjCProtocolExpr
*E
);
127 void VisitObjCIvarRefExpr(ObjCIvarRefExpr
*E
);
128 void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr
*E
);
129 void VisitObjCMessageExpr(ObjCMessageExpr
*E
);
130 void VisitObjCIsaExpr(ObjCIsaExpr
*E
);
132 void VisitObjCForCollectionStmt(ObjCForCollectionStmt
*);
133 void VisitObjCAtCatchStmt(ObjCAtCatchStmt
*);
134 void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt
*);
135 void VisitObjCAtTryStmt(ObjCAtTryStmt
*);
136 void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt
*);
137 void VisitObjCAtThrowStmt(ObjCAtThrowStmt
*);
140 void VisitCXXCatchStmt(CXXCatchStmt
*S
);
141 void VisitCXXTryStmt(CXXTryStmt
*S
);
143 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr
*E
);
144 void VisitCXXConstructExpr(CXXConstructExpr
*E
);
145 void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr
*E
);
146 void VisitCXXNamedCastExpr(CXXNamedCastExpr
*E
);
147 void VisitCXXStaticCastExpr(CXXStaticCastExpr
*E
);
148 void VisitCXXDynamicCastExpr(CXXDynamicCastExpr
*E
);
149 void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr
*E
);
150 void VisitCXXConstCastExpr(CXXConstCastExpr
*E
);
151 void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr
*E
);
152 void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr
*E
);
153 void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr
*E
);
154 void VisitCXXTypeidExpr(CXXTypeidExpr
*E
);
155 void VisitCXXUuidofExpr(CXXUuidofExpr
*E
);
156 void VisitCXXThisExpr(CXXThisExpr
*E
);
157 void VisitCXXThrowExpr(CXXThrowExpr
*E
);
158 void VisitCXXDefaultArgExpr(CXXDefaultArgExpr
*E
);
159 void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr
*E
);
161 void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr
*E
);
162 void VisitCXXNewExpr(CXXNewExpr
*E
);
163 void VisitCXXDeleteExpr(CXXDeleteExpr
*E
);
164 void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr
*E
);
166 void VisitExprWithCleanups(ExprWithCleanups
*E
);
168 void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr
*E
);
169 void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr
*E
);
170 void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr
*E
);
172 void VisitOverloadExpr(OverloadExpr
*E
);
173 void VisitUnresolvedMemberExpr(UnresolvedMemberExpr
*E
);
174 void VisitUnresolvedLookupExpr(UnresolvedLookupExpr
*E
);
176 void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr
*E
);
177 void VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr
*E
);
178 void VisitCXXNoexceptExpr(CXXNoexceptExpr
*E
);
180 void VisitOpaqueValueExpr(OpaqueValueExpr
*E
);
185 ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList
&ArgList
,
186 unsigned NumTemplateArgs
) {
187 TemplateArgumentListInfo ArgInfo
;
188 ArgInfo
.setLAngleLoc(ReadSourceLocation(Record
, Idx
));
189 ArgInfo
.setRAngleLoc(ReadSourceLocation(Record
, Idx
));
190 for (unsigned i
= 0; i
!= NumTemplateArgs
; ++i
)
192 Reader
.ReadTemplateArgumentLoc(F
, Record
, Idx
));
193 ArgList
.initializeFrom(ArgInfo
);
196 void ASTStmtReader::VisitStmt(Stmt
*S
) {
197 assert(Idx
== NumStmtFields
&& "Incorrect statement field count");
200 void ASTStmtReader::VisitNullStmt(NullStmt
*S
) {
202 S
->setSemiLoc(ReadSourceLocation(Record
, Idx
));
203 S
->LeadingEmptyMacro
= Record
[Idx
++];
206 void ASTStmtReader::VisitCompoundStmt(CompoundStmt
*S
) {
208 llvm::SmallVector
<Stmt
*, 16> Stmts
;
209 unsigned NumStmts
= Record
[Idx
++];
211 Stmts
.push_back(Reader
.ReadSubStmt());
212 S
->setStmts(*Reader
.getContext(), Stmts
.data(), Stmts
.size());
213 S
->setLBracLoc(ReadSourceLocation(Record
, Idx
));
214 S
->setRBracLoc(ReadSourceLocation(Record
, Idx
));
217 void ASTStmtReader::VisitSwitchCase(SwitchCase
*S
) {
219 Reader
.RecordSwitchCaseID(S
, Record
[Idx
++]);
222 void ASTStmtReader::VisitCaseStmt(CaseStmt
*S
) {
224 S
->setLHS(Reader
.ReadSubExpr());
225 S
->setRHS(Reader
.ReadSubExpr());
226 S
->setSubStmt(Reader
.ReadSubStmt());
227 S
->setCaseLoc(ReadSourceLocation(Record
, Idx
));
228 S
->setEllipsisLoc(ReadSourceLocation(Record
, Idx
));
229 S
->setColonLoc(ReadSourceLocation(Record
, Idx
));
232 void ASTStmtReader::VisitDefaultStmt(DefaultStmt
*S
) {
234 S
->setSubStmt(Reader
.ReadSubStmt());
235 S
->setDefaultLoc(ReadSourceLocation(Record
, Idx
));
236 S
->setColonLoc(ReadSourceLocation(Record
, Idx
));
239 void ASTStmtReader::VisitLabelStmt(LabelStmt
*S
) {
241 S
->setID(Reader
.GetIdentifierInfo(Record
, Idx
));
242 S
->setSubStmt(Reader
.ReadSubStmt());
243 S
->setIdentLoc(ReadSourceLocation(Record
, Idx
));
244 S
->setUsed(Record
[Idx
++]);
245 S
->setUnusedAttribute(Record
[Idx
++]);
246 Reader
.RecordLabelStmt(S
, Record
[Idx
++]);
249 void ASTStmtReader::VisitIfStmt(IfStmt
*S
) {
251 S
->setConditionVariable(*Reader
.getContext(),
252 cast_or_null
<VarDecl
>(Reader
.GetDecl(Record
[Idx
++])));
253 S
->setCond(Reader
.ReadSubExpr());
254 S
->setThen(Reader
.ReadSubStmt());
255 S
->setElse(Reader
.ReadSubStmt());
256 S
->setIfLoc(ReadSourceLocation(Record
, Idx
));
257 S
->setElseLoc(ReadSourceLocation(Record
, Idx
));
260 void ASTStmtReader::VisitSwitchStmt(SwitchStmt
*S
) {
262 S
->setConditionVariable(*Reader
.getContext(),
263 cast_or_null
<VarDecl
>(Reader
.GetDecl(Record
[Idx
++])));
264 S
->setCond(Reader
.ReadSubExpr());
265 S
->setBody(Reader
.ReadSubStmt());
266 S
->setSwitchLoc(ReadSourceLocation(Record
, Idx
));
268 S
->setAllEnumCasesCovered();
270 SwitchCase
*PrevSC
= 0;
271 for (unsigned N
= Record
.size(); Idx
!= N
; ++Idx
) {
272 SwitchCase
*SC
= Reader
.getSwitchCaseWithID(Record
[Idx
]);
274 PrevSC
->setNextSwitchCase(SC
);
276 S
->setSwitchCaseList(SC
);
282 void ASTStmtReader::VisitWhileStmt(WhileStmt
*S
) {
284 S
->setConditionVariable(*Reader
.getContext(),
285 cast_or_null
<VarDecl
>(Reader
.GetDecl(Record
[Idx
++])));
286 S
->setCond(Reader
.ReadSubExpr());
287 S
->setBody(Reader
.ReadSubStmt());
288 S
->setWhileLoc(ReadSourceLocation(Record
, Idx
));
291 void ASTStmtReader::VisitDoStmt(DoStmt
*S
) {
293 S
->setCond(Reader
.ReadSubExpr());
294 S
->setBody(Reader
.ReadSubStmt());
295 S
->setDoLoc(ReadSourceLocation(Record
, Idx
));
296 S
->setWhileLoc(ReadSourceLocation(Record
, Idx
));
297 S
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
300 void ASTStmtReader::VisitForStmt(ForStmt
*S
) {
302 S
->setInit(Reader
.ReadSubStmt());
303 S
->setCond(Reader
.ReadSubExpr());
304 S
->setConditionVariable(*Reader
.getContext(),
305 cast_or_null
<VarDecl
>(Reader
.GetDecl(Record
[Idx
++])));
306 S
->setInc(Reader
.ReadSubExpr());
307 S
->setBody(Reader
.ReadSubStmt());
308 S
->setForLoc(ReadSourceLocation(Record
, Idx
));
309 S
->setLParenLoc(ReadSourceLocation(Record
, Idx
));
310 S
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
313 void ASTStmtReader::VisitGotoStmt(GotoStmt
*S
) {
315 Reader
.SetLabelOf(S
, Record
[Idx
++]);
316 S
->setGotoLoc(ReadSourceLocation(Record
, Idx
));
317 S
->setLabelLoc(ReadSourceLocation(Record
, Idx
));
320 void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt
*S
) {
322 S
->setGotoLoc(ReadSourceLocation(Record
, Idx
));
323 S
->setStarLoc(ReadSourceLocation(Record
, Idx
));
324 S
->setTarget(Reader
.ReadSubExpr());
327 void ASTStmtReader::VisitContinueStmt(ContinueStmt
*S
) {
329 S
->setContinueLoc(ReadSourceLocation(Record
, Idx
));
332 void ASTStmtReader::VisitBreakStmt(BreakStmt
*S
) {
334 S
->setBreakLoc(ReadSourceLocation(Record
, Idx
));
337 void ASTStmtReader::VisitReturnStmt(ReturnStmt
*S
) {
339 S
->setRetValue(Reader
.ReadSubExpr());
340 S
->setReturnLoc(ReadSourceLocation(Record
, Idx
));
341 S
->setNRVOCandidate(cast_or_null
<VarDecl
>(Reader
.GetDecl(Record
[Idx
++])));
344 void ASTStmtReader::VisitDeclStmt(DeclStmt
*S
) {
346 S
->setStartLoc(ReadSourceLocation(Record
, Idx
));
347 S
->setEndLoc(ReadSourceLocation(Record
, Idx
));
349 if (Idx
+ 1 == Record
.size()) {
350 // Single declaration
351 S
->setDeclGroup(DeclGroupRef(Reader
.GetDecl(Record
[Idx
++])));
353 llvm::SmallVector
<Decl
*, 16> Decls
;
354 Decls
.reserve(Record
.size() - Idx
);
355 for (unsigned N
= Record
.size(); Idx
!= N
; ++Idx
)
356 Decls
.push_back(Reader
.GetDecl(Record
[Idx
]));
357 S
->setDeclGroup(DeclGroupRef(DeclGroup::Create(*Reader
.getContext(),
363 void ASTStmtReader::VisitAsmStmt(AsmStmt
*S
) {
365 unsigned NumOutputs
= Record
[Idx
++];
366 unsigned NumInputs
= Record
[Idx
++];
367 unsigned NumClobbers
= Record
[Idx
++];
368 S
->setAsmLoc(ReadSourceLocation(Record
, Idx
));
369 S
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
370 S
->setVolatile(Record
[Idx
++]);
371 S
->setSimple(Record
[Idx
++]);
372 S
->setMSAsm(Record
[Idx
++]);
374 S
->setAsmString(cast_or_null
<StringLiteral
>(Reader
.ReadSubStmt()));
376 // Outputs and inputs
377 llvm::SmallVector
<IdentifierInfo
*, 16> Names
;
378 llvm::SmallVector
<StringLiteral
*, 16> Constraints
;
379 llvm::SmallVector
<Stmt
*, 16> Exprs
;
380 for (unsigned I
= 0, N
= NumOutputs
+ NumInputs
; I
!= N
; ++I
) {
381 Names
.push_back(Reader
.GetIdentifierInfo(Record
, Idx
));
382 Constraints
.push_back(cast_or_null
<StringLiteral
>(Reader
.ReadSubStmt()));
383 Exprs
.push_back(Reader
.ReadSubStmt());
387 llvm::SmallVector
<StringLiteral
*, 16> Clobbers
;
388 for (unsigned I
= 0; I
!= NumClobbers
; ++I
)
389 Clobbers
.push_back(cast_or_null
<StringLiteral
>(Reader
.ReadSubStmt()));
391 S
->setOutputsAndInputsAndClobbers(*Reader
.getContext(),
392 Names
.data(), Constraints
.data(),
393 Exprs
.data(), NumOutputs
, NumInputs
,
394 Clobbers
.data(), NumClobbers
);
397 void ASTStmtReader::VisitExpr(Expr
*E
) {
399 E
->setType(Reader
.GetType(Record
[Idx
++]));
400 E
->setTypeDependent(Record
[Idx
++]);
401 E
->setValueDependent(Record
[Idx
++]);
402 E
->setValueKind(static_cast<ExprValueKind
>(Record
[Idx
++]));
403 E
->setObjectKind(static_cast<ExprObjectKind
>(Record
[Idx
++]));
404 assert(Idx
== NumExprFields
&& "Incorrect expression field count");
407 void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr
*E
) {
409 E
->setLocation(ReadSourceLocation(Record
, Idx
));
410 E
->setIdentType((PredefinedExpr::IdentType
)Record
[Idx
++]);
413 void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr
*E
) {
416 bool HasQualifier
= Record
[Idx
++];
417 unsigned NumTemplateArgs
= Record
[Idx
++];
419 E
->DecoratedD
.setInt((HasQualifier
? DeclRefExpr::HasQualifierFlag
: 0) |
420 (NumTemplateArgs
? DeclRefExpr::HasExplicitTemplateArgumentListFlag
: 0));
423 E
->getNameQualifier()->NNS
= Reader
.ReadNestedNameSpecifier(Record
, Idx
);
424 E
->getNameQualifier()->Range
= ReadSourceRange(Record
, Idx
);
428 ReadExplicitTemplateArgumentList(E
->getExplicitTemplateArgs(),
431 E
->setDecl(cast
<ValueDecl
>(Reader
.GetDecl(Record
[Idx
++])));
432 E
->setLocation(ReadSourceLocation(Record
, Idx
));
433 ReadDeclarationNameLoc(E
->DNLoc
, E
->getDecl()->getDeclName(), Record
, Idx
);
436 void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral
*E
) {
438 E
->setLocation(ReadSourceLocation(Record
, Idx
));
439 E
->setValue(*Reader
.getContext(), Reader
.ReadAPInt(Record
, Idx
));
442 void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral
*E
) {
444 E
->setValue(*Reader
.getContext(), Reader
.ReadAPFloat(Record
, Idx
));
445 E
->setExact(Record
[Idx
++]);
446 E
->setLocation(ReadSourceLocation(Record
, Idx
));
449 void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral
*E
) {
451 E
->setSubExpr(Reader
.ReadSubExpr());
454 void ASTStmtReader::VisitStringLiteral(StringLiteral
*E
) {
456 unsigned Len
= Record
[Idx
++];
457 assert(Record
[Idx
] == E
->getNumConcatenated() &&
458 "Wrong number of concatenated tokens!");
460 E
->setWide(Record
[Idx
++]);
463 llvm::SmallString
<16> Str(&Record
[Idx
], &Record
[Idx
] + Len
);
464 E
->setString(*Reader
.getContext(), Str
.str());
467 // Read source locations
468 for (unsigned I
= 0, N
= E
->getNumConcatenated(); I
!= N
; ++I
)
469 E
->setStrTokenLoc(I
, ReadSourceLocation(Record
, Idx
));
472 void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral
*E
) {
474 E
->setValue(Record
[Idx
++]);
475 E
->setLocation(ReadSourceLocation(Record
, Idx
));
476 E
->setWide(Record
[Idx
++]);
479 void ASTStmtReader::VisitParenExpr(ParenExpr
*E
) {
481 E
->setLParen(ReadSourceLocation(Record
, Idx
));
482 E
->setRParen(ReadSourceLocation(Record
, Idx
));
483 E
->setSubExpr(Reader
.ReadSubExpr());
486 void ASTStmtReader::VisitParenListExpr(ParenListExpr
*E
) {
488 unsigned NumExprs
= Record
[Idx
++];
489 E
->Exprs
= new (*Reader
.getContext()) Stmt
*[NumExprs
];
490 for (unsigned i
= 0; i
!= NumExprs
; ++i
)
491 E
->Exprs
[i
] = Reader
.ReadSubStmt();
492 E
->NumExprs
= NumExprs
;
493 E
->LParenLoc
= ReadSourceLocation(Record
, Idx
);
494 E
->RParenLoc
= ReadSourceLocation(Record
, Idx
);
497 void ASTStmtReader::VisitUnaryOperator(UnaryOperator
*E
) {
499 E
->setSubExpr(Reader
.ReadSubExpr());
500 E
->setOpcode((UnaryOperator::Opcode
)Record
[Idx
++]);
501 E
->setOperatorLoc(ReadSourceLocation(Record
, Idx
));
504 void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr
*E
) {
505 typedef OffsetOfExpr::OffsetOfNode Node
;
507 assert(E
->getNumComponents() == Record
[Idx
]);
509 assert(E
->getNumExpressions() == Record
[Idx
]);
511 E
->setOperatorLoc(ReadSourceLocation(Record
, Idx
));
512 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
513 E
->setTypeSourceInfo(GetTypeSourceInfo(Record
, Idx
));
514 for (unsigned I
= 0, N
= E
->getNumComponents(); I
!= N
; ++I
) {
515 Node::Kind Kind
= static_cast<Node::Kind
>(Record
[Idx
++]);
516 SourceLocation Start
= ReadSourceLocation(Record
, Idx
);
517 SourceLocation End
= ReadSourceLocation(Record
, Idx
);
520 E
->setComponent(I
, Node(Start
, Record
[Idx
++], End
));
526 dyn_cast_or_null
<FieldDecl
>(Reader
.GetDecl(Record
[Idx
++])),
530 case Node::Identifier
:
531 E
->setComponent(I
, Node(Start
, Reader
.GetIdentifier(Record
[Idx
++]), End
));
535 CXXBaseSpecifier
*Base
= new (*Reader
.getContext()) CXXBaseSpecifier();
536 *Base
= Reader
.ReadCXXBaseSpecifier(F
, Record
, Idx
);
537 E
->setComponent(I
, Node(Base
));
543 for (unsigned I
= 0, N
= E
->getNumExpressions(); I
!= N
; ++I
)
544 E
->setIndexExpr(I
, Reader
.ReadSubExpr());
547 void ASTStmtReader::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr
*E
) {
549 E
->setSizeof(Record
[Idx
++]);
550 if (Record
[Idx
] == 0) {
551 E
->setArgument(Reader
.ReadSubExpr());
554 E
->setArgument(GetTypeSourceInfo(Record
, Idx
));
556 E
->setOperatorLoc(ReadSourceLocation(Record
, Idx
));
557 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
560 void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr
*E
) {
562 E
->setLHS(Reader
.ReadSubExpr());
563 E
->setRHS(Reader
.ReadSubExpr());
564 E
->setRBracketLoc(ReadSourceLocation(Record
, Idx
));
567 void ASTStmtReader::VisitCallExpr(CallExpr
*E
) {
569 E
->setNumArgs(*Reader
.getContext(), Record
[Idx
++]);
570 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
571 E
->setCallee(Reader
.ReadSubExpr());
572 for (unsigned I
= 0, N
= E
->getNumArgs(); I
!= N
; ++I
)
573 E
->setArg(I
, Reader
.ReadSubExpr());
576 void ASTStmtReader::VisitMemberExpr(MemberExpr
*E
) {
577 // Don't call VisitExpr, this is fully initialized at creation.
578 assert(E
->getStmtClass() == Stmt::MemberExprClass
&&
579 "It's a subclass, we must advance Idx!");
582 void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr
*E
) {
584 E
->setBase(Reader
.ReadSubExpr());
585 E
->setIsaMemberLoc(ReadSourceLocation(Record
, Idx
));
586 E
->setArrow(Record
[Idx
++]);
589 void ASTStmtReader::VisitCastExpr(CastExpr
*E
) {
591 unsigned NumBaseSpecs
= Record
[Idx
++];
592 assert(NumBaseSpecs
== E
->path_size());
593 E
->setSubExpr(Reader
.ReadSubExpr());
594 E
->setCastKind((CastExpr::CastKind
)Record
[Idx
++]);
595 CastExpr::path_iterator BaseI
= E
->path_begin();
596 while (NumBaseSpecs
--) {
597 CXXBaseSpecifier
*BaseSpec
= new (*Reader
.getContext()) CXXBaseSpecifier
;
598 *BaseSpec
= Reader
.ReadCXXBaseSpecifier(F
, Record
, Idx
);
603 void ASTStmtReader::VisitBinaryOperator(BinaryOperator
*E
) {
605 E
->setLHS(Reader
.ReadSubExpr());
606 E
->setRHS(Reader
.ReadSubExpr());
607 E
->setOpcode((BinaryOperator::Opcode
)Record
[Idx
++]);
608 E
->setOperatorLoc(ReadSourceLocation(Record
, Idx
));
611 void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator
*E
) {
612 VisitBinaryOperator(E
);
613 E
->setComputationLHSType(Reader
.GetType(Record
[Idx
++]));
614 E
->setComputationResultType(Reader
.GetType(Record
[Idx
++]));
617 void ASTStmtReader::VisitConditionalOperator(ConditionalOperator
*E
) {
619 E
->setCond(Reader
.ReadSubExpr());
620 E
->setLHS(Reader
.ReadSubExpr());
621 E
->setRHS(Reader
.ReadSubExpr());
622 E
->setSAVE(Reader
.ReadSubExpr());
623 E
->setQuestionLoc(ReadSourceLocation(Record
, Idx
));
624 E
->setColonLoc(ReadSourceLocation(Record
, Idx
));
627 void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr
*E
) {
631 void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr
*E
) {
633 E
->setTypeInfoAsWritten(GetTypeSourceInfo(Record
, Idx
));
636 void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr
*E
) {
637 VisitExplicitCastExpr(E
);
638 E
->setLParenLoc(ReadSourceLocation(Record
, Idx
));
639 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
642 void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr
*E
) {
644 E
->setLParenLoc(ReadSourceLocation(Record
, Idx
));
645 E
->setTypeSourceInfo(GetTypeSourceInfo(Record
, Idx
));
646 E
->setInitializer(Reader
.ReadSubExpr());
647 E
->setFileScope(Record
[Idx
++]);
650 void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr
*E
) {
652 E
->setBase(Reader
.ReadSubExpr());
653 E
->setAccessor(Reader
.GetIdentifierInfo(Record
, Idx
));
654 E
->setAccessorLoc(ReadSourceLocation(Record
, Idx
));
657 void ASTStmtReader::VisitInitListExpr(InitListExpr
*E
) {
659 unsigned NumInits
= Record
[Idx
++];
660 E
->reserveInits(*Reader
.getContext(), NumInits
);
661 for (unsigned I
= 0; I
!= NumInits
; ++I
)
662 E
->updateInit(*Reader
.getContext(), I
, Reader
.ReadSubExpr());
663 E
->setSyntacticForm(cast_or_null
<InitListExpr
>(Reader
.ReadSubStmt()));
664 E
->setLBraceLoc(ReadSourceLocation(Record
, Idx
));
665 E
->setRBraceLoc(ReadSourceLocation(Record
, Idx
));
666 E
->setInitializedFieldInUnion(
667 cast_or_null
<FieldDecl
>(Reader
.GetDecl(Record
[Idx
++])));
668 E
->sawArrayRangeDesignator(Record
[Idx
++]);
671 void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr
*E
) {
672 typedef DesignatedInitExpr::Designator Designator
;
675 unsigned NumSubExprs
= Record
[Idx
++];
676 assert(NumSubExprs
== E
->getNumSubExprs() && "Wrong number of subexprs");
677 for (unsigned I
= 0; I
!= NumSubExprs
; ++I
)
678 E
->setSubExpr(I
, Reader
.ReadSubExpr());
679 E
->setEqualOrColonLoc(ReadSourceLocation(Record
, Idx
));
680 E
->setGNUSyntax(Record
[Idx
++]);
682 llvm::SmallVector
<Designator
, 4> Designators
;
683 while (Idx
< Record
.size()) {
684 switch ((DesignatorTypes
)Record
[Idx
++]) {
685 case DESIG_FIELD_DECL
: {
686 FieldDecl
*Field
= cast
<FieldDecl
>(Reader
.GetDecl(Record
[Idx
++]));
687 SourceLocation DotLoc
688 = ReadSourceLocation(Record
, Idx
);
689 SourceLocation FieldLoc
690 = ReadSourceLocation(Record
, Idx
);
691 Designators
.push_back(Designator(Field
->getIdentifier(), DotLoc
,
693 Designators
.back().setField(Field
);
697 case DESIG_FIELD_NAME
: {
698 const IdentifierInfo
*Name
= Reader
.GetIdentifierInfo(Record
, Idx
);
699 SourceLocation DotLoc
700 = ReadSourceLocation(Record
, Idx
);
701 SourceLocation FieldLoc
702 = ReadSourceLocation(Record
, Idx
);
703 Designators
.push_back(Designator(Name
, DotLoc
, FieldLoc
));
708 unsigned Index
= Record
[Idx
++];
709 SourceLocation LBracketLoc
710 = ReadSourceLocation(Record
, Idx
);
711 SourceLocation RBracketLoc
712 = ReadSourceLocation(Record
, Idx
);
713 Designators
.push_back(Designator(Index
, LBracketLoc
, RBracketLoc
));
717 case DESIG_ARRAY_RANGE
: {
718 unsigned Index
= Record
[Idx
++];
719 SourceLocation LBracketLoc
720 = ReadSourceLocation(Record
, Idx
);
721 SourceLocation EllipsisLoc
722 = ReadSourceLocation(Record
, Idx
);
723 SourceLocation RBracketLoc
724 = ReadSourceLocation(Record
, Idx
);
725 Designators
.push_back(Designator(Index
, LBracketLoc
, EllipsisLoc
,
731 E
->setDesignators(*Reader
.getContext(),
732 Designators
.data(), Designators
.size());
735 void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr
*E
) {
739 void ASTStmtReader::VisitVAArgExpr(VAArgExpr
*E
) {
741 E
->setSubExpr(Reader
.ReadSubExpr());
742 E
->setWrittenTypeInfo(GetTypeSourceInfo(Record
, Idx
));
743 E
->setBuiltinLoc(ReadSourceLocation(Record
, Idx
));
744 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
747 void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr
*E
) {
749 E
->setAmpAmpLoc(ReadSourceLocation(Record
, Idx
));
750 E
->setLabelLoc(ReadSourceLocation(Record
, Idx
));
751 Reader
.SetLabelOf(E
, Record
[Idx
++]);
754 void ASTStmtReader::VisitStmtExpr(StmtExpr
*E
) {
756 E
->setLParenLoc(ReadSourceLocation(Record
, Idx
));
757 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
758 E
->setSubStmt(cast_or_null
<CompoundStmt
>(Reader
.ReadSubStmt()));
761 void ASTStmtReader::VisitChooseExpr(ChooseExpr
*E
) {
763 E
->setCond(Reader
.ReadSubExpr());
764 E
->setLHS(Reader
.ReadSubExpr());
765 E
->setRHS(Reader
.ReadSubExpr());
766 E
->setBuiltinLoc(ReadSourceLocation(Record
, Idx
));
767 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
770 void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr
*E
) {
772 E
->setTokenLocation(ReadSourceLocation(Record
, Idx
));
775 void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr
*E
) {
777 llvm::SmallVector
<Expr
*, 16> Exprs
;
778 unsigned NumExprs
= Record
[Idx
++];
780 Exprs
.push_back(Reader
.ReadSubExpr());
781 E
->setExprs(*Reader
.getContext(), Exprs
.data(), Exprs
.size());
782 E
->setBuiltinLoc(ReadSourceLocation(Record
, Idx
));
783 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
786 void ASTStmtReader::VisitBlockExpr(BlockExpr
*E
) {
788 E
->setBlockDecl(cast_or_null
<BlockDecl
>(Reader
.GetDecl(Record
[Idx
++])));
789 E
->setHasBlockDeclRefExprs(Record
[Idx
++]);
792 void ASTStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr
*E
) {
794 E
->setDecl(cast
<ValueDecl
>(Reader
.GetDecl(Record
[Idx
++])));
795 E
->setLocation(ReadSourceLocation(Record
, Idx
));
796 E
->setByRef(Record
[Idx
++]);
797 E
->setConstQualAdded(Record
[Idx
++]);
798 E
->setCopyConstructorExpr(Reader
.ReadSubExpr());
801 //===----------------------------------------------------------------------===//
802 // Objective-C Expressions and Statements
804 void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral
*E
) {
806 E
->setString(cast
<StringLiteral
>(Reader
.ReadSubStmt()));
807 E
->setAtLoc(ReadSourceLocation(Record
, Idx
));
810 void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr
*E
) {
812 E
->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record
, Idx
));
813 E
->setAtLoc(ReadSourceLocation(Record
, Idx
));
814 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
817 void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr
*E
) {
819 E
->setSelector(Reader
.GetSelector(Record
, Idx
));
820 E
->setAtLoc(ReadSourceLocation(Record
, Idx
));
821 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
824 void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr
*E
) {
826 E
->setProtocol(cast
<ObjCProtocolDecl
>(Reader
.GetDecl(Record
[Idx
++])));
827 E
->setAtLoc(ReadSourceLocation(Record
, Idx
));
828 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
831 void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr
*E
) {
833 E
->setDecl(cast
<ObjCIvarDecl
>(Reader
.GetDecl(Record
[Idx
++])));
834 E
->setLocation(ReadSourceLocation(Record
, Idx
));
835 E
->setBase(Reader
.ReadSubExpr());
836 E
->setIsArrow(Record
[Idx
++]);
837 E
->setIsFreeIvar(Record
[Idx
++]);
840 void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr
*E
) {
842 bool Implicit
= Record
[Idx
++] != 0;
844 ObjCMethodDecl
*Getter
=
845 cast
<ObjCMethodDecl
>(Reader
.GetDecl(Record
[Idx
++]));
846 ObjCMethodDecl
*Setter
=
847 cast
<ObjCMethodDecl
>(Reader
.GetDecl(Record
[Idx
++]));
848 E
->setImplicitProperty(Getter
, Setter
);
850 E
->setExplicitProperty(
851 cast
<ObjCPropertyDecl
>(Reader
.GetDecl(Record
[Idx
++])));
853 E
->setLocation(ReadSourceLocation(Record
, Idx
));
854 E
->setReceiverLocation(ReadSourceLocation(Record
, Idx
));
855 switch (Record
[Idx
++]) {
857 E
->setBase(Reader
.ReadSubExpr());
860 E
->setSuperReceiver(Reader
.GetType(Record
[Idx
++]));
864 cast
<ObjCInterfaceDecl
>(Reader
.GetDecl(Record
[Idx
++])));
869 void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr
*E
) {
871 assert(Record
[Idx
] == E
->getNumArgs());
873 ObjCMessageExpr::ReceiverKind Kind
874 = static_cast<ObjCMessageExpr::ReceiverKind
>(Record
[Idx
++]);
876 case ObjCMessageExpr::Instance
:
877 E
->setInstanceReceiver(Reader
.ReadSubExpr());
880 case ObjCMessageExpr::Class
:
881 E
->setClassReceiver(GetTypeSourceInfo(Record
, Idx
));
884 case ObjCMessageExpr::SuperClass
:
885 case ObjCMessageExpr::SuperInstance
: {
886 QualType T
= Reader
.GetType(Record
[Idx
++]);
887 SourceLocation SuperLoc
= ReadSourceLocation(Record
, Idx
);
888 E
->setSuper(SuperLoc
, T
, Kind
== ObjCMessageExpr::SuperInstance
);
893 assert(Kind
== E
->getReceiverKind());
896 E
->setMethodDecl(cast_or_null
<ObjCMethodDecl
>(Reader
.GetDecl(Record
[Idx
++])));
898 E
->setSelector(Reader
.GetSelector(Record
, Idx
));
900 E
->LBracLoc
= ReadSourceLocation(Record
, Idx
);
901 E
->RBracLoc
= ReadSourceLocation(Record
, Idx
);
902 E
->SelectorLoc
= ReadSourceLocation(Record
, Idx
);
904 for (unsigned I
= 0, N
= E
->getNumArgs(); I
!= N
; ++I
)
905 E
->setArg(I
, Reader
.ReadSubExpr());
908 void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt
*S
) {
910 S
->setElement(Reader
.ReadSubStmt());
911 S
->setCollection(Reader
.ReadSubExpr());
912 S
->setBody(Reader
.ReadSubStmt());
913 S
->setForLoc(ReadSourceLocation(Record
, Idx
));
914 S
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
917 void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt
*S
) {
919 S
->setCatchBody(Reader
.ReadSubStmt());
920 S
->setCatchParamDecl(cast_or_null
<VarDecl
>(Reader
.GetDecl(Record
[Idx
++])));
921 S
->setAtCatchLoc(ReadSourceLocation(Record
, Idx
));
922 S
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
925 void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt
*S
) {
927 S
->setFinallyBody(Reader
.ReadSubStmt());
928 S
->setAtFinallyLoc(ReadSourceLocation(Record
, Idx
));
931 void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt
*S
) {
933 assert(Record
[Idx
] == S
->getNumCatchStmts());
935 bool HasFinally
= Record
[Idx
++];
936 S
->setTryBody(Reader
.ReadSubStmt());
937 for (unsigned I
= 0, N
= S
->getNumCatchStmts(); I
!= N
; ++I
)
938 S
->setCatchStmt(I
, cast_or_null
<ObjCAtCatchStmt
>(Reader
.ReadSubStmt()));
941 S
->setFinallyStmt(Reader
.ReadSubStmt());
942 S
->setAtTryLoc(ReadSourceLocation(Record
, Idx
));
945 void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt
*S
) {
947 S
->setSynchExpr(Reader
.ReadSubStmt());
948 S
->setSynchBody(Reader
.ReadSubStmt());
949 S
->setAtSynchronizedLoc(ReadSourceLocation(Record
, Idx
));
952 void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt
*S
) {
954 S
->setThrowExpr(Reader
.ReadSubStmt());
955 S
->setThrowLoc(ReadSourceLocation(Record
, Idx
));
958 //===----------------------------------------------------------------------===//
959 // C++ Expressions and Statements
960 //===----------------------------------------------------------------------===//
962 void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt
*S
) {
964 S
->CatchLoc
= ReadSourceLocation(Record
, Idx
);
965 S
->ExceptionDecl
= cast_or_null
<VarDecl
>(Reader
.GetDecl(Record
[Idx
++]));
966 S
->HandlerBlock
= Reader
.ReadSubStmt();
969 void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt
*S
) {
971 assert(Record
[Idx
] == S
->getNumHandlers() && "NumStmtFields is wrong ?");
973 S
->TryLoc
= ReadSourceLocation(Record
, Idx
);
974 S
->getStmts()[0] = Reader
.ReadSubStmt();
975 for (unsigned i
= 0, e
= S
->getNumHandlers(); i
!= e
; ++i
)
976 S
->getStmts()[i
+ 1] = Reader
.ReadSubStmt();
979 void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr
*E
) {
981 E
->setOperator((OverloadedOperatorKind
)Record
[Idx
++]);
984 void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr
*E
) {
986 E
->NumArgs
= Record
[Idx
++];
988 E
->Args
= new (*Reader
.getContext()) Stmt
*[E
->NumArgs
];
989 for (unsigned I
= 0, N
= E
->getNumArgs(); I
!= N
; ++I
)
990 E
->setArg(I
, Reader
.ReadSubExpr());
991 E
->setConstructor(cast
<CXXConstructorDecl
>(Reader
.GetDecl(Record
[Idx
++])));
992 E
->setLocation(ReadSourceLocation(Record
, Idx
));
993 E
->setElidable(Record
[Idx
++]);
994 E
->setRequiresZeroInitialization(Record
[Idx
++]);
995 E
->setConstructionKind((CXXConstructExpr::ConstructionKind
)Record
[Idx
++]);
996 E
->ParenRange
= ReadSourceRange(Record
, Idx
);
999 void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr
*E
) {
1000 VisitCXXConstructExpr(E
);
1001 E
->Type
= GetTypeSourceInfo(Record
, Idx
);
1004 void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr
*E
) {
1005 VisitExplicitCastExpr(E
);
1006 E
->setOperatorLoc(ReadSourceLocation(Record
, Idx
));
1009 void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr
*E
) {
1010 return VisitCXXNamedCastExpr(E
);
1013 void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr
*E
) {
1014 return VisitCXXNamedCastExpr(E
);
1017 void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr
*E
) {
1018 return VisitCXXNamedCastExpr(E
);
1021 void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr
*E
) {
1022 return VisitCXXNamedCastExpr(E
);
1025 void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr
*E
) {
1026 VisitExplicitCastExpr(E
);
1027 E
->setTypeBeginLoc(ReadSourceLocation(Record
, Idx
));
1028 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
1031 void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr
*E
) {
1033 E
->setValue(Record
[Idx
++]);
1034 E
->setLocation(ReadSourceLocation(Record
, Idx
));
1037 void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr
*E
) {
1039 E
->setLocation(ReadSourceLocation(Record
, Idx
));
1042 void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr
*E
) {
1044 E
->setSourceRange(ReadSourceRange(Record
, Idx
));
1045 if (E
->isTypeOperand()) { // typeid(int)
1046 E
->setTypeOperandSourceInfo(
1047 GetTypeSourceInfo(Record
, Idx
));
1052 E
->setExprOperand(Reader
.ReadSubExpr());
1054 void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr
*E
) {
1056 E
->setSourceRange(ReadSourceRange(Record
, Idx
));
1057 if (E
->isTypeOperand()) { // __uuidof(ComType)
1058 E
->setTypeOperandSourceInfo(
1059 GetTypeSourceInfo(Record
, Idx
));
1064 E
->setExprOperand(Reader
.ReadSubExpr());
1067 void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr
*E
) {
1069 E
->setLocation(ReadSourceLocation(Record
, Idx
));
1070 E
->setImplicit(Record
[Idx
++]);
1073 void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr
*E
) {
1075 E
->setThrowLoc(ReadSourceLocation(Record
, Idx
));
1076 E
->setSubExpr(Reader
.ReadSubExpr());
1079 void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr
*E
) {
1082 assert(Record
[Idx
] == E
->Param
.getInt() && "We messed up at creation ?");
1083 ++Idx
; // HasOtherExprStored and SubExpr was handled during creation.
1084 E
->Param
.setPointer(cast
<ParmVarDecl
>(Reader
.GetDecl(Record
[Idx
++])));
1085 E
->Loc
= ReadSourceLocation(Record
, Idx
);
1088 void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr
*E
) {
1090 E
->setTemporary(Reader
.ReadCXXTemporary(Record
, Idx
));
1091 E
->setSubExpr(Reader
.ReadSubExpr());
1094 void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr
*E
) {
1096 E
->TypeInfo
= GetTypeSourceInfo(Record
, Idx
);
1097 E
->RParenLoc
= ReadSourceLocation(Record
, Idx
);
1100 void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr
*E
) {
1102 E
->setGlobalNew(Record
[Idx
++]);
1103 E
->setHasInitializer(Record
[Idx
++]);
1104 bool isArray
= Record
[Idx
++];
1105 unsigned NumPlacementArgs
= Record
[Idx
++];
1106 unsigned NumCtorArgs
= Record
[Idx
++];
1107 E
->setOperatorNew(cast_or_null
<FunctionDecl
>(Reader
.GetDecl(Record
[Idx
++])));
1108 E
->setOperatorDelete(
1109 cast_or_null
<FunctionDecl
>(Reader
.GetDecl(Record
[Idx
++])));
1111 cast_or_null
<CXXConstructorDecl
>(Reader
.GetDecl(Record
[Idx
++])));
1112 E
->AllocatedTypeInfo
= GetTypeSourceInfo(Record
, Idx
);
1113 SourceRange TypeIdParens
;
1114 TypeIdParens
.setBegin(ReadSourceLocation(Record
, Idx
));
1115 TypeIdParens
.setEnd(ReadSourceLocation(Record
, Idx
));
1116 E
->TypeIdParens
= TypeIdParens
;
1117 E
->StartLoc
= ReadSourceLocation(Record
, Idx
);
1118 E
->EndLoc
= ReadSourceLocation(Record
, Idx
);
1119 E
->ConstructorLParen
= ReadSourceLocation(Record
, Idx
);
1120 E
->ConstructorRParen
= ReadSourceLocation(Record
, Idx
);
1122 E
->AllocateArgsArray(*Reader
.getContext(), isArray
, NumPlacementArgs
,
1125 // Install all the subexpressions.
1126 for (CXXNewExpr::raw_arg_iterator I
= E
->raw_arg_begin(),e
= E
->raw_arg_end();
1128 *I
= Reader
.ReadSubStmt();
1131 void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr
*E
) {
1133 E
->GlobalDelete
= Record
[Idx
++];
1134 E
->ArrayForm
= Record
[Idx
++];
1135 E
->ArrayFormAsWritten
= Record
[Idx
++];
1136 E
->OperatorDelete
= cast_or_null
<FunctionDecl
>(Reader
.GetDecl(Record
[Idx
++]));
1137 E
->Argument
= Reader
.ReadSubExpr();
1138 E
->Loc
= ReadSourceLocation(Record
, Idx
);
1141 void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr
*E
) {
1144 E
->setBase(Reader
.ReadSubExpr());
1145 E
->setArrow(Record
[Idx
++]);
1146 E
->setOperatorLoc(ReadSourceLocation(Record
, Idx
));
1147 E
->setQualifier(Reader
.ReadNestedNameSpecifier(Record
, Idx
));
1148 E
->setQualifierRange(ReadSourceRange(Record
, Idx
));
1149 E
->setScopeTypeInfo(GetTypeSourceInfo(Record
, Idx
));
1150 E
->setColonColonLoc(ReadSourceLocation(Record
, Idx
));
1151 E
->setTildeLoc(ReadSourceLocation(Record
, Idx
));
1153 IdentifierInfo
*II
= Reader
.GetIdentifierInfo(Record
, Idx
);
1155 E
->setDestroyedType(II
, ReadSourceLocation(Record
, Idx
));
1157 E
->setDestroyedType(GetTypeSourceInfo(Record
, Idx
));
1160 void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups
*E
) {
1162 unsigned NumTemps
= Record
[Idx
++];
1164 E
->setNumTemporaries(*Reader
.getContext(), NumTemps
);
1165 for (unsigned i
= 0; i
!= NumTemps
; ++i
)
1166 E
->setTemporary(i
, Reader
.ReadCXXTemporary(Record
, Idx
));
1168 E
->setSubExpr(Reader
.ReadSubExpr());
1172 ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr
*E
){
1175 unsigned NumTemplateArgs
= Record
[Idx
++];
1176 assert((NumTemplateArgs
!= 0) == E
->hasExplicitTemplateArgs() &&
1177 "Read wrong record during creation ?");
1178 if (E
->hasExplicitTemplateArgs())
1179 ReadExplicitTemplateArgumentList(E
->getExplicitTemplateArgs(),
1182 E
->setBase(Reader
.ReadSubExpr());
1183 E
->setBaseType(Reader
.GetType(Record
[Idx
++]));
1184 E
->setArrow(Record
[Idx
++]);
1185 E
->setOperatorLoc(ReadSourceLocation(Record
, Idx
));
1186 E
->setQualifier(Reader
.ReadNestedNameSpecifier(Record
, Idx
));
1187 E
->setQualifierRange(ReadSourceRange(Record
, Idx
));
1188 E
->setFirstQualifierFoundInScope(
1189 cast_or_null
<NamedDecl
>(Reader
.GetDecl(Record
[Idx
++])));
1190 ReadDeclarationNameInfo(E
->MemberNameInfo
, Record
, Idx
);
1194 ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr
*E
) {
1197 unsigned NumTemplateArgs
= Record
[Idx
++];
1198 assert((NumTemplateArgs
!= 0) == E
->hasExplicitTemplateArgs() &&
1199 "Read wrong record during creation ?");
1200 if (E
->hasExplicitTemplateArgs())
1201 ReadExplicitTemplateArgumentList(E
->getExplicitTemplateArgs(),
1204 ReadDeclarationNameInfo(E
->NameInfo
, Record
, Idx
);
1205 E
->setQualifierRange(ReadSourceRange(Record
, Idx
));
1206 E
->setQualifier(Reader
.ReadNestedNameSpecifier(Record
, Idx
));
1210 ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr
*E
) {
1212 assert(Record
[Idx
] == E
->arg_size() && "Read wrong record during creation ?");
1214 for (unsigned I
= 0, N
= E
->arg_size(); I
!= N
; ++I
)
1215 E
->setArg(I
, Reader
.ReadSubExpr());
1216 E
->Type
= GetTypeSourceInfo(Record
, Idx
);
1217 E
->setLParenLoc(ReadSourceLocation(Record
, Idx
));
1218 E
->setRParenLoc(ReadSourceLocation(Record
, Idx
));
1221 void ASTStmtReader::VisitOverloadExpr(OverloadExpr
*E
) {
1224 unsigned NumTemplateArgs
= Record
[Idx
++];
1225 assert((NumTemplateArgs
!= 0) == E
->hasExplicitTemplateArgs() &&
1226 "Read wrong record during creation ?");
1227 if (E
->hasExplicitTemplateArgs())
1228 ReadExplicitTemplateArgumentList(E
->getExplicitTemplateArgs(),
1231 unsigned NumDecls
= Record
[Idx
++];
1232 UnresolvedSet
<8> Decls
;
1233 for (unsigned i
= 0; i
!= NumDecls
; ++i
) {
1234 NamedDecl
*D
= cast
<NamedDecl
>(Reader
.GetDecl(Record
[Idx
++]));
1235 AccessSpecifier AS
= (AccessSpecifier
)Record
[Idx
++];
1236 Decls
.addDecl(D
, AS
);
1238 E
->initializeResults(*Reader
.getContext(), Decls
.begin(), Decls
.end());
1240 ReadDeclarationNameInfo(E
->NameInfo
, Record
, Idx
);
1241 E
->setQualifier(Reader
.ReadNestedNameSpecifier(Record
, Idx
));
1242 E
->setQualifierRange(ReadSourceRange(Record
, Idx
));
1245 void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr
*E
) {
1246 VisitOverloadExpr(E
);
1247 E
->setArrow(Record
[Idx
++]);
1248 E
->setHasUnresolvedUsing(Record
[Idx
++]);
1249 E
->setBase(Reader
.ReadSubExpr());
1250 E
->setBaseType(Reader
.GetType(Record
[Idx
++]));
1251 E
->setOperatorLoc(ReadSourceLocation(Record
, Idx
));
1254 void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr
*E
) {
1255 VisitOverloadExpr(E
);
1256 E
->setRequiresADL(Record
[Idx
++]);
1257 E
->setOverloaded(Record
[Idx
++]);
1258 E
->setNamingClass(cast_or_null
<CXXRecordDecl
>(Reader
.GetDecl(Record
[Idx
++])));
1261 void ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr
*E
) {
1263 E
->UTT
= (UnaryTypeTrait
)Record
[Idx
++];
1264 E
->Value
= (bool)Record
[Idx
++];
1265 SourceRange Range
= ReadSourceRange(Record
, Idx
);
1266 E
->Loc
= Range
.getBegin();
1267 E
->RParen
= Range
.getEnd();
1268 E
->QueriedType
= GetTypeSourceInfo(Record
, Idx
);
1271 void ASTStmtReader::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr
*E
) {
1273 E
->BTT
= (BinaryTypeTrait
)Record
[Idx
++];
1274 E
->Value
= (bool)Record
[Idx
++];
1275 SourceRange Range
= ReadSourceRange(Record
, Idx
);
1276 E
->Loc
= Range
.getBegin();
1277 E
->RParen
= Range
.getEnd();
1278 E
->LhsType
= GetTypeSourceInfo(Record
, Idx
);
1279 E
->RhsType
= GetTypeSourceInfo(Record
, Idx
);
1282 void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr
*E
) {
1284 E
->Value
= (bool)Record
[Idx
++];
1285 E
->Range
= ReadSourceRange(Record
, Idx
);
1286 E
->Operand
= Reader
.ReadSubExpr();
1289 void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr
*E
) {
1293 Stmt
*ASTReader::ReadStmt(PerFileData
&F
) {
1294 switch (ReadingKind
) {
1297 return ReadStmtFromStream(F
);
1299 return ReadSubStmt();
1302 llvm_unreachable("ReadingKind not set ?");
1306 Expr
*ASTReader::ReadExpr(PerFileData
&F
) {
1307 return cast_or_null
<Expr
>(ReadStmt(F
));
1310 Expr
*ASTReader::ReadSubExpr() {
1311 return cast_or_null
<Expr
>(ReadSubStmt());
1314 // Within the bitstream, expressions are stored in Reverse Polish
1315 // Notation, with each of the subexpressions preceding the
1316 // expression they are stored in. Subexpressions are stored from last to first.
1317 // To evaluate expressions, we continue reading expressions and placing them on
1318 // the stack, with expressions having operands removing those operands from the
1319 // stack. Evaluation terminates when we see a STMT_STOP record, and
1320 // the single remaining expression on the stack is our result.
1321 Stmt
*ASTReader::ReadStmtFromStream(PerFileData
&F
) {
1323 ReadingKindTracker
ReadingKind(Read_Stmt
, *this);
1324 llvm::BitstreamCursor
&Cursor
= F
.DeclsCursor
;
1327 unsigned PrevNumStmts
= StmtStack
.size();
1332 ASTStmtReader
Reader(*this, F
, Cursor
, Record
, Idx
);
1333 Stmt::EmptyShell Empty
;
1336 unsigned Code
= Cursor
.ReadCode();
1337 if (Code
== llvm::bitc::END_BLOCK
) {
1338 if (Cursor
.ReadBlockEnd()) {
1339 Error("error at end of block in AST file");
1345 if (Code
== llvm::bitc::ENTER_SUBBLOCK
) {
1346 // No known subblocks, always skip them.
1347 Cursor
.ReadSubBlockID();
1348 if (Cursor
.SkipBlock()) {
1349 Error("malformed block record in AST file");
1355 if (Code
== llvm::bitc::DEFINE_ABBREV
) {
1356 Cursor
.ReadAbbrevRecord();
1363 bool Finished
= false;
1364 switch ((StmtCode
)Cursor
.ReadRecord(Code
, Record
)) {
1374 S
= new (Context
) NullStmt(Empty
);
1378 S
= new (Context
) CompoundStmt(Empty
);
1382 S
= new (Context
) CaseStmt(Empty
);
1386 S
= new (Context
) DefaultStmt(Empty
);
1390 S
= new (Context
) LabelStmt(Empty
);
1394 S
= new (Context
) IfStmt(Empty
);
1398 S
= new (Context
) SwitchStmt(Empty
);
1402 S
= new (Context
) WhileStmt(Empty
);
1406 S
= new (Context
) DoStmt(Empty
);
1410 S
= new (Context
) ForStmt(Empty
);
1414 S
= new (Context
) GotoStmt(Empty
);
1417 case STMT_INDIRECT_GOTO
:
1418 S
= new (Context
) IndirectGotoStmt(Empty
);
1422 S
= new (Context
) ContinueStmt(Empty
);
1426 S
= new (Context
) BreakStmt(Empty
);
1430 S
= new (Context
) ReturnStmt(Empty
);
1434 S
= new (Context
) DeclStmt(Empty
);
1438 S
= new (Context
) AsmStmt(Empty
);
1441 case EXPR_PREDEFINED
:
1442 S
= new (Context
) PredefinedExpr(Empty
);
1446 S
= DeclRefExpr::CreateEmpty(*Context
,
1447 /*HasQualifier=*/Record
[ASTStmtReader::NumExprFields
],
1448 /*NumTemplateArgs=*/Record
[ASTStmtReader::NumExprFields
+ 1]);
1451 case EXPR_INTEGER_LITERAL
:
1452 S
= IntegerLiteral::Create(*Context
, Empty
);
1455 case EXPR_FLOATING_LITERAL
:
1456 S
= FloatingLiteral::Create(*Context
, Empty
);
1459 case EXPR_IMAGINARY_LITERAL
:
1460 S
= new (Context
) ImaginaryLiteral(Empty
);
1463 case EXPR_STRING_LITERAL
:
1464 S
= StringLiteral::CreateEmpty(*Context
,
1465 Record
[ASTStmtReader::NumExprFields
+ 1]);
1468 case EXPR_CHARACTER_LITERAL
:
1469 S
= new (Context
) CharacterLiteral(Empty
);
1473 S
= new (Context
) ParenExpr(Empty
);
1476 case EXPR_PAREN_LIST
:
1477 S
= new (Context
) ParenListExpr(Empty
);
1480 case EXPR_UNARY_OPERATOR
:
1481 S
= new (Context
) UnaryOperator(Empty
);
1485 S
= OffsetOfExpr::CreateEmpty(*Context
,
1486 Record
[ASTStmtReader::NumExprFields
],
1487 Record
[ASTStmtReader::NumExprFields
+ 1]);
1490 case EXPR_SIZEOF_ALIGN_OF
:
1491 S
= new (Context
) SizeOfAlignOfExpr(Empty
);
1494 case EXPR_ARRAY_SUBSCRIPT
:
1495 S
= new (Context
) ArraySubscriptExpr(Empty
);
1499 S
= new (Context
) CallExpr(*Context
, Stmt::CallExprClass
, Empty
);
1503 // We load everything here and fully initialize it at creation.
1504 // That way we can use MemberExpr::Create and don't have to duplicate its
1505 // logic with a MemberExpr::CreateEmpty.
1508 NestedNameSpecifier
*NNS
= 0;
1509 SourceRange QualifierRange
;
1510 if (Record
[Idx
++]) { // HasQualifier.
1511 NNS
= ReadNestedNameSpecifier(Record
, Idx
);
1512 QualifierRange
= ReadSourceRange(F
, Record
, Idx
);
1515 TemplateArgumentListInfo ArgInfo
;
1516 unsigned NumTemplateArgs
= Record
[Idx
++];
1517 if (NumTemplateArgs
) {
1518 ArgInfo
.setLAngleLoc(ReadSourceLocation(F
, Record
, Idx
));
1519 ArgInfo
.setRAngleLoc(ReadSourceLocation(F
, Record
, Idx
));
1520 for (unsigned i
= 0; i
!= NumTemplateArgs
; ++i
)
1521 ArgInfo
.addArgument(ReadTemplateArgumentLoc(F
, Record
, Idx
));
1524 NamedDecl
*FoundD
= cast_or_null
<NamedDecl
>(GetDecl(Record
[Idx
++]));
1525 AccessSpecifier AS
= (AccessSpecifier
)Record
[Idx
++];
1526 DeclAccessPair FoundDecl
= DeclAccessPair::make(FoundD
, AS
);
1528 QualType T
= GetType(Record
[Idx
++]);
1529 ExprValueKind VK
= static_cast<ExprValueKind
>(Record
[Idx
++]);
1530 ExprObjectKind OK
= static_cast<ExprObjectKind
>(Record
[Idx
++]);
1531 Expr
*Base
= ReadSubExpr();
1532 ValueDecl
*MemberD
= cast
<ValueDecl
>(GetDecl(Record
[Idx
++]));
1533 SourceLocation MemberLoc
= ReadSourceLocation(F
, Record
, Idx
);
1534 DeclarationNameInfo
MemberNameInfo(MemberD
->getDeclName(), MemberLoc
);
1535 bool IsArrow
= Record
[Idx
++];
1537 S
= MemberExpr::Create(*Context
, Base
, IsArrow
, NNS
, QualifierRange
,
1538 MemberD
, FoundDecl
, MemberNameInfo
,
1539 NumTemplateArgs
? &ArgInfo
: 0, T
, VK
, OK
);
1540 ReadDeclarationNameLoc(F
, cast
<MemberExpr
>(S
)->MemberDNLoc
,
1541 MemberD
->getDeclName(), Record
, Idx
);
1545 case EXPR_BINARY_OPERATOR
:
1546 S
= new (Context
) BinaryOperator(Empty
);
1549 case EXPR_COMPOUND_ASSIGN_OPERATOR
:
1550 S
= new (Context
) CompoundAssignOperator(Empty
);
1553 case EXPR_CONDITIONAL_OPERATOR
:
1554 S
= new (Context
) ConditionalOperator(Empty
);
1557 case EXPR_IMPLICIT_CAST
:
1558 S
= ImplicitCastExpr::CreateEmpty(*Context
,
1559 /*PathSize*/ Record
[ASTStmtReader::NumExprFields
]);
1562 case EXPR_CSTYLE_CAST
:
1563 S
= CStyleCastExpr::CreateEmpty(*Context
,
1564 /*PathSize*/ Record
[ASTStmtReader::NumExprFields
]);
1567 case EXPR_COMPOUND_LITERAL
:
1568 S
= new (Context
) CompoundLiteralExpr(Empty
);
1571 case EXPR_EXT_VECTOR_ELEMENT
:
1572 S
= new (Context
) ExtVectorElementExpr(Empty
);
1575 case EXPR_INIT_LIST
:
1576 S
= new (Context
) InitListExpr(*getContext(), Empty
);
1579 case EXPR_DESIGNATED_INIT
:
1580 S
= DesignatedInitExpr::CreateEmpty(*Context
,
1581 Record
[ASTStmtReader::NumExprFields
] - 1);
1585 case EXPR_IMPLICIT_VALUE_INIT
:
1586 S
= new (Context
) ImplicitValueInitExpr(Empty
);
1590 S
= new (Context
) VAArgExpr(Empty
);
1593 case EXPR_ADDR_LABEL
:
1594 S
= new (Context
) AddrLabelExpr(Empty
);
1598 S
= new (Context
) StmtExpr(Empty
);
1602 S
= new (Context
) ChooseExpr(Empty
);
1606 S
= new (Context
) GNUNullExpr(Empty
);
1609 case EXPR_SHUFFLE_VECTOR
:
1610 S
= new (Context
) ShuffleVectorExpr(Empty
);
1614 S
= new (Context
) BlockExpr(Empty
);
1617 case EXPR_BLOCK_DECL_REF
:
1618 S
= new (Context
) BlockDeclRefExpr(Empty
);
1621 case EXPR_OBJC_STRING_LITERAL
:
1622 S
= new (Context
) ObjCStringLiteral(Empty
);
1624 case EXPR_OBJC_ENCODE
:
1625 S
= new (Context
) ObjCEncodeExpr(Empty
);
1627 case EXPR_OBJC_SELECTOR_EXPR
:
1628 S
= new (Context
) ObjCSelectorExpr(Empty
);
1630 case EXPR_OBJC_PROTOCOL_EXPR
:
1631 S
= new (Context
) ObjCProtocolExpr(Empty
);
1633 case EXPR_OBJC_IVAR_REF_EXPR
:
1634 S
= new (Context
) ObjCIvarRefExpr(Empty
);
1636 case EXPR_OBJC_PROPERTY_REF_EXPR
:
1637 S
= new (Context
) ObjCPropertyRefExpr(Empty
);
1639 case EXPR_OBJC_KVC_REF_EXPR
:
1640 llvm_unreachable("mismatching AST file");
1642 case EXPR_OBJC_MESSAGE_EXPR
:
1643 S
= ObjCMessageExpr::CreateEmpty(*Context
,
1644 Record
[ASTStmtReader::NumExprFields
]);
1647 S
= new (Context
) ObjCIsaExpr(Empty
);
1649 case STMT_OBJC_FOR_COLLECTION
:
1650 S
= new (Context
) ObjCForCollectionStmt(Empty
);
1652 case STMT_OBJC_CATCH
:
1653 S
= new (Context
) ObjCAtCatchStmt(Empty
);
1655 case STMT_OBJC_FINALLY
:
1656 S
= new (Context
) ObjCAtFinallyStmt(Empty
);
1658 case STMT_OBJC_AT_TRY
:
1659 S
= ObjCAtTryStmt::CreateEmpty(*Context
,
1660 Record
[ASTStmtReader::NumStmtFields
],
1661 Record
[ASTStmtReader::NumStmtFields
+ 1]);
1663 case STMT_OBJC_AT_SYNCHRONIZED
:
1664 S
= new (Context
) ObjCAtSynchronizedStmt(Empty
);
1666 case STMT_OBJC_AT_THROW
:
1667 S
= new (Context
) ObjCAtThrowStmt(Empty
);
1670 case STMT_CXX_CATCH
:
1671 S
= new (Context
) CXXCatchStmt(Empty
);
1675 S
= CXXTryStmt::Create(*Context
, Empty
,
1676 /*NumHandlers=*/Record
[ASTStmtReader::NumStmtFields
]);
1679 case EXPR_CXX_OPERATOR_CALL
:
1680 S
= new (Context
) CXXOperatorCallExpr(*Context
, Empty
);
1683 case EXPR_CXX_MEMBER_CALL
:
1684 S
= new (Context
) CXXMemberCallExpr(*Context
, Empty
);
1687 case EXPR_CXX_CONSTRUCT
:
1688 S
= new (Context
) CXXConstructExpr(Empty
);
1691 case EXPR_CXX_TEMPORARY_OBJECT
:
1692 S
= new (Context
) CXXTemporaryObjectExpr(Empty
);
1695 case EXPR_CXX_STATIC_CAST
:
1696 S
= CXXStaticCastExpr::CreateEmpty(*Context
,
1697 /*PathSize*/ Record
[ASTStmtReader::NumExprFields
]);
1700 case EXPR_CXX_DYNAMIC_CAST
:
1701 S
= CXXDynamicCastExpr::CreateEmpty(*Context
,
1702 /*PathSize*/ Record
[ASTStmtReader::NumExprFields
]);
1705 case EXPR_CXX_REINTERPRET_CAST
:
1706 S
= CXXReinterpretCastExpr::CreateEmpty(*Context
,
1707 /*PathSize*/ Record
[ASTStmtReader::NumExprFields
]);
1710 case EXPR_CXX_CONST_CAST
:
1711 S
= CXXConstCastExpr::CreateEmpty(*Context
);
1714 case EXPR_CXX_FUNCTIONAL_CAST
:
1715 S
= CXXFunctionalCastExpr::CreateEmpty(*Context
,
1716 /*PathSize*/ Record
[ASTStmtReader::NumExprFields
]);
1719 case EXPR_CXX_BOOL_LITERAL
:
1720 S
= new (Context
) CXXBoolLiteralExpr(Empty
);
1723 case EXPR_CXX_NULL_PTR_LITERAL
:
1724 S
= new (Context
) CXXNullPtrLiteralExpr(Empty
);
1726 case EXPR_CXX_TYPEID_EXPR
:
1727 S
= new (Context
) CXXTypeidExpr(Empty
, true);
1729 case EXPR_CXX_TYPEID_TYPE
:
1730 S
= new (Context
) CXXTypeidExpr(Empty
, false);
1732 case EXPR_CXX_UUIDOF_EXPR
:
1733 S
= new (Context
) CXXUuidofExpr(Empty
, true);
1735 case EXPR_CXX_UUIDOF_TYPE
:
1736 S
= new (Context
) CXXUuidofExpr(Empty
, false);
1739 S
= new (Context
) CXXThisExpr(Empty
);
1741 case EXPR_CXX_THROW
:
1742 S
= new (Context
) CXXThrowExpr(Empty
);
1744 case EXPR_CXX_DEFAULT_ARG
: {
1745 bool HasOtherExprStored
= Record
[ASTStmtReader::NumExprFields
];
1746 if (HasOtherExprStored
) {
1747 Expr
*SubExpr
= ReadSubExpr();
1748 S
= CXXDefaultArgExpr::Create(*Context
, SourceLocation(), 0, SubExpr
);
1750 S
= new (Context
) CXXDefaultArgExpr(Empty
);
1753 case EXPR_CXX_BIND_TEMPORARY
:
1754 S
= new (Context
) CXXBindTemporaryExpr(Empty
);
1757 case EXPR_CXX_SCALAR_VALUE_INIT
:
1758 S
= new (Context
) CXXScalarValueInitExpr(Empty
);
1761 S
= new (Context
) CXXNewExpr(Empty
);
1763 case EXPR_CXX_DELETE
:
1764 S
= new (Context
) CXXDeleteExpr(Empty
);
1766 case EXPR_CXX_PSEUDO_DESTRUCTOR
:
1767 S
= new (Context
) CXXPseudoDestructorExpr(Empty
);
1770 case EXPR_EXPR_WITH_CLEANUPS
:
1771 S
= new (Context
) ExprWithCleanups(Empty
);
1774 case EXPR_CXX_DEPENDENT_SCOPE_MEMBER
:
1775 S
= CXXDependentScopeMemberExpr::CreateEmpty(*Context
,
1776 /*NumTemplateArgs=*/Record
[ASTStmtReader::NumExprFields
]);
1779 case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF
:
1780 S
= DependentScopeDeclRefExpr::CreateEmpty(*Context
,
1781 /*NumTemplateArgs=*/Record
[ASTStmtReader::NumExprFields
]);
1784 case EXPR_CXX_UNRESOLVED_CONSTRUCT
:
1785 S
= CXXUnresolvedConstructExpr::CreateEmpty(*Context
,
1786 /*NumArgs=*/Record
[ASTStmtReader::NumExprFields
]);
1789 case EXPR_CXX_UNRESOLVED_MEMBER
:
1790 S
= UnresolvedMemberExpr::CreateEmpty(*Context
,
1791 /*NumTemplateArgs=*/Record
[ASTStmtReader::NumExprFields
]);
1794 case EXPR_CXX_UNRESOLVED_LOOKUP
:
1795 S
= UnresolvedLookupExpr::CreateEmpty(*Context
,
1796 /*NumTemplateArgs=*/Record
[ASTStmtReader::NumExprFields
]);
1799 case EXPR_CXX_UNARY_TYPE_TRAIT
:
1800 S
= new (Context
) UnaryTypeTraitExpr(Empty
);
1803 case EXPR_BINARY_TYPE_TRAIT
:
1804 S
= new (Context
) BinaryTypeTraitExpr(Empty
);
1807 case EXPR_CXX_NOEXCEPT
:
1808 S
= new (Context
) CXXNoexceptExpr(Empty
);
1811 case EXPR_OPAQUE_VALUE
:
1812 S
= new (Context
) OpaqueValueExpr(Empty
);
1816 // We hit a STMT_STOP, so we're done with this expression.
1820 ++NumStatementsRead
;
1825 assert(Idx
== Record
.size() && "Invalid deserialization of statement");
1826 StmtStack
.push_back(S
);
1830 assert(StmtStack
.size() > PrevNumStmts
&& "Read too many sub stmts!");
1831 assert(StmtStack
.size() == PrevNumStmts
+ 1 && "Extra expressions on stack!");
1834 return StmtStack
.pop_back_val();