clang API Documentation
00001 //===--- ASTReaderStmt.cpp - Stmt/Expr Deserialization ----------*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // Statement/expression deserialization. This implements the 00011 // ASTReader::ReadStmt method. 00012 // 00013 //===----------------------------------------------------------------------===// 00014 00015 #include "clang/Serialization/ASTReader.h" 00016 #include "clang/AST/DeclCXX.h" 00017 #include "clang/AST/DeclTemplate.h" 00018 #include "clang/AST/StmtVisitor.h" 00019 #include "llvm/ADT/SmallString.h" 00020 using namespace clang; 00021 using namespace clang::serialization; 00022 00023 namespace clang { 00024 00025 class ASTStmtReader : public StmtVisitor<ASTStmtReader> { 00026 typedef ASTReader::RecordData RecordData; 00027 00028 ASTReader &Reader; 00029 ModuleFile &F; 00030 llvm::BitstreamCursor &DeclsCursor; 00031 const ASTReader::RecordData &Record; 00032 unsigned &Idx; 00033 00034 SourceLocation ReadSourceLocation(const RecordData &R, unsigned &I) { 00035 return Reader.ReadSourceLocation(F, R, I); 00036 } 00037 00038 SourceRange ReadSourceRange(const RecordData &R, unsigned &I) { 00039 return Reader.ReadSourceRange(F, R, I); 00040 } 00041 00042 TypeSourceInfo *GetTypeSourceInfo(const RecordData &R, unsigned &I) { 00043 return Reader.GetTypeSourceInfo(F, R, I); 00044 } 00045 00046 serialization::DeclID ReadDeclID(const RecordData &R, unsigned &I) { 00047 return Reader.ReadDeclID(F, R, I); 00048 } 00049 00050 Decl *ReadDecl(const RecordData &R, unsigned &I) { 00051 return Reader.ReadDecl(F, R, I); 00052 } 00053 00054 template<typename T> 00055 T *ReadDeclAs(const RecordData &R, unsigned &I) { 00056 return Reader.ReadDeclAs<T>(F, R, I); 00057 } 00058 00059 void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name, 00060 const ASTReader::RecordData &R, unsigned &I) { 00061 Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I); 00062 } 00063 00064 void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo, 00065 const ASTReader::RecordData &R, unsigned &I) { 00066 Reader.ReadDeclarationNameInfo(F, NameInfo, R, I); 00067 } 00068 00069 public: 00070 ASTStmtReader(ASTReader &Reader, ModuleFile &F, 00071 llvm::BitstreamCursor &Cursor, 00072 const ASTReader::RecordData &Record, unsigned &Idx) 00073 : Reader(Reader), F(F), DeclsCursor(Cursor), Record(Record), Idx(Idx) { } 00074 00075 /// \brief The number of record fields required for the Stmt class 00076 /// itself. 00077 static const unsigned NumStmtFields = 0; 00078 00079 /// \brief The number of record fields required for the Expr class 00080 /// itself. 00081 static const unsigned NumExprFields = NumStmtFields + 7; 00082 00083 /// \brief Read and initialize a ExplicitTemplateArgumentList structure. 00084 void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, 00085 unsigned NumTemplateArgs); 00086 /// \brief Read and initialize a ExplicitTemplateArgumentList structure. 00087 void ReadExplicitTemplateArgumentList(ASTTemplateArgumentListInfo &ArgList, 00088 unsigned NumTemplateArgs); 00089 00090 void VisitStmt(Stmt *S); 00091 #define STMT(Type, Base) \ 00092 void Visit##Type(Type *); 00093 #include "clang/AST/StmtNodes.inc" 00094 }; 00095 } 00096 00097 void ASTStmtReader:: 00098 ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, 00099 unsigned NumTemplateArgs) { 00100 SourceLocation TemplateKWLoc = ReadSourceLocation(Record, Idx); 00101 TemplateArgumentListInfo ArgInfo; 00102 ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx)); 00103 ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx)); 00104 for (unsigned i = 0; i != NumTemplateArgs; ++i) 00105 ArgInfo.addArgument( 00106 Reader.ReadTemplateArgumentLoc(F, Record, Idx)); 00107 Args.initializeFrom(TemplateKWLoc, ArgInfo); 00108 } 00109 00110 void ASTStmtReader::VisitStmt(Stmt *S) { 00111 assert(Idx == NumStmtFields && "Incorrect statement field count"); 00112 } 00113 00114 void ASTStmtReader::VisitNullStmt(NullStmt *S) { 00115 VisitStmt(S); 00116 S->setSemiLoc(ReadSourceLocation(Record, Idx)); 00117 S->HasLeadingEmptyMacro = Record[Idx++]; 00118 } 00119 00120 void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) { 00121 VisitStmt(S); 00122 SmallVector<Stmt *, 16> Stmts; 00123 unsigned NumStmts = Record[Idx++]; 00124 while (NumStmts--) 00125 Stmts.push_back(Reader.ReadSubStmt()); 00126 S->setStmts(Reader.getContext(), Stmts.data(), Stmts.size()); 00127 S->setLBracLoc(ReadSourceLocation(Record, Idx)); 00128 S->setRBracLoc(ReadSourceLocation(Record, Idx)); 00129 } 00130 00131 void ASTStmtReader::VisitSwitchCase(SwitchCase *S) { 00132 VisitStmt(S); 00133 Reader.RecordSwitchCaseID(S, Record[Idx++]); 00134 } 00135 00136 void ASTStmtReader::VisitCaseStmt(CaseStmt *S) { 00137 VisitSwitchCase(S); 00138 S->setLHS(Reader.ReadSubExpr()); 00139 S->setRHS(Reader.ReadSubExpr()); 00140 S->setSubStmt(Reader.ReadSubStmt()); 00141 S->setCaseLoc(ReadSourceLocation(Record, Idx)); 00142 S->setEllipsisLoc(ReadSourceLocation(Record, Idx)); 00143 S->setColonLoc(ReadSourceLocation(Record, Idx)); 00144 } 00145 00146 void ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) { 00147 VisitSwitchCase(S); 00148 S->setSubStmt(Reader.ReadSubStmt()); 00149 S->setDefaultLoc(ReadSourceLocation(Record, Idx)); 00150 S->setColonLoc(ReadSourceLocation(Record, Idx)); 00151 } 00152 00153 void ASTStmtReader::VisitLabelStmt(LabelStmt *S) { 00154 VisitStmt(S); 00155 LabelDecl *LD = ReadDeclAs<LabelDecl>(Record, Idx); 00156 LD->setStmt(S); 00157 S->setDecl(LD); 00158 S->setSubStmt(Reader.ReadSubStmt()); 00159 S->setIdentLoc(ReadSourceLocation(Record, Idx)); 00160 } 00161 00162 void ASTStmtReader::VisitAttributedStmt(AttributedStmt *S) { 00163 VisitStmt(S); 00164 AttrVec Attrs; 00165 Reader.ReadAttributes(F, Attrs, Record, Idx); 00166 S->Attrs = Attrs; 00167 S->SubStmt = Reader.ReadSubStmt(); 00168 S->AttrLoc = ReadSourceLocation(Record, Idx); 00169 } 00170 00171 void ASTStmtReader::VisitIfStmt(IfStmt *S) { 00172 VisitStmt(S); 00173 S->setConditionVariable(Reader.getContext(), 00174 ReadDeclAs<VarDecl>(Record, Idx)); 00175 S->setCond(Reader.ReadSubExpr()); 00176 S->setThen(Reader.ReadSubStmt()); 00177 S->setElse(Reader.ReadSubStmt()); 00178 S->setIfLoc(ReadSourceLocation(Record, Idx)); 00179 S->setElseLoc(ReadSourceLocation(Record, Idx)); 00180 } 00181 00182 void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) { 00183 VisitStmt(S); 00184 S->setConditionVariable(Reader.getContext(), 00185 ReadDeclAs<VarDecl>(Record, Idx)); 00186 S->setCond(Reader.ReadSubExpr()); 00187 S->setBody(Reader.ReadSubStmt()); 00188 S->setSwitchLoc(ReadSourceLocation(Record, Idx)); 00189 if (Record[Idx++]) 00190 S->setAllEnumCasesCovered(); 00191 00192 SwitchCase *PrevSC = 0; 00193 for (unsigned N = Record.size(); Idx != N; ++Idx) { 00194 SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]); 00195 if (PrevSC) 00196 PrevSC->setNextSwitchCase(SC); 00197 else 00198 S->setSwitchCaseList(SC); 00199 00200 PrevSC = SC; 00201 } 00202 } 00203 00204 void ASTStmtReader::VisitWhileStmt(WhileStmt *S) { 00205 VisitStmt(S); 00206 S->setConditionVariable(Reader.getContext(), 00207 ReadDeclAs<VarDecl>(Record, Idx)); 00208 00209 S->setCond(Reader.ReadSubExpr()); 00210 S->setBody(Reader.ReadSubStmt()); 00211 S->setWhileLoc(ReadSourceLocation(Record, Idx)); 00212 } 00213 00214 void ASTStmtReader::VisitDoStmt(DoStmt *S) { 00215 VisitStmt(S); 00216 S->setCond(Reader.ReadSubExpr()); 00217 S->setBody(Reader.ReadSubStmt()); 00218 S->setDoLoc(ReadSourceLocation(Record, Idx)); 00219 S->setWhileLoc(ReadSourceLocation(Record, Idx)); 00220 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 00221 } 00222 00223 void ASTStmtReader::VisitForStmt(ForStmt *S) { 00224 VisitStmt(S); 00225 S->setInit(Reader.ReadSubStmt()); 00226 S->setCond(Reader.ReadSubExpr()); 00227 S->setConditionVariable(Reader.getContext(), 00228 ReadDeclAs<VarDecl>(Record, Idx)); 00229 S->setInc(Reader.ReadSubExpr()); 00230 S->setBody(Reader.ReadSubStmt()); 00231 S->setForLoc(ReadSourceLocation(Record, Idx)); 00232 S->setLParenLoc(ReadSourceLocation(Record, Idx)); 00233 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 00234 } 00235 00236 void ASTStmtReader::VisitGotoStmt(GotoStmt *S) { 00237 VisitStmt(S); 00238 S->setLabel(ReadDeclAs<LabelDecl>(Record, Idx)); 00239 S->setGotoLoc(ReadSourceLocation(Record, Idx)); 00240 S->setLabelLoc(ReadSourceLocation(Record, Idx)); 00241 } 00242 00243 void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) { 00244 VisitStmt(S); 00245 S->setGotoLoc(ReadSourceLocation(Record, Idx)); 00246 S->setStarLoc(ReadSourceLocation(Record, Idx)); 00247 S->setTarget(Reader.ReadSubExpr()); 00248 } 00249 00250 void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) { 00251 VisitStmt(S); 00252 S->setContinueLoc(ReadSourceLocation(Record, Idx)); 00253 } 00254 00255 void ASTStmtReader::VisitBreakStmt(BreakStmt *S) { 00256 VisitStmt(S); 00257 S->setBreakLoc(ReadSourceLocation(Record, Idx)); 00258 } 00259 00260 void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) { 00261 VisitStmt(S); 00262 S->setRetValue(Reader.ReadSubExpr()); 00263 S->setReturnLoc(ReadSourceLocation(Record, Idx)); 00264 S->setNRVOCandidate(ReadDeclAs<VarDecl>(Record, Idx)); 00265 } 00266 00267 void ASTStmtReader::VisitDeclStmt(DeclStmt *S) { 00268 VisitStmt(S); 00269 S->setStartLoc(ReadSourceLocation(Record, Idx)); 00270 S->setEndLoc(ReadSourceLocation(Record, Idx)); 00271 00272 if (Idx + 1 == Record.size()) { 00273 // Single declaration 00274 S->setDeclGroup(DeclGroupRef(ReadDecl(Record, Idx))); 00275 } else { 00276 SmallVector<Decl *, 16> Decls; 00277 Decls.reserve(Record.size() - Idx); 00278 for (unsigned N = Record.size(); Idx != N; ) 00279 Decls.push_back(ReadDecl(Record, Idx)); 00280 S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Reader.getContext(), 00281 Decls.data(), 00282 Decls.size()))); 00283 } 00284 } 00285 00286 void ASTStmtReader::VisitAsmStmt(AsmStmt *S) { 00287 VisitStmt(S); 00288 unsigned NumOutputs = Record[Idx++]; 00289 unsigned NumInputs = Record[Idx++]; 00290 unsigned NumClobbers = Record[Idx++]; 00291 S->setAsmLoc(ReadSourceLocation(Record, Idx)); 00292 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 00293 S->setVolatile(Record[Idx++]); 00294 S->setSimple(Record[Idx++]); 00295 S->setMSAsm(Record[Idx++]); 00296 00297 S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 00298 00299 // Outputs and inputs 00300 SmallVector<IdentifierInfo *, 16> Names; 00301 SmallVector<StringLiteral*, 16> Constraints; 00302 SmallVector<Stmt*, 16> Exprs; 00303 for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) { 00304 Names.push_back(Reader.GetIdentifierInfo(F, Record, Idx)); 00305 Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 00306 Exprs.push_back(Reader.ReadSubStmt()); 00307 } 00308 00309 // Constraints 00310 SmallVector<StringLiteral*, 16> Clobbers; 00311 for (unsigned I = 0; I != NumClobbers; ++I) 00312 Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 00313 00314 S->setOutputsAndInputsAndClobbers(Reader.getContext(), 00315 Names.data(), Constraints.data(), 00316 Exprs.data(), NumOutputs, NumInputs, 00317 Clobbers.data(), NumClobbers); 00318 } 00319 00320 void ASTStmtReader::VisitExpr(Expr *E) { 00321 VisitStmt(E); 00322 E->setType(Reader.readType(F, Record, Idx)); 00323 E->setTypeDependent(Record[Idx++]); 00324 E->setValueDependent(Record[Idx++]); 00325 E->setInstantiationDependent(Record[Idx++]); 00326 E->ExprBits.ContainsUnexpandedParameterPack = Record[Idx++]; 00327 E->setValueKind(static_cast<ExprValueKind>(Record[Idx++])); 00328 E->setObjectKind(static_cast<ExprObjectKind>(Record[Idx++])); 00329 assert(Idx == NumExprFields && "Incorrect expression field count"); 00330 } 00331 00332 void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) { 00333 VisitExpr(E); 00334 E->setLocation(ReadSourceLocation(Record, Idx)); 00335 E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]); 00336 } 00337 00338 void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) { 00339 VisitExpr(E); 00340 00341 E->DeclRefExprBits.HasQualifier = Record[Idx++]; 00342 E->DeclRefExprBits.HasFoundDecl = Record[Idx++]; 00343 E->DeclRefExprBits.HasTemplateKWAndArgsInfo = Record[Idx++]; 00344 E->DeclRefExprBits.HadMultipleCandidates = Record[Idx++]; 00345 E->DeclRefExprBits.RefersToEnclosingLocal = Record[Idx++]; 00346 unsigned NumTemplateArgs = 0; 00347 if (E->hasTemplateKWAndArgsInfo()) 00348 NumTemplateArgs = Record[Idx++]; 00349 00350 if (E->hasQualifier()) 00351 E->getInternalQualifierLoc() 00352 = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 00353 00354 if (E->hasFoundDecl()) 00355 E->getInternalFoundDecl() = ReadDeclAs<NamedDecl>(Record, Idx); 00356 00357 if (E->hasTemplateKWAndArgsInfo()) 00358 ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), 00359 NumTemplateArgs); 00360 00361 E->setDecl(ReadDeclAs<ValueDecl>(Record, Idx)); 00362 E->setLocation(ReadSourceLocation(Record, Idx)); 00363 ReadDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record, Idx); 00364 } 00365 00366 void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) { 00367 VisitExpr(E); 00368 E->setLocation(ReadSourceLocation(Record, Idx)); 00369 E->setValue(Reader.getContext(), Reader.ReadAPInt(Record, Idx)); 00370 } 00371 00372 void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) { 00373 VisitExpr(E); 00374 E->setValue(Reader.getContext(), Reader.ReadAPFloat(Record, Idx)); 00375 E->setExact(Record[Idx++]); 00376 E->setLocation(ReadSourceLocation(Record, Idx)); 00377 } 00378 00379 void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) { 00380 VisitExpr(E); 00381 E->setSubExpr(Reader.ReadSubExpr()); 00382 } 00383 00384 void ASTStmtReader::VisitStringLiteral(StringLiteral *E) { 00385 VisitExpr(E); 00386 unsigned Len = Record[Idx++]; 00387 assert(Record[Idx] == E->getNumConcatenated() && 00388 "Wrong number of concatenated tokens!"); 00389 ++Idx; 00390 StringLiteral::StringKind kind = 00391 static_cast<StringLiteral::StringKind>(Record[Idx++]); 00392 bool isPascal = Record[Idx++]; 00393 00394 // Read string data 00395 SmallString<16> Str(&Record[Idx], &Record[Idx] + Len); 00396 E->setString(Reader.getContext(), Str.str(), kind, isPascal); 00397 Idx += Len; 00398 00399 // Read source locations 00400 for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I) 00401 E->setStrTokenLoc(I, ReadSourceLocation(Record, Idx)); 00402 } 00403 00404 void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) { 00405 VisitExpr(E); 00406 E->setValue(Record[Idx++]); 00407 E->setLocation(ReadSourceLocation(Record, Idx)); 00408 E->setKind(static_cast<CharacterLiteral::CharacterKind>(Record[Idx++])); 00409 } 00410 00411 void ASTStmtReader::VisitParenExpr(ParenExpr *E) { 00412 VisitExpr(E); 00413 E->setLParen(ReadSourceLocation(Record, Idx)); 00414 E->setRParen(ReadSourceLocation(Record, Idx)); 00415 E->setSubExpr(Reader.ReadSubExpr()); 00416 } 00417 00418 void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) { 00419 VisitExpr(E); 00420 unsigned NumExprs = Record[Idx++]; 00421 E->Exprs = new (Reader.getContext()) Stmt*[NumExprs]; 00422 for (unsigned i = 0; i != NumExprs; ++i) 00423 E->Exprs[i] = Reader.ReadSubStmt(); 00424 E->NumExprs = NumExprs; 00425 E->LParenLoc = ReadSourceLocation(Record, Idx); 00426 E->RParenLoc = ReadSourceLocation(Record, Idx); 00427 } 00428 00429 void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) { 00430 VisitExpr(E); 00431 E->setSubExpr(Reader.ReadSubExpr()); 00432 E->setOpcode((UnaryOperator::Opcode)Record[Idx++]); 00433 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 00434 } 00435 00436 void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) { 00437 typedef OffsetOfExpr::OffsetOfNode Node; 00438 VisitExpr(E); 00439 assert(E->getNumComponents() == Record[Idx]); 00440 ++Idx; 00441 assert(E->getNumExpressions() == Record[Idx]); 00442 ++Idx; 00443 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 00444 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 00445 E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 00446 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 00447 Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]); 00448 SourceLocation Start = ReadSourceLocation(Record, Idx); 00449 SourceLocation End = ReadSourceLocation(Record, Idx); 00450 switch (Kind) { 00451 case Node::Array: 00452 E->setComponent(I, Node(Start, Record[Idx++], End)); 00453 break; 00454 00455 case Node::Field: 00456 E->setComponent(I, Node(Start, ReadDeclAs<FieldDecl>(Record, Idx), End)); 00457 break; 00458 00459 case Node::Identifier: 00460 E->setComponent(I, 00461 Node(Start, 00462 Reader.GetIdentifierInfo(F, Record, Idx), 00463 End)); 00464 break; 00465 00466 case Node::Base: { 00467 CXXBaseSpecifier *Base = new (Reader.getContext()) CXXBaseSpecifier(); 00468 *Base = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 00469 E->setComponent(I, Node(Base)); 00470 break; 00471 } 00472 } 00473 } 00474 00475 for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I) 00476 E->setIndexExpr(I, Reader.ReadSubExpr()); 00477 } 00478 00479 void ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) { 00480 VisitExpr(E); 00481 E->setKind(static_cast<UnaryExprOrTypeTrait>(Record[Idx++])); 00482 if (Record[Idx] == 0) { 00483 E->setArgument(Reader.ReadSubExpr()); 00484 ++Idx; 00485 } else { 00486 E->setArgument(GetTypeSourceInfo(Record, Idx)); 00487 } 00488 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 00489 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 00490 } 00491 00492 void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 00493 VisitExpr(E); 00494 E->setLHS(Reader.ReadSubExpr()); 00495 E->setRHS(Reader.ReadSubExpr()); 00496 E->setRBracketLoc(ReadSourceLocation(Record, Idx)); 00497 } 00498 00499 void ASTStmtReader::VisitCallExpr(CallExpr *E) { 00500 VisitExpr(E); 00501 E->setNumArgs(Reader.getContext(), Record[Idx++]); 00502 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 00503 E->setCallee(Reader.ReadSubExpr()); 00504 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 00505 E->setArg(I, Reader.ReadSubExpr()); 00506 } 00507 00508 void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { 00509 VisitCallExpr(E); 00510 } 00511 00512 void ASTStmtReader::VisitMemberExpr(MemberExpr *E) { 00513 // Don't call VisitExpr, this is fully initialized at creation. 00514 assert(E->getStmtClass() == Stmt::MemberExprClass && 00515 "It's a subclass, we must advance Idx!"); 00516 } 00517 00518 void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) { 00519 VisitExpr(E); 00520 E->setBase(Reader.ReadSubExpr()); 00521 E->setIsaMemberLoc(ReadSourceLocation(Record, Idx)); 00522 E->setArrow(Record[Idx++]); 00523 } 00524 00525 void ASTStmtReader:: 00526 VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 00527 VisitExpr(E); 00528 E->Operand = Reader.ReadSubExpr(); 00529 E->setShouldCopy(Record[Idx++]); 00530 } 00531 00532 void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 00533 VisitExplicitCastExpr(E); 00534 E->LParenLoc = ReadSourceLocation(Record, Idx); 00535 E->BridgeKeywordLoc = ReadSourceLocation(Record, Idx); 00536 E->Kind = Record[Idx++]; 00537 } 00538 00539 void ASTStmtReader::VisitCastExpr(CastExpr *E) { 00540 VisitExpr(E); 00541 unsigned NumBaseSpecs = Record[Idx++]; 00542 assert(NumBaseSpecs == E->path_size()); 00543 E->setSubExpr(Reader.ReadSubExpr()); 00544 E->setCastKind((CastExpr::CastKind)Record[Idx++]); 00545 CastExpr::path_iterator BaseI = E->path_begin(); 00546 while (NumBaseSpecs--) { 00547 CXXBaseSpecifier *BaseSpec = new (Reader.getContext()) CXXBaseSpecifier; 00548 *BaseSpec = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 00549 *BaseI++ = BaseSpec; 00550 } 00551 } 00552 00553 void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) { 00554 VisitExpr(E); 00555 E->setLHS(Reader.ReadSubExpr()); 00556 E->setRHS(Reader.ReadSubExpr()); 00557 E->setOpcode((BinaryOperator::Opcode)Record[Idx++]); 00558 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 00559 } 00560 00561 void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 00562 VisitBinaryOperator(E); 00563 E->setComputationLHSType(Reader.readType(F, Record, Idx)); 00564 E->setComputationResultType(Reader.readType(F, Record, Idx)); 00565 } 00566 00567 void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) { 00568 VisitExpr(E); 00569 E->SubExprs[ConditionalOperator::COND] = Reader.ReadSubExpr(); 00570 E->SubExprs[ConditionalOperator::LHS] = Reader.ReadSubExpr(); 00571 E->SubExprs[ConditionalOperator::RHS] = Reader.ReadSubExpr(); 00572 E->QuestionLoc = ReadSourceLocation(Record, Idx); 00573 E->ColonLoc = ReadSourceLocation(Record, Idx); 00574 } 00575 00576 void 00577 ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) { 00578 VisitExpr(E); 00579 E->OpaqueValue = cast<OpaqueValueExpr>(Reader.ReadSubExpr()); 00580 E->SubExprs[BinaryConditionalOperator::COMMON] = Reader.ReadSubExpr(); 00581 E->SubExprs[BinaryConditionalOperator::COND] = Reader.ReadSubExpr(); 00582 E->SubExprs[BinaryConditionalOperator::LHS] = Reader.ReadSubExpr(); 00583 E->SubExprs[BinaryConditionalOperator::RHS] = Reader.ReadSubExpr(); 00584 E->QuestionLoc = ReadSourceLocation(Record, Idx); 00585 E->ColonLoc = ReadSourceLocation(Record, Idx); 00586 } 00587 00588 void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) { 00589 VisitCastExpr(E); 00590 } 00591 00592 void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) { 00593 VisitCastExpr(E); 00594 E->setTypeInfoAsWritten(GetTypeSourceInfo(Record, Idx)); 00595 } 00596 00597 void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) { 00598 VisitExplicitCastExpr(E); 00599 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 00600 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 00601 } 00602 00603 void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 00604 VisitExpr(E); 00605 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 00606 E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 00607 E->setInitializer(Reader.ReadSubExpr()); 00608 E->setFileScope(Record[Idx++]); 00609 } 00610 00611 void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) { 00612 VisitExpr(E); 00613 E->setBase(Reader.ReadSubExpr()); 00614 E->setAccessor(Reader.GetIdentifierInfo(F, Record, Idx)); 00615 E->setAccessorLoc(ReadSourceLocation(Record, Idx)); 00616 } 00617 00618 void ASTStmtReader::VisitInitListExpr(InitListExpr *E) { 00619 VisitExpr(E); 00620 E->setSyntacticForm(cast_or_null<InitListExpr>(Reader.ReadSubStmt())); 00621 E->setLBraceLoc(ReadSourceLocation(Record, Idx)); 00622 E->setRBraceLoc(ReadSourceLocation(Record, Idx)); 00623 bool isArrayFiller = Record[Idx++]; 00624 Expr *filler = 0; 00625 if (isArrayFiller) { 00626 filler = Reader.ReadSubExpr(); 00627 E->ArrayFillerOrUnionFieldInit = filler; 00628 } else 00629 E->ArrayFillerOrUnionFieldInit = ReadDeclAs<FieldDecl>(Record, Idx); 00630 E->sawArrayRangeDesignator(Record[Idx++]); 00631 E->setInitializesStdInitializerList(Record[Idx++]); 00632 unsigned NumInits = Record[Idx++]; 00633 E->reserveInits(Reader.getContext(), NumInits); 00634 if (isArrayFiller) { 00635 for (unsigned I = 0; I != NumInits; ++I) { 00636 Expr *init = Reader.ReadSubExpr(); 00637 E->updateInit(Reader.getContext(), I, init ? init : filler); 00638 } 00639 } else { 00640 for (unsigned I = 0; I != NumInits; ++I) 00641 E->updateInit(Reader.getContext(), I, Reader.ReadSubExpr()); 00642 } 00643 } 00644 00645 void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) { 00646 typedef DesignatedInitExpr::Designator Designator; 00647 00648 VisitExpr(E); 00649 unsigned NumSubExprs = Record[Idx++]; 00650 assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs"); 00651 for (unsigned I = 0; I != NumSubExprs; ++I) 00652 E->setSubExpr(I, Reader.ReadSubExpr()); 00653 E->setEqualOrColonLoc(ReadSourceLocation(Record, Idx)); 00654 E->setGNUSyntax(Record[Idx++]); 00655 00656 SmallVector<Designator, 4> Designators; 00657 while (Idx < Record.size()) { 00658 switch ((DesignatorTypes)Record[Idx++]) { 00659 case DESIG_FIELD_DECL: { 00660 FieldDecl *Field = ReadDeclAs<FieldDecl>(Record, Idx); 00661 SourceLocation DotLoc 00662 = ReadSourceLocation(Record, Idx); 00663 SourceLocation FieldLoc 00664 = ReadSourceLocation(Record, Idx); 00665 Designators.push_back(Designator(Field->getIdentifier(), DotLoc, 00666 FieldLoc)); 00667 Designators.back().setField(Field); 00668 break; 00669 } 00670 00671 case DESIG_FIELD_NAME: { 00672 const IdentifierInfo *Name = Reader.GetIdentifierInfo(F, Record, Idx); 00673 SourceLocation DotLoc 00674 = ReadSourceLocation(Record, Idx); 00675 SourceLocation FieldLoc 00676 = ReadSourceLocation(Record, Idx); 00677 Designators.push_back(Designator(Name, DotLoc, FieldLoc)); 00678 break; 00679 } 00680 00681 case DESIG_ARRAY: { 00682 unsigned Index = Record[Idx++]; 00683 SourceLocation LBracketLoc 00684 = ReadSourceLocation(Record, Idx); 00685 SourceLocation RBracketLoc 00686 = ReadSourceLocation(Record, Idx); 00687 Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc)); 00688 break; 00689 } 00690 00691 case DESIG_ARRAY_RANGE: { 00692 unsigned Index = Record[Idx++]; 00693 SourceLocation LBracketLoc 00694 = ReadSourceLocation(Record, Idx); 00695 SourceLocation EllipsisLoc 00696 = ReadSourceLocation(Record, Idx); 00697 SourceLocation RBracketLoc 00698 = ReadSourceLocation(Record, Idx); 00699 Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc, 00700 RBracketLoc)); 00701 break; 00702 } 00703 } 00704 } 00705 E->setDesignators(Reader.getContext(), 00706 Designators.data(), Designators.size()); 00707 } 00708 00709 void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { 00710 VisitExpr(E); 00711 } 00712 00713 void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) { 00714 VisitExpr(E); 00715 E->setSubExpr(Reader.ReadSubExpr()); 00716 E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx)); 00717 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 00718 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 00719 } 00720 00721 void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) { 00722 VisitExpr(E); 00723 E->setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 00724 E->setLabelLoc(ReadSourceLocation(Record, Idx)); 00725 E->setLabel(ReadDeclAs<LabelDecl>(Record, Idx)); 00726 } 00727 00728 void ASTStmtReader::VisitStmtExpr(StmtExpr *E) { 00729 VisitExpr(E); 00730 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 00731 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 00732 E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt())); 00733 } 00734 00735 void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) { 00736 VisitExpr(E); 00737 E->setCond(Reader.ReadSubExpr()); 00738 E->setLHS(Reader.ReadSubExpr()); 00739 E->setRHS(Reader.ReadSubExpr()); 00740 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 00741 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 00742 } 00743 00744 void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) { 00745 VisitExpr(E); 00746 E->setTokenLocation(ReadSourceLocation(Record, Idx)); 00747 } 00748 00749 void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) { 00750 VisitExpr(E); 00751 SmallVector<Expr *, 16> Exprs; 00752 unsigned NumExprs = Record[Idx++]; 00753 while (NumExprs--) 00754 Exprs.push_back(Reader.ReadSubExpr()); 00755 E->setExprs(Reader.getContext(), Exprs.data(), Exprs.size()); 00756 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 00757 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 00758 } 00759 00760 void ASTStmtReader::VisitBlockExpr(BlockExpr *E) { 00761 VisitExpr(E); 00762 E->setBlockDecl(ReadDeclAs<BlockDecl>(Record, Idx)); 00763 } 00764 00765 void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) { 00766 VisitExpr(E); 00767 E->NumAssocs = Record[Idx++]; 00768 E->AssocTypes = new (Reader.getContext()) TypeSourceInfo*[E->NumAssocs]; 00769 E->SubExprs = 00770 new(Reader.getContext()) Stmt*[GenericSelectionExpr::END_EXPR+E->NumAssocs]; 00771 00772 E->SubExprs[GenericSelectionExpr::CONTROLLING] = Reader.ReadSubExpr(); 00773 for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) { 00774 E->AssocTypes[I] = GetTypeSourceInfo(Record, Idx); 00775 E->SubExprs[GenericSelectionExpr::END_EXPR+I] = Reader.ReadSubExpr(); 00776 } 00777 E->ResultIndex = Record[Idx++]; 00778 00779 E->GenericLoc = ReadSourceLocation(Record, Idx); 00780 E->DefaultLoc = ReadSourceLocation(Record, Idx); 00781 E->RParenLoc = ReadSourceLocation(Record, Idx); 00782 } 00783 00784 void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) { 00785 VisitExpr(E); 00786 unsigned numSemanticExprs = Record[Idx++]; 00787 assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs); 00788 E->PseudoObjectExprBits.ResultIndex = Record[Idx++]; 00789 00790 // Read the syntactic expression. 00791 E->getSubExprsBuffer()[0] = Reader.ReadSubExpr(); 00792 00793 // Read all the semantic expressions. 00794 for (unsigned i = 0; i != numSemanticExprs; ++i) { 00795 Expr *subExpr = Reader.ReadSubExpr(); 00796 E->getSubExprsBuffer()[i+1] = subExpr; 00797 } 00798 } 00799 00800 void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) { 00801 VisitExpr(E); 00802 E->Op = AtomicExpr::AtomicOp(Record[Idx++]); 00803 E->NumSubExprs = AtomicExpr::getNumSubExprs(E->Op); 00804 for (unsigned I = 0; I != E->NumSubExprs; ++I) 00805 E->SubExprs[I] = Reader.ReadSubExpr(); 00806 E->BuiltinLoc = ReadSourceLocation(Record, Idx); 00807 E->RParenLoc = ReadSourceLocation(Record, Idx); 00808 } 00809 00810 //===----------------------------------------------------------------------===// 00811 // Objective-C Expressions and Statements 00812 00813 void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) { 00814 VisitExpr(E); 00815 E->setString(cast<StringLiteral>(Reader.ReadSubStmt())); 00816 E->setAtLoc(ReadSourceLocation(Record, Idx)); 00817 } 00818 00819 void ASTStmtReader::VisitObjCBoxedExpr(ObjCBoxedExpr *E) { 00820 VisitExpr(E); 00821 // could be one of several IntegerLiteral, FloatLiteral, etc. 00822 E->SubExpr = Reader.ReadSubStmt(); 00823 E->BoxingMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 00824 E->Range = ReadSourceRange(Record, Idx); 00825 } 00826 00827 void ASTStmtReader::VisitObjCArrayLiteral(ObjCArrayLiteral *E) { 00828 VisitExpr(E); 00829 unsigned NumElements = Record[Idx++]; 00830 assert(NumElements == E->getNumElements() && "Wrong number of elements"); 00831 Expr **Elements = E->getElements(); 00832 for (unsigned I = 0, N = NumElements; I != N; ++I) 00833 Elements[I] = Reader.ReadSubExpr(); 00834 E->ArrayWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 00835 E->Range = ReadSourceRange(Record, Idx); 00836 } 00837 00838 void ASTStmtReader::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) { 00839 VisitExpr(E); 00840 unsigned NumElements = Record[Idx++]; 00841 assert(NumElements == E->getNumElements() && "Wrong number of elements"); 00842 bool HasPackExpansions = Record[Idx++]; 00843 assert(HasPackExpansions == E->HasPackExpansions &&"Pack expansion mismatch"); 00844 ObjCDictionaryLiteral::KeyValuePair *KeyValues = E->getKeyValues(); 00845 ObjCDictionaryLiteral::ExpansionData *Expansions = E->getExpansionData(); 00846 for (unsigned I = 0; I != NumElements; ++I) { 00847 KeyValues[I].Key = Reader.ReadSubExpr(); 00848 KeyValues[I].Value = Reader.ReadSubExpr(); 00849 if (HasPackExpansions) { 00850 Expansions[I].EllipsisLoc = ReadSourceLocation(Record, Idx); 00851 Expansions[I].NumExpansionsPlusOne = Record[Idx++]; 00852 } 00853 } 00854 E->DictWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 00855 E->Range = ReadSourceRange(Record, Idx); 00856 } 00857 00858 void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) { 00859 VisitExpr(E); 00860 E->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 00861 E->setAtLoc(ReadSourceLocation(Record, Idx)); 00862 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 00863 } 00864 00865 void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) { 00866 VisitExpr(E); 00867 E->setSelector(Reader.ReadSelector(F, Record, Idx)); 00868 E->setAtLoc(ReadSourceLocation(Record, Idx)); 00869 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 00870 } 00871 00872 void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { 00873 VisitExpr(E); 00874 E->setProtocol(ReadDeclAs<ObjCProtocolDecl>(Record, Idx)); 00875 E->setAtLoc(ReadSourceLocation(Record, Idx)); 00876 E->ProtoLoc = ReadSourceLocation(Record, Idx); 00877 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 00878 } 00879 00880 void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { 00881 VisitExpr(E); 00882 E->setDecl(ReadDeclAs<ObjCIvarDecl>(Record, Idx)); 00883 E->setLocation(ReadSourceLocation(Record, Idx)); 00884 E->setBase(Reader.ReadSubExpr()); 00885 E->setIsArrow(Record[Idx++]); 00886 E->setIsFreeIvar(Record[Idx++]); 00887 } 00888 00889 void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 00890 VisitExpr(E); 00891 unsigned MethodRefFlags = Record[Idx++]; 00892 bool Implicit = Record[Idx++] != 0; 00893 if (Implicit) { 00894 ObjCMethodDecl *Getter = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 00895 ObjCMethodDecl *Setter = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 00896 E->setImplicitProperty(Getter, Setter, MethodRefFlags); 00897 } else { 00898 E->setExplicitProperty(ReadDeclAs<ObjCPropertyDecl>(Record, Idx), 00899 MethodRefFlags); 00900 } 00901 E->setLocation(ReadSourceLocation(Record, Idx)); 00902 E->setReceiverLocation(ReadSourceLocation(Record, Idx)); 00903 switch (Record[Idx++]) { 00904 case 0: 00905 E->setBase(Reader.ReadSubExpr()); 00906 break; 00907 case 1: 00908 E->setSuperReceiver(Reader.readType(F, Record, Idx)); 00909 break; 00910 case 2: 00911 E->setClassReceiver(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx)); 00912 break; 00913 } 00914 } 00915 00916 void ASTStmtReader::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 00917 VisitExpr(E); 00918 E->setRBracket(ReadSourceLocation(Record, Idx)); 00919 E->setBaseExpr(Reader.ReadSubExpr()); 00920 E->setKeyExpr(Reader.ReadSubExpr()); 00921 E->GetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 00922 E->SetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 00923 } 00924 00925 void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) { 00926 VisitExpr(E); 00927 assert(Record[Idx] == E->getNumArgs()); 00928 ++Idx; 00929 unsigned NumStoredSelLocs = Record[Idx++]; 00930 E->SelLocsKind = Record[Idx++]; 00931 E->setDelegateInitCall(Record[Idx++]); 00932 E->IsImplicit = Record[Idx++]; 00933 ObjCMessageExpr::ReceiverKind Kind 00934 = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]); 00935 switch (Kind) { 00936 case ObjCMessageExpr::Instance: 00937 E->setInstanceReceiver(Reader.ReadSubExpr()); 00938 break; 00939 00940 case ObjCMessageExpr::Class: 00941 E->setClassReceiver(GetTypeSourceInfo(Record, Idx)); 00942 break; 00943 00944 case ObjCMessageExpr::SuperClass: 00945 case ObjCMessageExpr::SuperInstance: { 00946 QualType T = Reader.readType(F, Record, Idx); 00947 SourceLocation SuperLoc = ReadSourceLocation(Record, Idx); 00948 E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance); 00949 break; 00950 } 00951 } 00952 00953 assert(Kind == E->getReceiverKind()); 00954 00955 if (Record[Idx++]) 00956 E->setMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx)); 00957 else 00958 E->setSelector(Reader.ReadSelector(F, Record, Idx)); 00959 00960 E->LBracLoc = ReadSourceLocation(Record, Idx); 00961 E->RBracLoc = ReadSourceLocation(Record, Idx); 00962 00963 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 00964 E->setArg(I, Reader.ReadSubExpr()); 00965 00966 SourceLocation *Locs = E->getStoredSelLocs(); 00967 for (unsigned I = 0; I != NumStoredSelLocs; ++I) 00968 Locs[I] = ReadSourceLocation(Record, Idx); 00969 } 00970 00971 void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { 00972 VisitStmt(S); 00973 S->setElement(Reader.ReadSubStmt()); 00974 S->setCollection(Reader.ReadSubExpr()); 00975 S->setBody(Reader.ReadSubStmt()); 00976 S->setForLoc(ReadSourceLocation(Record, Idx)); 00977 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 00978 } 00979 00980 void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { 00981 VisitStmt(S); 00982 S->setCatchBody(Reader.ReadSubStmt()); 00983 S->setCatchParamDecl(ReadDeclAs<VarDecl>(Record, Idx)); 00984 S->setAtCatchLoc(ReadSourceLocation(Record, Idx)); 00985 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 00986 } 00987 00988 void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 00989 VisitStmt(S); 00990 S->setFinallyBody(Reader.ReadSubStmt()); 00991 S->setAtFinallyLoc(ReadSourceLocation(Record, Idx)); 00992 } 00993 00994 void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) { 00995 VisitStmt(S); 00996 S->setSubStmt(Reader.ReadSubStmt()); 00997 S->setAtLoc(ReadSourceLocation(Record, Idx)); 00998 } 00999 01000 void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { 01001 VisitStmt(S); 01002 assert(Record[Idx] == S->getNumCatchStmts()); 01003 ++Idx; 01004 bool HasFinally = Record[Idx++]; 01005 S->setTryBody(Reader.ReadSubStmt()); 01006 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) 01007 S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt())); 01008 01009 if (HasFinally) 01010 S->setFinallyStmt(Reader.ReadSubStmt()); 01011 S->setAtTryLoc(ReadSourceLocation(Record, Idx)); 01012 } 01013 01014 void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) { 01015 VisitStmt(S); 01016 S->setSynchExpr(Reader.ReadSubStmt()); 01017 S->setSynchBody(Reader.ReadSubStmt()); 01018 S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx)); 01019 } 01020 01021 void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { 01022 VisitStmt(S); 01023 S->setThrowExpr(Reader.ReadSubStmt()); 01024 S->setThrowLoc(ReadSourceLocation(Record, Idx)); 01025 } 01026 01027 void ASTStmtReader::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 01028 VisitExpr(E); 01029 E->setValue(Record[Idx++]); 01030 E->setLocation(ReadSourceLocation(Record, Idx)); 01031 } 01032 01033 //===----------------------------------------------------------------------===// 01034 // C++ Expressions and Statements 01035 //===----------------------------------------------------------------------===// 01036 01037 void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) { 01038 VisitStmt(S); 01039 S->CatchLoc = ReadSourceLocation(Record, Idx); 01040 S->ExceptionDecl = ReadDeclAs<VarDecl>(Record, Idx); 01041 S->HandlerBlock = Reader.ReadSubStmt(); 01042 } 01043 01044 void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) { 01045 VisitStmt(S); 01046 assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?"); 01047 ++Idx; 01048 S->TryLoc = ReadSourceLocation(Record, Idx); 01049 S->getStmts()[0] = Reader.ReadSubStmt(); 01050 for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i) 01051 S->getStmts()[i + 1] = Reader.ReadSubStmt(); 01052 } 01053 01054 void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) { 01055 VisitStmt(S); 01056 S->setForLoc(ReadSourceLocation(Record, Idx)); 01057 S->setColonLoc(ReadSourceLocation(Record, Idx)); 01058 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 01059 S->setRangeStmt(Reader.ReadSubStmt()); 01060 S->setBeginEndStmt(Reader.ReadSubStmt()); 01061 S->setCond(Reader.ReadSubExpr()); 01062 S->setInc(Reader.ReadSubExpr()); 01063 S->setLoopVarStmt(Reader.ReadSubStmt()); 01064 S->setBody(Reader.ReadSubStmt()); 01065 } 01066 01067 void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) { 01068 VisitStmt(S); 01069 S->KeywordLoc = ReadSourceLocation(Record, Idx); 01070 S->IsIfExists = Record[Idx++]; 01071 S->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 01072 ReadDeclarationNameInfo(S->NameInfo, Record, Idx); 01073 S->SubStmt = Reader.ReadSubStmt(); 01074 } 01075 01076 void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 01077 VisitCallExpr(E); 01078 E->Operator = (OverloadedOperatorKind)Record[Idx++]; 01079 E->Range = Reader.ReadSourceRange(F, Record, Idx); 01080 } 01081 01082 void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) { 01083 VisitExpr(E); 01084 E->NumArgs = Record[Idx++]; 01085 if (E->NumArgs) 01086 E->Args = new (Reader.getContext()) Stmt*[E->NumArgs]; 01087 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 01088 E->setArg(I, Reader.ReadSubExpr()); 01089 E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx)); 01090 E->setLocation(ReadSourceLocation(Record, Idx)); 01091 E->setElidable(Record[Idx++]); 01092 E->setHadMultipleCandidates(Record[Idx++]); 01093 E->setRequiresZeroInitialization(Record[Idx++]); 01094 E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]); 01095 E->ParenRange = ReadSourceRange(Record, Idx); 01096 } 01097 01098 void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) { 01099 VisitCXXConstructExpr(E); 01100 E->Type = GetTypeSourceInfo(Record, Idx); 01101 } 01102 01103 void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) { 01104 VisitExpr(E); 01105 unsigned NumCaptures = Record[Idx++]; 01106 assert(NumCaptures == E->NumCaptures);(void)NumCaptures; 01107 unsigned NumArrayIndexVars = Record[Idx++]; 01108 E->IntroducerRange = ReadSourceRange(Record, Idx); 01109 E->CaptureDefault = static_cast<LambdaCaptureDefault>(Record[Idx++]); 01110 E->ExplicitParams = Record[Idx++]; 01111 E->ExplicitResultType = Record[Idx++]; 01112 E->ClosingBrace = ReadSourceLocation(Record, Idx); 01113 01114 // Read capture initializers. 01115 for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(), 01116 CEnd = E->capture_init_end(); 01117 C != CEnd; ++C) 01118 *C = Reader.ReadSubExpr(); 01119 01120 // Read array capture index variables. 01121 if (NumArrayIndexVars > 0) { 01122 unsigned *ArrayIndexStarts = E->getArrayIndexStarts(); 01123 for (unsigned I = 0; I != NumCaptures + 1; ++I) 01124 ArrayIndexStarts[I] = Record[Idx++]; 01125 01126 VarDecl **ArrayIndexVars = E->getArrayIndexVars(); 01127 for (unsigned I = 0; I != NumArrayIndexVars; ++I) 01128 ArrayIndexVars[I] = ReadDeclAs<VarDecl>(Record, Idx); 01129 } 01130 } 01131 01132 void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) { 01133 VisitExplicitCastExpr(E); 01134 SourceRange R = ReadSourceRange(Record, Idx); 01135 E->Loc = R.getBegin(); 01136 E->RParenLoc = R.getEnd(); 01137 } 01138 01139 void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) { 01140 return VisitCXXNamedCastExpr(E); 01141 } 01142 01143 void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 01144 return VisitCXXNamedCastExpr(E); 01145 } 01146 01147 void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) { 01148 return VisitCXXNamedCastExpr(E); 01149 } 01150 01151 void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) { 01152 return VisitCXXNamedCastExpr(E); 01153 } 01154 01155 void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) { 01156 VisitExplicitCastExpr(E); 01157 E->setTypeBeginLoc(ReadSourceLocation(Record, Idx)); 01158 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 01159 } 01160 01161 void ASTStmtReader::VisitUserDefinedLiteral(UserDefinedLiteral *E) { 01162 VisitCallExpr(E); 01163 E->UDSuffixLoc = ReadSourceLocation(Record, Idx); 01164 } 01165 01166 void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 01167 VisitExpr(E); 01168 E->setValue(Record[Idx++]); 01169 E->setLocation(ReadSourceLocation(Record, Idx)); 01170 } 01171 01172 void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) { 01173 VisitExpr(E); 01174 E->setLocation(ReadSourceLocation(Record, Idx)); 01175 } 01176 01177 void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) { 01178 VisitExpr(E); 01179 E->setSourceRange(ReadSourceRange(Record, Idx)); 01180 if (E->isTypeOperand()) { // typeid(int) 01181 E->setTypeOperandSourceInfo( 01182 GetTypeSourceInfo(Record, Idx)); 01183 return; 01184 } 01185 01186 // typeid(42+2) 01187 E->setExprOperand(Reader.ReadSubExpr()); 01188 } 01189 01190 void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) { 01191 VisitExpr(E); 01192 E->setLocation(ReadSourceLocation(Record, Idx)); 01193 E->setImplicit(Record[Idx++]); 01194 } 01195 01196 void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) { 01197 VisitExpr(E); 01198 E->ThrowLoc = ReadSourceLocation(Record, Idx); 01199 E->Op = Reader.ReadSubExpr(); 01200 E->IsThrownVariableInScope = Record[Idx++]; 01201 } 01202 01203 void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 01204 VisitExpr(E); 01205 01206 assert((bool)Record[Idx] == E->Param.getInt() && "We messed up at creation ?"); 01207 ++Idx; // HasOtherExprStored and SubExpr was handled during creation. 01208 E->Param.setPointer(ReadDeclAs<ParmVarDecl>(Record, Idx)); 01209 E->Loc = ReadSourceLocation(Record, Idx); 01210 } 01211 01212 void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 01213 VisitExpr(E); 01214 E->setTemporary(Reader.ReadCXXTemporary(F, Record, Idx)); 01215 E->setSubExpr(Reader.ReadSubExpr()); 01216 } 01217 01218 void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { 01219 VisitExpr(E); 01220 E->TypeInfo = GetTypeSourceInfo(Record, Idx); 01221 E->RParenLoc = ReadSourceLocation(Record, Idx); 01222 } 01223 01224 void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) { 01225 VisitExpr(E); 01226 E->GlobalNew = Record[Idx++]; 01227 bool isArray = Record[Idx++]; 01228 E->UsualArrayDeleteWantsSize = Record[Idx++]; 01229 unsigned NumPlacementArgs = Record[Idx++]; 01230 E->StoredInitializationStyle = Record[Idx++]; 01231 E->setOperatorNew(ReadDeclAs<FunctionDecl>(Record, Idx)); 01232 E->setOperatorDelete(ReadDeclAs<FunctionDecl>(Record, Idx)); 01233 E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx); 01234 E->TypeIdParens = ReadSourceRange(Record, Idx); 01235 E->StartLoc = ReadSourceLocation(Record, Idx); 01236 E->DirectInitRange = ReadSourceRange(Record, Idx); 01237 01238 E->AllocateArgsArray(Reader.getContext(), isArray, NumPlacementArgs, 01239 E->StoredInitializationStyle != 0); 01240 01241 // Install all the subexpressions. 01242 for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end(); 01243 I != e; ++I) 01244 *I = Reader.ReadSubStmt(); 01245 } 01246 01247 void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 01248 VisitExpr(E); 01249 E->GlobalDelete = Record[Idx++]; 01250 E->ArrayForm = Record[Idx++]; 01251 E->ArrayFormAsWritten = Record[Idx++]; 01252 E->UsualArrayDeleteWantsSize = Record[Idx++]; 01253 E->OperatorDelete = ReadDeclAs<FunctionDecl>(Record, Idx); 01254 E->Argument = Reader.ReadSubExpr(); 01255 E->Loc = ReadSourceLocation(Record, Idx); 01256 } 01257 01258 void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 01259 VisitExpr(E); 01260 01261 E->Base = Reader.ReadSubExpr(); 01262 E->IsArrow = Record[Idx++]; 01263 E->OperatorLoc = ReadSourceLocation(Record, Idx); 01264 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 01265 E->ScopeType = GetTypeSourceInfo(Record, Idx); 01266 E->ColonColonLoc = ReadSourceLocation(Record, Idx); 01267 E->TildeLoc = ReadSourceLocation(Record, Idx); 01268 01269 IdentifierInfo *II = Reader.GetIdentifierInfo(F, Record, Idx); 01270 if (II) 01271 E->setDestroyedType(II, ReadSourceLocation(Record, Idx)); 01272 else 01273 E->setDestroyedType(GetTypeSourceInfo(Record, Idx)); 01274 } 01275 01276 void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) { 01277 VisitExpr(E); 01278 01279 unsigned NumObjects = Record[Idx++]; 01280 assert(NumObjects == E->getNumObjects()); 01281 for (unsigned i = 0; i != NumObjects; ++i) 01282 E->getObjectsBuffer()[i] = ReadDeclAs<BlockDecl>(Record, Idx); 01283 01284 E->SubExpr = Reader.ReadSubExpr(); 01285 } 01286 01287 void 01288 ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){ 01289 VisitExpr(E); 01290 01291 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 01292 ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), 01293 /*NumTemplateArgs=*/Record[Idx++]); 01294 01295 E->Base = Reader.ReadSubExpr(); 01296 E->BaseType = Reader.readType(F, Record, Idx); 01297 E->IsArrow = Record[Idx++]; 01298 E->OperatorLoc = ReadSourceLocation(Record, Idx); 01299 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 01300 E->FirstQualifierFoundInScope = ReadDeclAs<NamedDecl>(Record, Idx); 01301 ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx); 01302 } 01303 01304 void 01305 ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { 01306 VisitExpr(E); 01307 01308 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 01309 ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), 01310 /*NumTemplateArgs=*/Record[Idx++]); 01311 01312 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 01313 ReadDeclarationNameInfo(E->NameInfo, Record, Idx); 01314 } 01315 01316 void 01317 ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) { 01318 VisitExpr(E); 01319 assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?"); 01320 ++Idx; // NumArgs; 01321 for (unsigned I = 0, N = E->arg_size(); I != N; ++I) 01322 E->setArg(I, Reader.ReadSubExpr()); 01323 E->Type = GetTypeSourceInfo(Record, Idx); 01324 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 01325 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 01326 } 01327 01328 void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) { 01329 VisitExpr(E); 01330 01331 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 01332 ReadTemplateKWAndArgsInfo(*E->getTemplateKWAndArgsInfo(), 01333 /*NumTemplateArgs=*/Record[Idx++]); 01334 01335 unsigned NumDecls = Record[Idx++]; 01336 UnresolvedSet<8> Decls; 01337 for (unsigned i = 0; i != NumDecls; ++i) { 01338 NamedDecl *D = ReadDeclAs<NamedDecl>(Record, Idx); 01339 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 01340 Decls.addDecl(D, AS); 01341 } 01342 E->initializeResults(Reader.getContext(), Decls.begin(), Decls.end()); 01343 01344 ReadDeclarationNameInfo(E->NameInfo, Record, Idx); 01345 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 01346 } 01347 01348 void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) { 01349 VisitOverloadExpr(E); 01350 E->IsArrow = Record[Idx++]; 01351 E->HasUnresolvedUsing = Record[Idx++]; 01352 E->Base = Reader.ReadSubExpr(); 01353 E->BaseType = Reader.readType(F, Record, Idx); 01354 E->OperatorLoc = ReadSourceLocation(Record, Idx); 01355 } 01356 01357 void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { 01358 VisitOverloadExpr(E); 01359 E->RequiresADL = Record[Idx++]; 01360 if (E->RequiresADL) 01361 E->StdIsAssociatedNamespace = Record[Idx++]; 01362 E->Overloaded = Record[Idx++]; 01363 E->NamingClass = ReadDeclAs<CXXRecordDecl>(Record, Idx); 01364 } 01365 01366 void ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 01367 VisitExpr(E); 01368 E->UTT = (UnaryTypeTrait)Record[Idx++]; 01369 E->Value = (bool)Record[Idx++]; 01370 SourceRange Range = ReadSourceRange(Record, Idx); 01371 E->Loc = Range.getBegin(); 01372 E->RParen = Range.getEnd(); 01373 E->QueriedType = GetTypeSourceInfo(Record, Idx); 01374 } 01375 01376 void ASTStmtReader::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) { 01377 VisitExpr(E); 01378 E->BTT = (BinaryTypeTrait)Record[Idx++]; 01379 E->Value = (bool)Record[Idx++]; 01380 SourceRange Range = ReadSourceRange(Record, Idx); 01381 E->Loc = Range.getBegin(); 01382 E->RParen = Range.getEnd(); 01383 E->LhsType = GetTypeSourceInfo(Record, Idx); 01384 E->RhsType = GetTypeSourceInfo(Record, Idx); 01385 } 01386 01387 void ASTStmtReader::VisitTypeTraitExpr(TypeTraitExpr *E) { 01388 VisitExpr(E); 01389 E->TypeTraitExprBits.NumArgs = Record[Idx++]; 01390 E->TypeTraitExprBits.Kind = Record[Idx++]; 01391 E->TypeTraitExprBits.Value = Record[Idx++]; 01392 01393 TypeSourceInfo **Args = E->getTypeSourceInfos(); 01394 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 01395 Args[I] = GetTypeSourceInfo(Record, Idx); 01396 } 01397 01398 void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 01399 VisitExpr(E); 01400 E->ATT = (ArrayTypeTrait)Record[Idx++]; 01401 E->Value = (unsigned int)Record[Idx++]; 01402 SourceRange Range = ReadSourceRange(Record, Idx); 01403 E->Loc = Range.getBegin(); 01404 E->RParen = Range.getEnd(); 01405 E->QueriedType = GetTypeSourceInfo(Record, Idx); 01406 } 01407 01408 void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 01409 VisitExpr(E); 01410 E->ET = (ExpressionTrait)Record[Idx++]; 01411 E->Value = (bool)Record[Idx++]; 01412 SourceRange Range = ReadSourceRange(Record, Idx); 01413 E->QueriedExpression = Reader.ReadSubExpr(); 01414 E->Loc = Range.getBegin(); 01415 E->RParen = Range.getEnd(); 01416 } 01417 01418 void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 01419 VisitExpr(E); 01420 E->Value = (bool)Record[Idx++]; 01421 E->Range = ReadSourceRange(Record, Idx); 01422 E->Operand = Reader.ReadSubExpr(); 01423 } 01424 01425 void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) { 01426 VisitExpr(E); 01427 E->EllipsisLoc = ReadSourceLocation(Record, Idx); 01428 E->NumExpansions = Record[Idx++]; 01429 E->Pattern = Reader.ReadSubExpr(); 01430 } 01431 01432 void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) { 01433 VisitExpr(E); 01434 E->OperatorLoc = ReadSourceLocation(Record, Idx); 01435 E->PackLoc = ReadSourceLocation(Record, Idx); 01436 E->RParenLoc = ReadSourceLocation(Record, Idx); 01437 E->Length = Record[Idx++]; 01438 E->Pack = ReadDeclAs<NamedDecl>(Record, Idx); 01439 } 01440 01441 void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( 01442 SubstNonTypeTemplateParmExpr *E) { 01443 VisitExpr(E); 01444 E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx); 01445 E->NameLoc = ReadSourceLocation(Record, Idx); 01446 E->Replacement = Reader.ReadSubExpr(); 01447 } 01448 01449 void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr( 01450 SubstNonTypeTemplateParmPackExpr *E) { 01451 VisitExpr(E); 01452 E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx); 01453 TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx); 01454 if (ArgPack.getKind() != TemplateArgument::Pack) 01455 return; 01456 01457 E->Arguments = ArgPack.pack_begin(); 01458 E->NumArguments = ArgPack.pack_size(); 01459 E->NameLoc = ReadSourceLocation(Record, Idx); 01460 } 01461 01462 void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) { 01463 VisitExpr(E); 01464 E->Temporary = Reader.ReadSubExpr(); 01465 } 01466 01467 void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) { 01468 VisitExpr(E); 01469 E->SourceExpr = Reader.ReadSubExpr(); 01470 E->Loc = ReadSourceLocation(Record, Idx); 01471 } 01472 01473 //===----------------------------------------------------------------------===// 01474 // Microsoft Expressions and Statements 01475 //===----------------------------------------------------------------------===// 01476 void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) { 01477 VisitExpr(E); 01478 E->setSourceRange(ReadSourceRange(Record, Idx)); 01479 if (E->isTypeOperand()) { // __uuidof(ComType) 01480 E->setTypeOperandSourceInfo( 01481 GetTypeSourceInfo(Record, Idx)); 01482 return; 01483 } 01484 01485 // __uuidof(expr) 01486 E->setExprOperand(Reader.ReadSubExpr()); 01487 } 01488 01489 void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) { 01490 VisitStmt(S); 01491 S->Loc = ReadSourceLocation(Record, Idx); 01492 S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt(); 01493 S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt(); 01494 } 01495 01496 void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) { 01497 VisitStmt(S); 01498 S->Loc = ReadSourceLocation(Record, Idx); 01499 S->Block = Reader.ReadSubStmt(); 01500 } 01501 01502 void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) { 01503 VisitStmt(S); 01504 S->IsCXXTry = Record[Idx++]; 01505 S->TryLoc = ReadSourceLocation(Record, Idx); 01506 S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt(); 01507 S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt(); 01508 } 01509 01510 //===----------------------------------------------------------------------===// 01511 // CUDA Expressions and Statements 01512 //===----------------------------------------------------------------------===// 01513 01514 void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 01515 VisitCallExpr(E); 01516 E->setConfig(cast<CallExpr>(Reader.ReadSubExpr())); 01517 } 01518 01519 //===----------------------------------------------------------------------===// 01520 // OpenCL Expressions and Statements. 01521 //===----------------------------------------------------------------------===// 01522 void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) { 01523 VisitExpr(E); 01524 E->BuiltinLoc = ReadSourceLocation(Record, Idx); 01525 E->RParenLoc = ReadSourceLocation(Record, Idx); 01526 E->SrcExpr = Reader.ReadSubExpr(); 01527 } 01528 01529 //===----------------------------------------------------------------------===// 01530 // ASTReader Implementation 01531 //===----------------------------------------------------------------------===// 01532 01533 Stmt *ASTReader::ReadStmt(ModuleFile &F) { 01534 switch (ReadingKind) { 01535 case Read_Decl: 01536 case Read_Type: 01537 return ReadStmtFromStream(F); 01538 case Read_Stmt: 01539 return ReadSubStmt(); 01540 } 01541 01542 llvm_unreachable("ReadingKind not set ?"); 01543 } 01544 01545 Expr *ASTReader::ReadExpr(ModuleFile &F) { 01546 return cast_or_null<Expr>(ReadStmt(F)); 01547 } 01548 01549 Expr *ASTReader::ReadSubExpr() { 01550 return cast_or_null<Expr>(ReadSubStmt()); 01551 } 01552 01553 // Within the bitstream, expressions are stored in Reverse Polish 01554 // Notation, with each of the subexpressions preceding the 01555 // expression they are stored in. Subexpressions are stored from last to first. 01556 // To evaluate expressions, we continue reading expressions and placing them on 01557 // the stack, with expressions having operands removing those operands from the 01558 // stack. Evaluation terminates when we see a STMT_STOP record, and 01559 // the single remaining expression on the stack is our result. 01560 Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) { 01561 01562 ReadingKindTracker ReadingKind(Read_Stmt, *this); 01563 llvm::BitstreamCursor &Cursor = F.DeclsCursor; 01564 01565 // Map of offset to previously deserialized stmt. The offset points 01566 /// just after the stmt record. 01567 llvm::DenseMap<uint64_t, Stmt *> StmtEntries; 01568 01569 #ifndef NDEBUG 01570 unsigned PrevNumStmts = StmtStack.size(); 01571 #endif 01572 01573 RecordData Record; 01574 unsigned Idx; 01575 ASTStmtReader Reader(*this, F, Cursor, Record, Idx); 01576 Stmt::EmptyShell Empty; 01577 01578 while (true) { 01579 unsigned Code = Cursor.ReadCode(); 01580 if (Code == llvm::bitc::END_BLOCK) { 01581 if (Cursor.ReadBlockEnd()) { 01582 Error("error at end of block in AST file"); 01583 return 0; 01584 } 01585 break; 01586 } 01587 01588 if (Code == llvm::bitc::ENTER_SUBBLOCK) { 01589 // No known subblocks, always skip them. 01590 Cursor.ReadSubBlockID(); 01591 if (Cursor.SkipBlock()) { 01592 Error("malformed block record in AST file"); 01593 return 0; 01594 } 01595 continue; 01596 } 01597 01598 if (Code == llvm::bitc::DEFINE_ABBREV) { 01599 Cursor.ReadAbbrevRecord(); 01600 continue; 01601 } 01602 01603 Stmt *S = 0; 01604 Idx = 0; 01605 Record.clear(); 01606 bool Finished = false; 01607 bool IsStmtReference = false; 01608 switch ((StmtCode)Cursor.ReadRecord(Code, Record)) { 01609 case STMT_STOP: 01610 Finished = true; 01611 break; 01612 01613 case STMT_REF_PTR: 01614 IsStmtReference = true; 01615 assert(StmtEntries.find(Record[0]) != StmtEntries.end() && 01616 "No stmt was recorded for this offset reference!"); 01617 S = StmtEntries[Record[Idx++]]; 01618 break; 01619 01620 case STMT_NULL_PTR: 01621 S = 0; 01622 break; 01623 01624 case STMT_NULL: 01625 S = new (Context) NullStmt(Empty); 01626 break; 01627 01628 case STMT_COMPOUND: 01629 S = new (Context) CompoundStmt(Empty); 01630 break; 01631 01632 case STMT_CASE: 01633 S = new (Context) CaseStmt(Empty); 01634 break; 01635 01636 case STMT_DEFAULT: 01637 S = new (Context) DefaultStmt(Empty); 01638 break; 01639 01640 case STMT_LABEL: 01641 S = new (Context) LabelStmt(Empty); 01642 break; 01643 01644 case STMT_ATTRIBUTED: 01645 S = new (Context) AttributedStmt(Empty); 01646 break; 01647 01648 case STMT_IF: 01649 S = new (Context) IfStmt(Empty); 01650 break; 01651 01652 case STMT_SWITCH: 01653 S = new (Context) SwitchStmt(Empty); 01654 break; 01655 01656 case STMT_WHILE: 01657 S = new (Context) WhileStmt(Empty); 01658 break; 01659 01660 case STMT_DO: 01661 S = new (Context) DoStmt(Empty); 01662 break; 01663 01664 case STMT_FOR: 01665 S = new (Context) ForStmt(Empty); 01666 break; 01667 01668 case STMT_GOTO: 01669 S = new (Context) GotoStmt(Empty); 01670 break; 01671 01672 case STMT_INDIRECT_GOTO: 01673 S = new (Context) IndirectGotoStmt(Empty); 01674 break; 01675 01676 case STMT_CONTINUE: 01677 S = new (Context) ContinueStmt(Empty); 01678 break; 01679 01680 case STMT_BREAK: 01681 S = new (Context) BreakStmt(Empty); 01682 break; 01683 01684 case STMT_RETURN: 01685 S = new (Context) ReturnStmt(Empty); 01686 break; 01687 01688 case STMT_DECL: 01689 S = new (Context) DeclStmt(Empty); 01690 break; 01691 01692 case STMT_ASM: 01693 S = new (Context) AsmStmt(Empty); 01694 break; 01695 01696 case EXPR_PREDEFINED: 01697 S = new (Context) PredefinedExpr(Empty); 01698 break; 01699 01700 case EXPR_DECL_REF: 01701 S = DeclRefExpr::CreateEmpty( 01702 Context, 01703 /*HasQualifier=*/Record[ASTStmtReader::NumExprFields], 01704 /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1], 01705 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 2], 01706 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ? 01707 Record[ASTStmtReader::NumExprFields + 5] : 0); 01708 break; 01709 01710 case EXPR_INTEGER_LITERAL: 01711 S = IntegerLiteral::Create(Context, Empty); 01712 break; 01713 01714 case EXPR_FLOATING_LITERAL: 01715 S = FloatingLiteral::Create(Context, Empty); 01716 break; 01717 01718 case EXPR_IMAGINARY_LITERAL: 01719 S = new (Context) ImaginaryLiteral(Empty); 01720 break; 01721 01722 case EXPR_STRING_LITERAL: 01723 S = StringLiteral::CreateEmpty(Context, 01724 Record[ASTStmtReader::NumExprFields + 1]); 01725 break; 01726 01727 case EXPR_CHARACTER_LITERAL: 01728 S = new (Context) CharacterLiteral(Empty); 01729 break; 01730 01731 case EXPR_PAREN: 01732 S = new (Context) ParenExpr(Empty); 01733 break; 01734 01735 case EXPR_PAREN_LIST: 01736 S = new (Context) ParenListExpr(Empty); 01737 break; 01738 01739 case EXPR_UNARY_OPERATOR: 01740 S = new (Context) UnaryOperator(Empty); 01741 break; 01742 01743 case EXPR_OFFSETOF: 01744 S = OffsetOfExpr::CreateEmpty(Context, 01745 Record[ASTStmtReader::NumExprFields], 01746 Record[ASTStmtReader::NumExprFields + 1]); 01747 break; 01748 01749 case EXPR_SIZEOF_ALIGN_OF: 01750 S = new (Context) UnaryExprOrTypeTraitExpr(Empty); 01751 break; 01752 01753 case EXPR_ARRAY_SUBSCRIPT: 01754 S = new (Context) ArraySubscriptExpr(Empty); 01755 break; 01756 01757 case EXPR_CALL: 01758 S = new (Context) CallExpr(Context, Stmt::CallExprClass, Empty); 01759 break; 01760 01761 case EXPR_MEMBER: { 01762 // We load everything here and fully initialize it at creation. 01763 // That way we can use MemberExpr::Create and don't have to duplicate its 01764 // logic with a MemberExpr::CreateEmpty. 01765 01766 assert(Idx == 0); 01767 NestedNameSpecifierLoc QualifierLoc; 01768 if (Record[Idx++]) { // HasQualifier. 01769 QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 01770 } 01771 01772 SourceLocation TemplateKWLoc; 01773 TemplateArgumentListInfo ArgInfo; 01774 bool HasTemplateKWAndArgsInfo = Record[Idx++]; 01775 if (HasTemplateKWAndArgsInfo) { 01776 TemplateKWLoc = ReadSourceLocation(F, Record, Idx); 01777 unsigned NumTemplateArgs = Record[Idx++]; 01778 ArgInfo.setLAngleLoc(ReadSourceLocation(F, Record, Idx)); 01779 ArgInfo.setRAngleLoc(ReadSourceLocation(F, Record, Idx)); 01780 for (unsigned i = 0; i != NumTemplateArgs; ++i) 01781 ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx)); 01782 } 01783 01784 bool HadMultipleCandidates = Record[Idx++]; 01785 01786 NamedDecl *FoundD = ReadDeclAs<NamedDecl>(F, Record, Idx); 01787 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 01788 DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS); 01789 01790 QualType T = readType(F, Record, Idx); 01791 ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]); 01792 ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]); 01793 Expr *Base = ReadSubExpr(); 01794 ValueDecl *MemberD = ReadDeclAs<ValueDecl>(F, Record, Idx); 01795 SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx); 01796 DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc); 01797 bool IsArrow = Record[Idx++]; 01798 01799 S = MemberExpr::Create(Context, Base, IsArrow, QualifierLoc, 01800 TemplateKWLoc, MemberD, FoundDecl, MemberNameInfo, 01801 HasTemplateKWAndArgsInfo ? &ArgInfo : 0, 01802 T, VK, OK); 01803 ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc, 01804 MemberD->getDeclName(), Record, Idx); 01805 if (HadMultipleCandidates) 01806 cast<MemberExpr>(S)->setHadMultipleCandidates(true); 01807 break; 01808 } 01809 01810 case EXPR_BINARY_OPERATOR: 01811 S = new (Context) BinaryOperator(Empty); 01812 break; 01813 01814 case EXPR_COMPOUND_ASSIGN_OPERATOR: 01815 S = new (Context) CompoundAssignOperator(Empty); 01816 break; 01817 01818 case EXPR_CONDITIONAL_OPERATOR: 01819 S = new (Context) ConditionalOperator(Empty); 01820 break; 01821 01822 case EXPR_BINARY_CONDITIONAL_OPERATOR: 01823 S = new (Context) BinaryConditionalOperator(Empty); 01824 break; 01825 01826 case EXPR_IMPLICIT_CAST: 01827 S = ImplicitCastExpr::CreateEmpty(Context, 01828 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 01829 break; 01830 01831 case EXPR_CSTYLE_CAST: 01832 S = CStyleCastExpr::CreateEmpty(Context, 01833 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 01834 break; 01835 01836 case EXPR_COMPOUND_LITERAL: 01837 S = new (Context) CompoundLiteralExpr(Empty); 01838 break; 01839 01840 case EXPR_EXT_VECTOR_ELEMENT: 01841 S = new (Context) ExtVectorElementExpr(Empty); 01842 break; 01843 01844 case EXPR_INIT_LIST: 01845 S = new (Context) InitListExpr(getContext(), Empty); 01846 break; 01847 01848 case EXPR_DESIGNATED_INIT: 01849 S = DesignatedInitExpr::CreateEmpty(Context, 01850 Record[ASTStmtReader::NumExprFields] - 1); 01851 01852 break; 01853 01854 case EXPR_IMPLICIT_VALUE_INIT: 01855 S = new (Context) ImplicitValueInitExpr(Empty); 01856 break; 01857 01858 case EXPR_VA_ARG: 01859 S = new (Context) VAArgExpr(Empty); 01860 break; 01861 01862 case EXPR_ADDR_LABEL: 01863 S = new (Context) AddrLabelExpr(Empty); 01864 break; 01865 01866 case EXPR_STMT: 01867 S = new (Context) StmtExpr(Empty); 01868 break; 01869 01870 case EXPR_CHOOSE: 01871 S = new (Context) ChooseExpr(Empty); 01872 break; 01873 01874 case EXPR_GNU_NULL: 01875 S = new (Context) GNUNullExpr(Empty); 01876 break; 01877 01878 case EXPR_SHUFFLE_VECTOR: 01879 S = new (Context) ShuffleVectorExpr(Empty); 01880 break; 01881 01882 case EXPR_BLOCK: 01883 S = new (Context) BlockExpr(Empty); 01884 break; 01885 01886 case EXPR_GENERIC_SELECTION: 01887 S = new (Context) GenericSelectionExpr(Empty); 01888 break; 01889 01890 case EXPR_OBJC_STRING_LITERAL: 01891 S = new (Context) ObjCStringLiteral(Empty); 01892 break; 01893 case EXPR_OBJC_BOXED_EXPRESSION: 01894 S = new (Context) ObjCBoxedExpr(Empty); 01895 break; 01896 case EXPR_OBJC_ARRAY_LITERAL: 01897 S = ObjCArrayLiteral::CreateEmpty(Context, 01898 Record[ASTStmtReader::NumExprFields]); 01899 break; 01900 case EXPR_OBJC_DICTIONARY_LITERAL: 01901 S = ObjCDictionaryLiteral::CreateEmpty(Context, 01902 Record[ASTStmtReader::NumExprFields], 01903 Record[ASTStmtReader::NumExprFields + 1]); 01904 break; 01905 case EXPR_OBJC_ENCODE: 01906 S = new (Context) ObjCEncodeExpr(Empty); 01907 break; 01908 case EXPR_OBJC_SELECTOR_EXPR: 01909 S = new (Context) ObjCSelectorExpr(Empty); 01910 break; 01911 case EXPR_OBJC_PROTOCOL_EXPR: 01912 S = new (Context) ObjCProtocolExpr(Empty); 01913 break; 01914 case EXPR_OBJC_IVAR_REF_EXPR: 01915 S = new (Context) ObjCIvarRefExpr(Empty); 01916 break; 01917 case EXPR_OBJC_PROPERTY_REF_EXPR: 01918 S = new (Context) ObjCPropertyRefExpr(Empty); 01919 break; 01920 case EXPR_OBJC_SUBSCRIPT_REF_EXPR: 01921 S = new (Context) ObjCSubscriptRefExpr(Empty); 01922 break; 01923 case EXPR_OBJC_KVC_REF_EXPR: 01924 llvm_unreachable("mismatching AST file"); 01925 case EXPR_OBJC_MESSAGE_EXPR: 01926 S = ObjCMessageExpr::CreateEmpty(Context, 01927 Record[ASTStmtReader::NumExprFields], 01928 Record[ASTStmtReader::NumExprFields + 1]); 01929 break; 01930 case EXPR_OBJC_ISA: 01931 S = new (Context) ObjCIsaExpr(Empty); 01932 break; 01933 case EXPR_OBJC_INDIRECT_COPY_RESTORE: 01934 S = new (Context) ObjCIndirectCopyRestoreExpr(Empty); 01935 break; 01936 case EXPR_OBJC_BRIDGED_CAST: 01937 S = new (Context) ObjCBridgedCastExpr(Empty); 01938 break; 01939 case STMT_OBJC_FOR_COLLECTION: 01940 S = new (Context) ObjCForCollectionStmt(Empty); 01941 break; 01942 case STMT_OBJC_CATCH: 01943 S = new (Context) ObjCAtCatchStmt(Empty); 01944 break; 01945 case STMT_OBJC_FINALLY: 01946 S = new (Context) ObjCAtFinallyStmt(Empty); 01947 break; 01948 case STMT_OBJC_AT_TRY: 01949 S = ObjCAtTryStmt::CreateEmpty(Context, 01950 Record[ASTStmtReader::NumStmtFields], 01951 Record[ASTStmtReader::NumStmtFields + 1]); 01952 break; 01953 case STMT_OBJC_AT_SYNCHRONIZED: 01954 S = new (Context) ObjCAtSynchronizedStmt(Empty); 01955 break; 01956 case STMT_OBJC_AT_THROW: 01957 S = new (Context) ObjCAtThrowStmt(Empty); 01958 break; 01959 case STMT_OBJC_AUTORELEASE_POOL: 01960 S = new (Context) ObjCAutoreleasePoolStmt(Empty); 01961 break; 01962 case EXPR_OBJC_BOOL_LITERAL: 01963 S = new (Context) ObjCBoolLiteralExpr(Empty); 01964 break; 01965 case STMT_SEH_EXCEPT: 01966 S = new (Context) SEHExceptStmt(Empty); 01967 break; 01968 case STMT_SEH_FINALLY: 01969 S = new (Context) SEHFinallyStmt(Empty); 01970 break; 01971 case STMT_SEH_TRY: 01972 S = new (Context) SEHTryStmt(Empty); 01973 break; 01974 case STMT_CXX_CATCH: 01975 S = new (Context) CXXCatchStmt(Empty); 01976 break; 01977 01978 case STMT_CXX_TRY: 01979 S = CXXTryStmt::Create(Context, Empty, 01980 /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]); 01981 break; 01982 01983 case STMT_CXX_FOR_RANGE: 01984 S = new (Context) CXXForRangeStmt(Empty); 01985 break; 01986 01987 case STMT_MS_DEPENDENT_EXISTS: 01988 S = new (Context) MSDependentExistsStmt(SourceLocation(), true, 01989 NestedNameSpecifierLoc(), 01990 DeclarationNameInfo(), 01991 0); 01992 break; 01993 01994 case EXPR_CXX_OPERATOR_CALL: 01995 S = new (Context) CXXOperatorCallExpr(Context, Empty); 01996 break; 01997 01998 case EXPR_CXX_MEMBER_CALL: 01999 S = new (Context) CXXMemberCallExpr(Context, Empty); 02000 break; 02001 02002 case EXPR_CXX_CONSTRUCT: 02003 S = new (Context) CXXConstructExpr(Empty); 02004 break; 02005 02006 case EXPR_CXX_TEMPORARY_OBJECT: 02007 S = new (Context) CXXTemporaryObjectExpr(Empty); 02008 break; 02009 02010 case EXPR_CXX_STATIC_CAST: 02011 S = CXXStaticCastExpr::CreateEmpty(Context, 02012 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 02013 break; 02014 02015 case EXPR_CXX_DYNAMIC_CAST: 02016 S = CXXDynamicCastExpr::CreateEmpty(Context, 02017 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 02018 break; 02019 02020 case EXPR_CXX_REINTERPRET_CAST: 02021 S = CXXReinterpretCastExpr::CreateEmpty(Context, 02022 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 02023 break; 02024 02025 case EXPR_CXX_CONST_CAST: 02026 S = CXXConstCastExpr::CreateEmpty(Context); 02027 break; 02028 02029 case EXPR_CXX_FUNCTIONAL_CAST: 02030 S = CXXFunctionalCastExpr::CreateEmpty(Context, 02031 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 02032 break; 02033 02034 case EXPR_USER_DEFINED_LITERAL: 02035 S = new (Context) UserDefinedLiteral(Context, Empty); 02036 break; 02037 02038 case EXPR_CXX_BOOL_LITERAL: 02039 S = new (Context) CXXBoolLiteralExpr(Empty); 02040 break; 02041 02042 case EXPR_CXX_NULL_PTR_LITERAL: 02043 S = new (Context) CXXNullPtrLiteralExpr(Empty); 02044 break; 02045 case EXPR_CXX_TYPEID_EXPR: 02046 S = new (Context) CXXTypeidExpr(Empty, true); 02047 break; 02048 case EXPR_CXX_TYPEID_TYPE: 02049 S = new (Context) CXXTypeidExpr(Empty, false); 02050 break; 02051 case EXPR_CXX_UUIDOF_EXPR: 02052 S = new (Context) CXXUuidofExpr(Empty, true); 02053 break; 02054 case EXPR_CXX_UUIDOF_TYPE: 02055 S = new (Context) CXXUuidofExpr(Empty, false); 02056 break; 02057 case EXPR_CXX_THIS: 02058 S = new (Context) CXXThisExpr(Empty); 02059 break; 02060 case EXPR_CXX_THROW: 02061 S = new (Context) CXXThrowExpr(Empty); 02062 break; 02063 case EXPR_CXX_DEFAULT_ARG: { 02064 bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields]; 02065 if (HasOtherExprStored) { 02066 Expr *SubExpr = ReadSubExpr(); 02067 S = CXXDefaultArgExpr::Create(Context, SourceLocation(), 0, SubExpr); 02068 } else 02069 S = new (Context) CXXDefaultArgExpr(Empty); 02070 break; 02071 } 02072 case EXPR_CXX_BIND_TEMPORARY: 02073 S = new (Context) CXXBindTemporaryExpr(Empty); 02074 break; 02075 02076 case EXPR_CXX_SCALAR_VALUE_INIT: 02077 S = new (Context) CXXScalarValueInitExpr(Empty); 02078 break; 02079 case EXPR_CXX_NEW: 02080 S = new (Context) CXXNewExpr(Empty); 02081 break; 02082 case EXPR_CXX_DELETE: 02083 S = new (Context) CXXDeleteExpr(Empty); 02084 break; 02085 case EXPR_CXX_PSEUDO_DESTRUCTOR: 02086 S = new (Context) CXXPseudoDestructorExpr(Empty); 02087 break; 02088 02089 case EXPR_EXPR_WITH_CLEANUPS: 02090 S = ExprWithCleanups::Create(Context, Empty, 02091 Record[ASTStmtReader::NumExprFields]); 02092 break; 02093 02094 case EXPR_CXX_DEPENDENT_SCOPE_MEMBER: 02095 S = CXXDependentScopeMemberExpr::CreateEmpty(Context, 02096 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 02097 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 02098 ? Record[ASTStmtReader::NumExprFields + 1] 02099 : 0); 02100 break; 02101 02102 case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF: 02103 S = DependentScopeDeclRefExpr::CreateEmpty(Context, 02104 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 02105 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 02106 ? Record[ASTStmtReader::NumExprFields + 1] 02107 : 0); 02108 break; 02109 02110 case EXPR_CXX_UNRESOLVED_CONSTRUCT: 02111 S = CXXUnresolvedConstructExpr::CreateEmpty(Context, 02112 /*NumArgs=*/Record[ASTStmtReader::NumExprFields]); 02113 break; 02114 02115 case EXPR_CXX_UNRESOLVED_MEMBER: 02116 S = UnresolvedMemberExpr::CreateEmpty(Context, 02117 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 02118 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 02119 ? Record[ASTStmtReader::NumExprFields + 1] 02120 : 0); 02121 break; 02122 02123 case EXPR_CXX_UNRESOLVED_LOOKUP: 02124 S = UnresolvedLookupExpr::CreateEmpty(Context, 02125 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 02126 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 02127 ? Record[ASTStmtReader::NumExprFields + 1] 02128 : 0); 02129 break; 02130 02131 case EXPR_CXX_UNARY_TYPE_TRAIT: 02132 S = new (Context) UnaryTypeTraitExpr(Empty); 02133 break; 02134 02135 case EXPR_BINARY_TYPE_TRAIT: 02136 S = new (Context) BinaryTypeTraitExpr(Empty); 02137 break; 02138 02139 case EXPR_TYPE_TRAIT: 02140 S = TypeTraitExpr::CreateDeserialized(Context, 02141 Record[ASTStmtReader::NumExprFields]); 02142 break; 02143 02144 case EXPR_ARRAY_TYPE_TRAIT: 02145 S = new (Context) ArrayTypeTraitExpr(Empty); 02146 break; 02147 02148 case EXPR_CXX_EXPRESSION_TRAIT: 02149 S = new (Context) ExpressionTraitExpr(Empty); 02150 break; 02151 02152 case EXPR_CXX_NOEXCEPT: 02153 S = new (Context) CXXNoexceptExpr(Empty); 02154 break; 02155 02156 case EXPR_PACK_EXPANSION: 02157 S = new (Context) PackExpansionExpr(Empty); 02158 break; 02159 02160 case EXPR_SIZEOF_PACK: 02161 S = new (Context) SizeOfPackExpr(Empty); 02162 break; 02163 02164 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM: 02165 S = new (Context) SubstNonTypeTemplateParmExpr(Empty); 02166 break; 02167 02168 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK: 02169 S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty); 02170 break; 02171 02172 case EXPR_MATERIALIZE_TEMPORARY: 02173 S = new (Context) MaterializeTemporaryExpr(Empty); 02174 break; 02175 02176 case EXPR_OPAQUE_VALUE: 02177 S = new (Context) OpaqueValueExpr(Empty); 02178 break; 02179 02180 case EXPR_CUDA_KERNEL_CALL: 02181 S = new (Context) CUDAKernelCallExpr(Context, Empty); 02182 break; 02183 02184 case EXPR_ASTYPE: 02185 S = new (Context) AsTypeExpr(Empty); 02186 break; 02187 02188 case EXPR_PSEUDO_OBJECT: { 02189 unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields]; 02190 S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs); 02191 break; 02192 } 02193 02194 case EXPR_ATOMIC: 02195 S = new (Context) AtomicExpr(Empty); 02196 break; 02197 02198 case EXPR_LAMBDA: { 02199 unsigned NumCaptures = Record[ASTStmtReader::NumExprFields]; 02200 unsigned NumArrayIndexVars = Record[ASTStmtReader::NumExprFields + 1]; 02201 S = LambdaExpr::CreateDeserialized(Context, NumCaptures, 02202 NumArrayIndexVars); 02203 break; 02204 } 02205 } 02206 02207 // We hit a STMT_STOP, so we're done with this expression. 02208 if (Finished) 02209 break; 02210 02211 ++NumStatementsRead; 02212 02213 if (S && !IsStmtReference) { 02214 Reader.Visit(S); 02215 StmtEntries[Cursor.GetCurrentBitNo()] = S; 02216 } 02217 02218 02219 assert(Idx == Record.size() && "Invalid deserialization of statement"); 02220 StmtStack.push_back(S); 02221 } 02222 02223 #ifndef NDEBUG 02224 assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!"); 02225 assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!"); 02226 #endif 02227 02228 return StmtStack.pop_back_val(); 02229 }