ASTReaderStmt.cpp revision f3db29fff6a583ecda823cf909ab7737d8d30129
1//===--- ASTReaderStmt.cpp - Stmt/Expr Deserialization ----------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Statement/expression deserialization. This implements the 11// ASTReader::ReadStmt method. 12// 13//===----------------------------------------------------------------------===// 14 15#include "clang/Serialization/ASTReader.h" 16#include "clang/AST/DeclCXX.h" 17#include "clang/AST/DeclTemplate.h" 18#include "clang/AST/StmtVisitor.h" 19using namespace clang; 20using namespace clang::serialization; 21 22namespace clang { 23 24 class ASTStmtReader : public StmtVisitor<ASTStmtReader> { 25 ASTReader &Reader; 26 ASTReader::PerFileData &F; 27 llvm::BitstreamCursor &DeclsCursor; 28 const ASTReader::RecordData &Record; 29 unsigned &Idx; 30 31 SourceLocation ReadSourceLocation(const ASTReader::RecordData &R, 32 unsigned &I) { 33 return Reader.ReadSourceLocation(F, R, I); 34 } 35 SourceRange ReadSourceRange(const ASTReader::RecordData &R, unsigned &I) { 36 return Reader.ReadSourceRange(F, R, I); 37 } 38 TypeSourceInfo *GetTypeSourceInfo(const ASTReader::RecordData &R, 39 unsigned &I) { 40 return Reader.GetTypeSourceInfo(F, R, I); 41 } 42 void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name, 43 const ASTReader::RecordData &R, unsigned &I) { 44 Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I); 45 } 46 void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo, 47 const ASTReader::RecordData &R, unsigned &I) { 48 Reader.ReadDeclarationNameInfo(F, NameInfo, R, I); 49 } 50 51 public: 52 ASTStmtReader(ASTReader &Reader, ASTReader::PerFileData &F, 53 llvm::BitstreamCursor &Cursor, 54 const ASTReader::RecordData &Record, unsigned &Idx) 55 : Reader(Reader), F(F), DeclsCursor(Cursor), Record(Record), Idx(Idx) { } 56 57 /// \brief The number of record fields required for the Stmt class 58 /// itself. 59 static const unsigned NumStmtFields = 0; 60 61 /// \brief The number of record fields required for the Expr class 62 /// itself. 63 static const unsigned NumExprFields = NumStmtFields + 6; 64 65 /// \brief Read and initialize a ExplicitTemplateArgumentList structure. 66 void ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList, 67 unsigned NumTemplateArgs); 68 69 void VisitStmt(Stmt *S); 70 void VisitNullStmt(NullStmt *S); 71 void VisitCompoundStmt(CompoundStmt *S); 72 void VisitSwitchCase(SwitchCase *S); 73 void VisitCaseStmt(CaseStmt *S); 74 void VisitDefaultStmt(DefaultStmt *S); 75 void VisitLabelStmt(LabelStmt *S); 76 void VisitIfStmt(IfStmt *S); 77 void VisitSwitchStmt(SwitchStmt *S); 78 void VisitWhileStmt(WhileStmt *S); 79 void VisitDoStmt(DoStmt *S); 80 void VisitForStmt(ForStmt *S); 81 void VisitGotoStmt(GotoStmt *S); 82 void VisitIndirectGotoStmt(IndirectGotoStmt *S); 83 void VisitContinueStmt(ContinueStmt *S); 84 void VisitBreakStmt(BreakStmt *S); 85 void VisitReturnStmt(ReturnStmt *S); 86 void VisitDeclStmt(DeclStmt *S); 87 void VisitAsmStmt(AsmStmt *S); 88 void VisitExpr(Expr *E); 89 void VisitPredefinedExpr(PredefinedExpr *E); 90 void VisitDeclRefExpr(DeclRefExpr *E); 91 void VisitIntegerLiteral(IntegerLiteral *E); 92 void VisitFloatingLiteral(FloatingLiteral *E); 93 void VisitImaginaryLiteral(ImaginaryLiteral *E); 94 void VisitStringLiteral(StringLiteral *E); 95 void VisitCharacterLiteral(CharacterLiteral *E); 96 void VisitParenExpr(ParenExpr *E); 97 void VisitParenListExpr(ParenListExpr *E); 98 void VisitUnaryOperator(UnaryOperator *E); 99 void VisitOffsetOfExpr(OffsetOfExpr *E); 100 void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E); 101 void VisitArraySubscriptExpr(ArraySubscriptExpr *E); 102 void VisitCallExpr(CallExpr *E); 103 void VisitMemberExpr(MemberExpr *E); 104 void VisitCastExpr(CastExpr *E); 105 void VisitBinaryOperator(BinaryOperator *E); 106 void VisitCompoundAssignOperator(CompoundAssignOperator *E); 107 void VisitConditionalOperator(ConditionalOperator *E); 108 void VisitBinaryConditionalOperator(BinaryConditionalOperator *E); 109 void VisitImplicitCastExpr(ImplicitCastExpr *E); 110 void VisitExplicitCastExpr(ExplicitCastExpr *E); 111 void VisitCStyleCastExpr(CStyleCastExpr *E); 112 void VisitCompoundLiteralExpr(CompoundLiteralExpr *E); 113 void VisitExtVectorElementExpr(ExtVectorElementExpr *E); 114 void VisitInitListExpr(InitListExpr *E); 115 void VisitDesignatedInitExpr(DesignatedInitExpr *E); 116 void VisitImplicitValueInitExpr(ImplicitValueInitExpr *E); 117 void VisitVAArgExpr(VAArgExpr *E); 118 void VisitAddrLabelExpr(AddrLabelExpr *E); 119 void VisitStmtExpr(StmtExpr *E); 120 void VisitChooseExpr(ChooseExpr *E); 121 void VisitGNUNullExpr(GNUNullExpr *E); 122 void VisitShuffleVectorExpr(ShuffleVectorExpr *E); 123 void VisitBlockExpr(BlockExpr *E); 124 void VisitBlockDeclRefExpr(BlockDeclRefExpr *E); 125 void VisitObjCStringLiteral(ObjCStringLiteral *E); 126 void VisitObjCEncodeExpr(ObjCEncodeExpr *E); 127 void VisitObjCSelectorExpr(ObjCSelectorExpr *E); 128 void VisitObjCProtocolExpr(ObjCProtocolExpr *E); 129 void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E); 130 void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E); 131 void VisitObjCMessageExpr(ObjCMessageExpr *E); 132 void VisitObjCIsaExpr(ObjCIsaExpr *E); 133 134 void VisitObjCForCollectionStmt(ObjCForCollectionStmt *); 135 void VisitObjCAtCatchStmt(ObjCAtCatchStmt *); 136 void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *); 137 void VisitObjCAtTryStmt(ObjCAtTryStmt *); 138 void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *); 139 void VisitObjCAtThrowStmt(ObjCAtThrowStmt *); 140 141 // C++ Statements 142 void VisitCXXCatchStmt(CXXCatchStmt *S); 143 void VisitCXXTryStmt(CXXTryStmt *S); 144 145 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E); 146 void VisitCXXConstructExpr(CXXConstructExpr *E); 147 void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E); 148 void VisitCXXNamedCastExpr(CXXNamedCastExpr *E); 149 void VisitCXXStaticCastExpr(CXXStaticCastExpr *E); 150 void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E); 151 void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E); 152 void VisitCXXConstCastExpr(CXXConstCastExpr *E); 153 void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E); 154 void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E); 155 void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E); 156 void VisitCXXTypeidExpr(CXXTypeidExpr *E); 157 void VisitCXXUuidofExpr(CXXUuidofExpr *E); 158 void VisitCXXThisExpr(CXXThisExpr *E); 159 void VisitCXXThrowExpr(CXXThrowExpr *E); 160 void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E); 161 void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E); 162 163 void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E); 164 void VisitCXXNewExpr(CXXNewExpr *E); 165 void VisitCXXDeleteExpr(CXXDeleteExpr *E); 166 void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E); 167 168 void VisitExprWithCleanups(ExprWithCleanups *E); 169 170 void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E); 171 void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E); 172 void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E); 173 174 void VisitOverloadExpr(OverloadExpr *E); 175 void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E); 176 void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E); 177 178 void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E); 179 void VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E); 180 void VisitCXXNoexceptExpr(CXXNoexceptExpr *E); 181 void VisitPackExpansionExpr(PackExpansionExpr *E); 182 void VisitSizeOfPackExpr(SizeOfPackExpr *E); 183 void VisitSubstNonTypeTemplateParmPackExpr( 184 SubstNonTypeTemplateParmPackExpr *E); 185 void VisitOpaqueValueExpr(OpaqueValueExpr *E); 186 187 // CUDA Expressions 188 void VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E); 189 }; 190} 191 192void ASTStmtReader:: 193ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList, 194 unsigned NumTemplateArgs) { 195 TemplateArgumentListInfo ArgInfo; 196 ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx)); 197 ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx)); 198 for (unsigned i = 0; i != NumTemplateArgs; ++i) 199 ArgInfo.addArgument( 200 Reader.ReadTemplateArgumentLoc(F, Record, Idx)); 201 ArgList.initializeFrom(ArgInfo); 202} 203 204void ASTStmtReader::VisitStmt(Stmt *S) { 205 assert(Idx == NumStmtFields && "Incorrect statement field count"); 206} 207 208void ASTStmtReader::VisitNullStmt(NullStmt *S) { 209 VisitStmt(S); 210 S->setSemiLoc(ReadSourceLocation(Record, Idx)); 211 S->LeadingEmptyMacro = Record[Idx++]; 212} 213 214void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) { 215 VisitStmt(S); 216 llvm::SmallVector<Stmt *, 16> Stmts; 217 unsigned NumStmts = Record[Idx++]; 218 while (NumStmts--) 219 Stmts.push_back(Reader.ReadSubStmt()); 220 S->setStmts(*Reader.getContext(), Stmts.data(), Stmts.size()); 221 S->setLBracLoc(ReadSourceLocation(Record, Idx)); 222 S->setRBracLoc(ReadSourceLocation(Record, Idx)); 223} 224 225void ASTStmtReader::VisitSwitchCase(SwitchCase *S) { 226 VisitStmt(S); 227 Reader.RecordSwitchCaseID(S, Record[Idx++]); 228} 229 230void ASTStmtReader::VisitCaseStmt(CaseStmt *S) { 231 VisitSwitchCase(S); 232 S->setLHS(Reader.ReadSubExpr()); 233 S->setRHS(Reader.ReadSubExpr()); 234 S->setSubStmt(Reader.ReadSubStmt()); 235 S->setCaseLoc(ReadSourceLocation(Record, Idx)); 236 S->setEllipsisLoc(ReadSourceLocation(Record, Idx)); 237 S->setColonLoc(ReadSourceLocation(Record, Idx)); 238} 239 240void ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) { 241 VisitSwitchCase(S); 242 S->setSubStmt(Reader.ReadSubStmt()); 243 S->setDefaultLoc(ReadSourceLocation(Record, Idx)); 244 S->setColonLoc(ReadSourceLocation(Record, Idx)); 245} 246 247void ASTStmtReader::VisitLabelStmt(LabelStmt *S) { 248 VisitStmt(S); 249 LabelDecl *LD = cast<LabelDecl>(Reader.GetDecl(Record[Idx++])); 250 LD->setStmt(S); 251 S->setDecl(LD); 252 S->setSubStmt(Reader.ReadSubStmt()); 253 S->setIdentLoc(ReadSourceLocation(Record, Idx)); 254} 255 256void ASTStmtReader::VisitIfStmt(IfStmt *S) { 257 VisitStmt(S); 258 S->setConditionVariable(*Reader.getContext(), 259 cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++]))); 260 S->setCond(Reader.ReadSubExpr()); 261 S->setThen(Reader.ReadSubStmt()); 262 S->setElse(Reader.ReadSubStmt()); 263 S->setIfLoc(ReadSourceLocation(Record, Idx)); 264 S->setElseLoc(ReadSourceLocation(Record, Idx)); 265} 266 267void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) { 268 VisitStmt(S); 269 S->setConditionVariable(*Reader.getContext(), 270 cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++]))); 271 S->setCond(Reader.ReadSubExpr()); 272 S->setBody(Reader.ReadSubStmt()); 273 S->setSwitchLoc(ReadSourceLocation(Record, Idx)); 274 if (Record[Idx++]) 275 S->setAllEnumCasesCovered(); 276 277 SwitchCase *PrevSC = 0; 278 for (unsigned N = Record.size(); Idx != N; ++Idx) { 279 SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]); 280 if (PrevSC) 281 PrevSC->setNextSwitchCase(SC); 282 else 283 S->setSwitchCaseList(SC); 284 285 PrevSC = SC; 286 } 287} 288 289void ASTStmtReader::VisitWhileStmt(WhileStmt *S) { 290 VisitStmt(S); 291 S->setConditionVariable(*Reader.getContext(), 292 cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++]))); 293 S->setCond(Reader.ReadSubExpr()); 294 S->setBody(Reader.ReadSubStmt()); 295 S->setWhileLoc(ReadSourceLocation(Record, Idx)); 296} 297 298void ASTStmtReader::VisitDoStmt(DoStmt *S) { 299 VisitStmt(S); 300 S->setCond(Reader.ReadSubExpr()); 301 S->setBody(Reader.ReadSubStmt()); 302 S->setDoLoc(ReadSourceLocation(Record, Idx)); 303 S->setWhileLoc(ReadSourceLocation(Record, Idx)); 304 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 305} 306 307void ASTStmtReader::VisitForStmt(ForStmt *S) { 308 VisitStmt(S); 309 S->setInit(Reader.ReadSubStmt()); 310 S->setCond(Reader.ReadSubExpr()); 311 S->setConditionVariable(*Reader.getContext(), 312 cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++]))); 313 S->setInc(Reader.ReadSubExpr()); 314 S->setBody(Reader.ReadSubStmt()); 315 S->setForLoc(ReadSourceLocation(Record, Idx)); 316 S->setLParenLoc(ReadSourceLocation(Record, Idx)); 317 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 318} 319 320void ASTStmtReader::VisitGotoStmt(GotoStmt *S) { 321 VisitStmt(S); 322 S->setLabel(cast<LabelDecl>(Reader.GetDecl(Record[Idx++]))); 323 S->setGotoLoc(ReadSourceLocation(Record, Idx)); 324 S->setLabelLoc(ReadSourceLocation(Record, Idx)); 325} 326 327void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) { 328 VisitStmt(S); 329 S->setGotoLoc(ReadSourceLocation(Record, Idx)); 330 S->setStarLoc(ReadSourceLocation(Record, Idx)); 331 S->setTarget(Reader.ReadSubExpr()); 332} 333 334void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) { 335 VisitStmt(S); 336 S->setContinueLoc(ReadSourceLocation(Record, Idx)); 337} 338 339void ASTStmtReader::VisitBreakStmt(BreakStmt *S) { 340 VisitStmt(S); 341 S->setBreakLoc(ReadSourceLocation(Record, Idx)); 342} 343 344void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) { 345 VisitStmt(S); 346 S->setRetValue(Reader.ReadSubExpr()); 347 S->setReturnLoc(ReadSourceLocation(Record, Idx)); 348 S->setNRVOCandidate(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++]))); 349} 350 351void ASTStmtReader::VisitDeclStmt(DeclStmt *S) { 352 VisitStmt(S); 353 S->setStartLoc(ReadSourceLocation(Record, Idx)); 354 S->setEndLoc(ReadSourceLocation(Record, Idx)); 355 356 if (Idx + 1 == Record.size()) { 357 // Single declaration 358 S->setDeclGroup(DeclGroupRef(Reader.GetDecl(Record[Idx++]))); 359 } else { 360 llvm::SmallVector<Decl *, 16> Decls; 361 Decls.reserve(Record.size() - Idx); 362 for (unsigned N = Record.size(); Idx != N; ++Idx) 363 Decls.push_back(Reader.GetDecl(Record[Idx])); 364 S->setDeclGroup(DeclGroupRef(DeclGroup::Create(*Reader.getContext(), 365 Decls.data(), 366 Decls.size()))); 367 } 368} 369 370void ASTStmtReader::VisitAsmStmt(AsmStmt *S) { 371 VisitStmt(S); 372 unsigned NumOutputs = Record[Idx++]; 373 unsigned NumInputs = Record[Idx++]; 374 unsigned NumClobbers = Record[Idx++]; 375 S->setAsmLoc(ReadSourceLocation(Record, Idx)); 376 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 377 S->setVolatile(Record[Idx++]); 378 S->setSimple(Record[Idx++]); 379 S->setMSAsm(Record[Idx++]); 380 381 S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 382 383 // Outputs and inputs 384 llvm::SmallVector<IdentifierInfo *, 16> Names; 385 llvm::SmallVector<StringLiteral*, 16> Constraints; 386 llvm::SmallVector<Stmt*, 16> Exprs; 387 for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) { 388 Names.push_back(Reader.GetIdentifierInfo(Record, Idx)); 389 Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 390 Exprs.push_back(Reader.ReadSubStmt()); 391 } 392 393 // Constraints 394 llvm::SmallVector<StringLiteral*, 16> Clobbers; 395 for (unsigned I = 0; I != NumClobbers; ++I) 396 Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 397 398 S->setOutputsAndInputsAndClobbers(*Reader.getContext(), 399 Names.data(), Constraints.data(), 400 Exprs.data(), NumOutputs, NumInputs, 401 Clobbers.data(), NumClobbers); 402} 403 404void ASTStmtReader::VisitExpr(Expr *E) { 405 VisitStmt(E); 406 E->setType(Reader.GetType(Record[Idx++])); 407 E->setTypeDependent(Record[Idx++]); 408 E->setValueDependent(Record[Idx++]); 409 E->ExprBits.ContainsUnexpandedParameterPack = Record[Idx++]; 410 E->setValueKind(static_cast<ExprValueKind>(Record[Idx++])); 411 E->setObjectKind(static_cast<ExprObjectKind>(Record[Idx++])); 412 assert(Idx == NumExprFields && "Incorrect expression field count"); 413} 414 415void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) { 416 VisitExpr(E); 417 E->setLocation(ReadSourceLocation(Record, Idx)); 418 E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]); 419} 420 421void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) { 422 VisitExpr(E); 423 424 bool HasQualifier = Record[Idx++]; 425 bool HasExplicitTemplateArgs = Record[Idx++]; 426 427 E->DecoratedD.setInt((HasQualifier? DeclRefExpr::HasQualifierFlag : 0) | 428 (HasExplicitTemplateArgs 429 ? DeclRefExpr::HasExplicitTemplateArgumentListFlag : 0)); 430 431 if (HasQualifier) { 432 E->getNameQualifier()->NNS = Reader.ReadNestedNameSpecifier(Record, Idx); 433 E->getNameQualifier()->Range = ReadSourceRange(Record, Idx); 434 } 435 436 if (HasExplicitTemplateArgs) { 437 unsigned NumTemplateArgs = Record[Idx++]; 438 ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(), 439 NumTemplateArgs); 440 } 441 442 E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++]))); 443 E->setLocation(ReadSourceLocation(Record, Idx)); 444 ReadDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record, Idx); 445} 446 447void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) { 448 VisitExpr(E); 449 E->setLocation(ReadSourceLocation(Record, Idx)); 450 E->setValue(*Reader.getContext(), Reader.ReadAPInt(Record, Idx)); 451} 452 453void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) { 454 VisitExpr(E); 455 E->setValue(*Reader.getContext(), Reader.ReadAPFloat(Record, Idx)); 456 E->setExact(Record[Idx++]); 457 E->setLocation(ReadSourceLocation(Record, Idx)); 458} 459 460void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) { 461 VisitExpr(E); 462 E->setSubExpr(Reader.ReadSubExpr()); 463} 464 465void ASTStmtReader::VisitStringLiteral(StringLiteral *E) { 466 VisitExpr(E); 467 unsigned Len = Record[Idx++]; 468 assert(Record[Idx] == E->getNumConcatenated() && 469 "Wrong number of concatenated tokens!"); 470 ++Idx; 471 E->setWide(Record[Idx++]); 472 473 // Read string data 474 llvm::SmallString<16> Str(&Record[Idx], &Record[Idx] + Len); 475 E->setString(*Reader.getContext(), Str.str()); 476 Idx += Len; 477 478 // Read source locations 479 for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I) 480 E->setStrTokenLoc(I, ReadSourceLocation(Record, Idx)); 481} 482 483void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) { 484 VisitExpr(E); 485 E->setValue(Record[Idx++]); 486 E->setLocation(ReadSourceLocation(Record, Idx)); 487 E->setWide(Record[Idx++]); 488} 489 490void ASTStmtReader::VisitParenExpr(ParenExpr *E) { 491 VisitExpr(E); 492 E->setLParen(ReadSourceLocation(Record, Idx)); 493 E->setRParen(ReadSourceLocation(Record, Idx)); 494 E->setSubExpr(Reader.ReadSubExpr()); 495} 496 497void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) { 498 VisitExpr(E); 499 unsigned NumExprs = Record[Idx++]; 500 E->Exprs = new (*Reader.getContext()) Stmt*[NumExprs]; 501 for (unsigned i = 0; i != NumExprs; ++i) 502 E->Exprs[i] = Reader.ReadSubStmt(); 503 E->NumExprs = NumExprs; 504 E->LParenLoc = ReadSourceLocation(Record, Idx); 505 E->RParenLoc = ReadSourceLocation(Record, Idx); 506} 507 508void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) { 509 VisitExpr(E); 510 E->setSubExpr(Reader.ReadSubExpr()); 511 E->setOpcode((UnaryOperator::Opcode)Record[Idx++]); 512 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 513} 514 515void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) { 516 typedef OffsetOfExpr::OffsetOfNode Node; 517 VisitExpr(E); 518 assert(E->getNumComponents() == Record[Idx]); 519 ++Idx; 520 assert(E->getNumExpressions() == Record[Idx]); 521 ++Idx; 522 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 523 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 524 E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 525 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 526 Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]); 527 SourceLocation Start = ReadSourceLocation(Record, Idx); 528 SourceLocation End = ReadSourceLocation(Record, Idx); 529 switch (Kind) { 530 case Node::Array: 531 E->setComponent(I, Node(Start, Record[Idx++], End)); 532 break; 533 534 case Node::Field: 535 E->setComponent(I, 536 Node(Start, 537 dyn_cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])), 538 End)); 539 break; 540 541 case Node::Identifier: 542 E->setComponent(I, Node(Start, Reader.GetIdentifier(Record[Idx++]), End)); 543 break; 544 545 case Node::Base: { 546 CXXBaseSpecifier *Base = new (*Reader.getContext()) CXXBaseSpecifier(); 547 *Base = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 548 E->setComponent(I, Node(Base)); 549 break; 550 } 551 } 552 } 553 554 for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I) 555 E->setIndexExpr(I, Reader.ReadSubExpr()); 556} 557 558void ASTStmtReader::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 559 VisitExpr(E); 560 E->setSizeof(Record[Idx++]); 561 if (Record[Idx] == 0) { 562 E->setArgument(Reader.ReadSubExpr()); 563 ++Idx; 564 } else { 565 E->setArgument(GetTypeSourceInfo(Record, Idx)); 566 } 567 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 568 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 569} 570 571void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 572 VisitExpr(E); 573 E->setLHS(Reader.ReadSubExpr()); 574 E->setRHS(Reader.ReadSubExpr()); 575 E->setRBracketLoc(ReadSourceLocation(Record, Idx)); 576} 577 578void ASTStmtReader::VisitCallExpr(CallExpr *E) { 579 VisitExpr(E); 580 E->setNumArgs(*Reader.getContext(), Record[Idx++]); 581 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 582 E->setCallee(Reader.ReadSubExpr()); 583 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 584 E->setArg(I, Reader.ReadSubExpr()); 585} 586 587void ASTStmtReader::VisitMemberExpr(MemberExpr *E) { 588 // Don't call VisitExpr, this is fully initialized at creation. 589 assert(E->getStmtClass() == Stmt::MemberExprClass && 590 "It's a subclass, we must advance Idx!"); 591} 592 593void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) { 594 VisitExpr(E); 595 E->setBase(Reader.ReadSubExpr()); 596 E->setIsaMemberLoc(ReadSourceLocation(Record, Idx)); 597 E->setArrow(Record[Idx++]); 598} 599 600void ASTStmtReader::VisitCastExpr(CastExpr *E) { 601 VisitExpr(E); 602 unsigned NumBaseSpecs = Record[Idx++]; 603 assert(NumBaseSpecs == E->path_size()); 604 E->setSubExpr(Reader.ReadSubExpr()); 605 E->setCastKind((CastExpr::CastKind)Record[Idx++]); 606 CastExpr::path_iterator BaseI = E->path_begin(); 607 while (NumBaseSpecs--) { 608 CXXBaseSpecifier *BaseSpec = new (*Reader.getContext()) CXXBaseSpecifier; 609 *BaseSpec = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 610 *BaseI++ = BaseSpec; 611 } 612} 613 614void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) { 615 VisitExpr(E); 616 E->setLHS(Reader.ReadSubExpr()); 617 E->setRHS(Reader.ReadSubExpr()); 618 E->setOpcode((BinaryOperator::Opcode)Record[Idx++]); 619 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 620} 621 622void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 623 VisitBinaryOperator(E); 624 E->setComputationLHSType(Reader.GetType(Record[Idx++])); 625 E->setComputationResultType(Reader.GetType(Record[Idx++])); 626} 627 628void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) { 629 VisitExpr(E); 630 E->SubExprs[ConditionalOperator::COND] = Reader.ReadSubExpr(); 631 E->SubExprs[ConditionalOperator::LHS] = Reader.ReadSubExpr(); 632 E->SubExprs[ConditionalOperator::RHS] = Reader.ReadSubExpr(); 633 E->QuestionLoc = ReadSourceLocation(Record, Idx); 634 E->ColonLoc = ReadSourceLocation(Record, Idx); 635} 636 637void 638ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) { 639 VisitExpr(E); 640 E->OpaqueValue = cast<OpaqueValueExpr>(Reader.ReadSubExpr()); 641 E->SubExprs[BinaryConditionalOperator::COMMON] = Reader.ReadSubExpr(); 642 E->SubExprs[BinaryConditionalOperator::COND] = Reader.ReadSubExpr(); 643 E->SubExprs[BinaryConditionalOperator::LHS] = Reader.ReadSubExpr(); 644 E->SubExprs[BinaryConditionalOperator::RHS] = Reader.ReadSubExpr(); 645 E->QuestionLoc = ReadSourceLocation(Record, Idx); 646 E->ColonLoc = ReadSourceLocation(Record, Idx); 647 648 E->getOpaqueValue()->setSourceExpr(E->getCommon()); 649} 650 651void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) { 652 VisitCastExpr(E); 653} 654 655void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) { 656 VisitCastExpr(E); 657 E->setTypeInfoAsWritten(GetTypeSourceInfo(Record, Idx)); 658} 659 660void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) { 661 VisitExplicitCastExpr(E); 662 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 663 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 664} 665 666void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 667 VisitExpr(E); 668 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 669 E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 670 E->setInitializer(Reader.ReadSubExpr()); 671 E->setFileScope(Record[Idx++]); 672} 673 674void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) { 675 VisitExpr(E); 676 E->setBase(Reader.ReadSubExpr()); 677 E->setAccessor(Reader.GetIdentifierInfo(Record, Idx)); 678 E->setAccessorLoc(ReadSourceLocation(Record, Idx)); 679} 680 681void ASTStmtReader::VisitInitListExpr(InitListExpr *E) { 682 VisitExpr(E); 683 unsigned NumInits = Record[Idx++]; 684 E->reserveInits(*Reader.getContext(), NumInits); 685 for (unsigned I = 0; I != NumInits; ++I) 686 E->updateInit(*Reader.getContext(), I, Reader.ReadSubExpr()); 687 E->setSyntacticForm(cast_or_null<InitListExpr>(Reader.ReadSubStmt())); 688 E->setLBraceLoc(ReadSourceLocation(Record, Idx)); 689 E->setRBraceLoc(ReadSourceLocation(Record, Idx)); 690 E->setInitializedFieldInUnion( 691 cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++]))); 692 E->sawArrayRangeDesignator(Record[Idx++]); 693} 694 695void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) { 696 typedef DesignatedInitExpr::Designator Designator; 697 698 VisitExpr(E); 699 unsigned NumSubExprs = Record[Idx++]; 700 assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs"); 701 for (unsigned I = 0; I != NumSubExprs; ++I) 702 E->setSubExpr(I, Reader.ReadSubExpr()); 703 E->setEqualOrColonLoc(ReadSourceLocation(Record, Idx)); 704 E->setGNUSyntax(Record[Idx++]); 705 706 llvm::SmallVector<Designator, 4> Designators; 707 while (Idx < Record.size()) { 708 switch ((DesignatorTypes)Record[Idx++]) { 709 case DESIG_FIELD_DECL: { 710 FieldDecl *Field = cast<FieldDecl>(Reader.GetDecl(Record[Idx++])); 711 SourceLocation DotLoc 712 = ReadSourceLocation(Record, Idx); 713 SourceLocation FieldLoc 714 = ReadSourceLocation(Record, Idx); 715 Designators.push_back(Designator(Field->getIdentifier(), DotLoc, 716 FieldLoc)); 717 Designators.back().setField(Field); 718 break; 719 } 720 721 case DESIG_FIELD_NAME: { 722 const IdentifierInfo *Name = Reader.GetIdentifierInfo(Record, Idx); 723 SourceLocation DotLoc 724 = ReadSourceLocation(Record, Idx); 725 SourceLocation FieldLoc 726 = ReadSourceLocation(Record, Idx); 727 Designators.push_back(Designator(Name, DotLoc, FieldLoc)); 728 break; 729 } 730 731 case DESIG_ARRAY: { 732 unsigned Index = Record[Idx++]; 733 SourceLocation LBracketLoc 734 = ReadSourceLocation(Record, Idx); 735 SourceLocation RBracketLoc 736 = ReadSourceLocation(Record, Idx); 737 Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc)); 738 break; 739 } 740 741 case DESIG_ARRAY_RANGE: { 742 unsigned Index = Record[Idx++]; 743 SourceLocation LBracketLoc 744 = ReadSourceLocation(Record, Idx); 745 SourceLocation EllipsisLoc 746 = ReadSourceLocation(Record, Idx); 747 SourceLocation RBracketLoc 748 = ReadSourceLocation(Record, Idx); 749 Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc, 750 RBracketLoc)); 751 break; 752 } 753 } 754 } 755 E->setDesignators(*Reader.getContext(), 756 Designators.data(), Designators.size()); 757} 758 759void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { 760 VisitExpr(E); 761} 762 763void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) { 764 VisitExpr(E); 765 E->setSubExpr(Reader.ReadSubExpr()); 766 E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx)); 767 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 768 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 769} 770 771void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) { 772 VisitExpr(E); 773 E->setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 774 E->setLabelLoc(ReadSourceLocation(Record, Idx)); 775 E->setLabel(cast<LabelDecl>(Reader.GetDecl(Record[Idx++]))); 776} 777 778void ASTStmtReader::VisitStmtExpr(StmtExpr *E) { 779 VisitExpr(E); 780 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 781 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 782 E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt())); 783} 784 785void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) { 786 VisitExpr(E); 787 E->setCond(Reader.ReadSubExpr()); 788 E->setLHS(Reader.ReadSubExpr()); 789 E->setRHS(Reader.ReadSubExpr()); 790 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 791 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 792} 793 794void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) { 795 VisitExpr(E); 796 E->setTokenLocation(ReadSourceLocation(Record, Idx)); 797} 798 799void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) { 800 VisitExpr(E); 801 llvm::SmallVector<Expr *, 16> Exprs; 802 unsigned NumExprs = Record[Idx++]; 803 while (NumExprs--) 804 Exprs.push_back(Reader.ReadSubExpr()); 805 E->setExprs(*Reader.getContext(), Exprs.data(), Exprs.size()); 806 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 807 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 808} 809 810void ASTStmtReader::VisitBlockExpr(BlockExpr *E) { 811 VisitExpr(E); 812 E->setBlockDecl(cast_or_null<BlockDecl>(Reader.GetDecl(Record[Idx++]))); 813} 814 815void ASTStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) { 816 VisitExpr(E); 817 E->setDecl(cast<VarDecl>(Reader.GetDecl(Record[Idx++]))); 818 E->setLocation(ReadSourceLocation(Record, Idx)); 819 E->setByRef(Record[Idx++]); 820 E->setConstQualAdded(Record[Idx++]); 821} 822 823//===----------------------------------------------------------------------===// 824// Objective-C Expressions and Statements 825 826void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) { 827 VisitExpr(E); 828 E->setString(cast<StringLiteral>(Reader.ReadSubStmt())); 829 E->setAtLoc(ReadSourceLocation(Record, Idx)); 830} 831 832void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) { 833 VisitExpr(E); 834 E->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 835 E->setAtLoc(ReadSourceLocation(Record, Idx)); 836 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 837} 838 839void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) { 840 VisitExpr(E); 841 E->setSelector(Reader.GetSelector(Record, Idx)); 842 E->setAtLoc(ReadSourceLocation(Record, Idx)); 843 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 844} 845 846void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { 847 VisitExpr(E); 848 E->setProtocol(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++]))); 849 E->setAtLoc(ReadSourceLocation(Record, Idx)); 850 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 851} 852 853void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { 854 VisitExpr(E); 855 E->setDecl(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++]))); 856 E->setLocation(ReadSourceLocation(Record, Idx)); 857 E->setBase(Reader.ReadSubExpr()); 858 E->setIsArrow(Record[Idx++]); 859 E->setIsFreeIvar(Record[Idx++]); 860} 861 862void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 863 VisitExpr(E); 864 bool Implicit = Record[Idx++] != 0; 865 if (Implicit) { 866 ObjCMethodDecl *Getter = 867 cast<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])); 868 ObjCMethodDecl *Setter = 869 cast<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])); 870 E->setImplicitProperty(Getter, Setter); 871 } else { 872 E->setExplicitProperty( 873 cast<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++]))); 874 } 875 E->setLocation(ReadSourceLocation(Record, Idx)); 876 E->setReceiverLocation(ReadSourceLocation(Record, Idx)); 877 switch (Record[Idx++]) { 878 case 0: 879 E->setBase(Reader.ReadSubExpr()); 880 break; 881 case 1: 882 E->setSuperReceiver(Reader.GetType(Record[Idx++])); 883 break; 884 case 2: 885 E->setClassReceiver( 886 cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); 887 break; 888 } 889} 890 891void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) { 892 VisitExpr(E); 893 assert(Record[Idx] == E->getNumArgs()); 894 ++Idx; 895 ObjCMessageExpr::ReceiverKind Kind 896 = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]); 897 switch (Kind) { 898 case ObjCMessageExpr::Instance: 899 E->setInstanceReceiver(Reader.ReadSubExpr()); 900 break; 901 902 case ObjCMessageExpr::Class: 903 E->setClassReceiver(GetTypeSourceInfo(Record, Idx)); 904 break; 905 906 case ObjCMessageExpr::SuperClass: 907 case ObjCMessageExpr::SuperInstance: { 908 QualType T = Reader.GetType(Record[Idx++]); 909 SourceLocation SuperLoc = ReadSourceLocation(Record, Idx); 910 E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance); 911 break; 912 } 913 } 914 915 assert(Kind == E->getReceiverKind()); 916 917 if (Record[Idx++]) 918 E->setMethodDecl(cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++]))); 919 else 920 E->setSelector(Reader.GetSelector(Record, Idx)); 921 922 E->LBracLoc = ReadSourceLocation(Record, Idx); 923 E->RBracLoc = ReadSourceLocation(Record, Idx); 924 E->SelectorLoc = ReadSourceLocation(Record, Idx); 925 926 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 927 E->setArg(I, Reader.ReadSubExpr()); 928} 929 930void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { 931 VisitStmt(S); 932 S->setElement(Reader.ReadSubStmt()); 933 S->setCollection(Reader.ReadSubExpr()); 934 S->setBody(Reader.ReadSubStmt()); 935 S->setForLoc(ReadSourceLocation(Record, Idx)); 936 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 937} 938 939void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { 940 VisitStmt(S); 941 S->setCatchBody(Reader.ReadSubStmt()); 942 S->setCatchParamDecl(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++]))); 943 S->setAtCatchLoc(ReadSourceLocation(Record, Idx)); 944 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 945} 946 947void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 948 VisitStmt(S); 949 S->setFinallyBody(Reader.ReadSubStmt()); 950 S->setAtFinallyLoc(ReadSourceLocation(Record, Idx)); 951} 952 953void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { 954 VisitStmt(S); 955 assert(Record[Idx] == S->getNumCatchStmts()); 956 ++Idx; 957 bool HasFinally = Record[Idx++]; 958 S->setTryBody(Reader.ReadSubStmt()); 959 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) 960 S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt())); 961 962 if (HasFinally) 963 S->setFinallyStmt(Reader.ReadSubStmt()); 964 S->setAtTryLoc(ReadSourceLocation(Record, Idx)); 965} 966 967void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) { 968 VisitStmt(S); 969 S->setSynchExpr(Reader.ReadSubStmt()); 970 S->setSynchBody(Reader.ReadSubStmt()); 971 S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx)); 972} 973 974void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { 975 VisitStmt(S); 976 S->setThrowExpr(Reader.ReadSubStmt()); 977 S->setThrowLoc(ReadSourceLocation(Record, Idx)); 978} 979 980//===----------------------------------------------------------------------===// 981// C++ Expressions and Statements 982//===----------------------------------------------------------------------===// 983 984void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) { 985 VisitStmt(S); 986 S->CatchLoc = ReadSourceLocation(Record, Idx); 987 S->ExceptionDecl = cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])); 988 S->HandlerBlock = Reader.ReadSubStmt(); 989} 990 991void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) { 992 VisitStmt(S); 993 assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?"); 994 ++Idx; 995 S->TryLoc = ReadSourceLocation(Record, Idx); 996 S->getStmts()[0] = Reader.ReadSubStmt(); 997 for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i) 998 S->getStmts()[i + 1] = Reader.ReadSubStmt(); 999} 1000 1001void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 1002 VisitCallExpr(E); 1003 E->setOperator((OverloadedOperatorKind)Record[Idx++]); 1004} 1005 1006void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) { 1007 VisitExpr(E); 1008 E->NumArgs = Record[Idx++]; 1009 if (E->NumArgs) 1010 E->Args = new (*Reader.getContext()) Stmt*[E->NumArgs]; 1011 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 1012 E->setArg(I, Reader.ReadSubExpr()); 1013 E->setConstructor(cast<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++]))); 1014 E->setLocation(ReadSourceLocation(Record, Idx)); 1015 E->setElidable(Record[Idx++]); 1016 E->setRequiresZeroInitialization(Record[Idx++]); 1017 E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]); 1018 E->ParenRange = ReadSourceRange(Record, Idx); 1019} 1020 1021void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) { 1022 VisitCXXConstructExpr(E); 1023 E->Type = GetTypeSourceInfo(Record, Idx); 1024} 1025 1026void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) { 1027 VisitExplicitCastExpr(E); 1028 SourceRange R = ReadSourceRange(Record, Idx); 1029 E->Loc = R.getBegin(); 1030 E->RParenLoc = R.getEnd(); 1031} 1032 1033void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) { 1034 return VisitCXXNamedCastExpr(E); 1035} 1036 1037void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 1038 return VisitCXXNamedCastExpr(E); 1039} 1040 1041void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) { 1042 return VisitCXXNamedCastExpr(E); 1043} 1044 1045void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) { 1046 return VisitCXXNamedCastExpr(E); 1047} 1048 1049void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) { 1050 VisitExplicitCastExpr(E); 1051 E->setTypeBeginLoc(ReadSourceLocation(Record, Idx)); 1052 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1053} 1054 1055void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 1056 VisitExpr(E); 1057 E->setValue(Record[Idx++]); 1058 E->setLocation(ReadSourceLocation(Record, Idx)); 1059} 1060 1061void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) { 1062 VisitExpr(E); 1063 E->setLocation(ReadSourceLocation(Record, Idx)); 1064} 1065 1066void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) { 1067 VisitExpr(E); 1068 E->setSourceRange(ReadSourceRange(Record, Idx)); 1069 if (E->isTypeOperand()) { // typeid(int) 1070 E->setTypeOperandSourceInfo( 1071 GetTypeSourceInfo(Record, Idx)); 1072 return; 1073 } 1074 1075 // typeid(42+2) 1076 E->setExprOperand(Reader.ReadSubExpr()); 1077} 1078void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) { 1079 VisitExpr(E); 1080 E->setSourceRange(ReadSourceRange(Record, Idx)); 1081 if (E->isTypeOperand()) { // __uuidof(ComType) 1082 E->setTypeOperandSourceInfo( 1083 GetTypeSourceInfo(Record, Idx)); 1084 return; 1085 } 1086 1087 // __uuidof(expr) 1088 E->setExprOperand(Reader.ReadSubExpr()); 1089} 1090 1091void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) { 1092 VisitExpr(E); 1093 E->setLocation(ReadSourceLocation(Record, Idx)); 1094 E->setImplicit(Record[Idx++]); 1095} 1096 1097void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) { 1098 VisitExpr(E); 1099 E->setThrowLoc(ReadSourceLocation(Record, Idx)); 1100 E->setSubExpr(Reader.ReadSubExpr()); 1101} 1102 1103void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 1104 VisitExpr(E); 1105 1106 assert(Record[Idx] == E->Param.getInt() && "We messed up at creation ?"); 1107 ++Idx; // HasOtherExprStored and SubExpr was handled during creation. 1108 E->Param.setPointer(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++]))); 1109 E->Loc = ReadSourceLocation(Record, Idx); 1110} 1111 1112void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 1113 VisitExpr(E); 1114 E->setTemporary(Reader.ReadCXXTemporary(Record, Idx)); 1115 E->setSubExpr(Reader.ReadSubExpr()); 1116} 1117 1118void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { 1119 VisitExpr(E); 1120 E->TypeInfo = GetTypeSourceInfo(Record, Idx); 1121 E->RParenLoc = ReadSourceLocation(Record, Idx); 1122} 1123 1124void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) { 1125 VisitExpr(E); 1126 E->GlobalNew = Record[Idx++]; 1127 E->Initializer = Record[Idx++]; 1128 E->UsualArrayDeleteWantsSize = Record[Idx++]; 1129 bool isArray = Record[Idx++]; 1130 unsigned NumPlacementArgs = Record[Idx++]; 1131 unsigned NumCtorArgs = Record[Idx++]; 1132 E->setOperatorNew(cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++]))); 1133 E->setOperatorDelete( 1134 cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++]))); 1135 E->setConstructor( 1136 cast_or_null<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++]))); 1137 E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx); 1138 SourceRange TypeIdParens; 1139 TypeIdParens.setBegin(ReadSourceLocation(Record, Idx)); 1140 TypeIdParens.setEnd(ReadSourceLocation(Record, Idx)); 1141 E->TypeIdParens = TypeIdParens; 1142 E->StartLoc = ReadSourceLocation(Record, Idx); 1143 E->EndLoc = ReadSourceLocation(Record, Idx); 1144 E->ConstructorLParen = ReadSourceLocation(Record, Idx); 1145 E->ConstructorRParen = ReadSourceLocation(Record, Idx); 1146 1147 E->AllocateArgsArray(*Reader.getContext(), isArray, NumPlacementArgs, 1148 NumCtorArgs); 1149 1150 // Install all the subexpressions. 1151 for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end(); 1152 I != e; ++I) 1153 *I = Reader.ReadSubStmt(); 1154} 1155 1156void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 1157 VisitExpr(E); 1158 E->GlobalDelete = Record[Idx++]; 1159 E->ArrayForm = Record[Idx++]; 1160 E->ArrayFormAsWritten = Record[Idx++]; 1161 E->UsualArrayDeleteWantsSize = Record[Idx++]; 1162 E->OperatorDelete = cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])); 1163 E->Argument = Reader.ReadSubExpr(); 1164 E->Loc = ReadSourceLocation(Record, Idx); 1165} 1166 1167void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 1168 VisitExpr(E); 1169 1170 E->Base = Reader.ReadSubExpr(); 1171 E->IsArrow = Record[Idx++]; 1172 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1173 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1174 E->ScopeType = GetTypeSourceInfo(Record, Idx); 1175 E->ColonColonLoc = ReadSourceLocation(Record, Idx); 1176 E->TildeLoc = ReadSourceLocation(Record, Idx); 1177 1178 IdentifierInfo *II = Reader.GetIdentifierInfo(Record, Idx); 1179 if (II) 1180 E->setDestroyedType(II, ReadSourceLocation(Record, Idx)); 1181 else 1182 E->setDestroyedType(GetTypeSourceInfo(Record, Idx)); 1183} 1184 1185void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) { 1186 VisitExpr(E); 1187 unsigned NumTemps = Record[Idx++]; 1188 if (NumTemps) { 1189 E->setNumTemporaries(*Reader.getContext(), NumTemps); 1190 for (unsigned i = 0; i != NumTemps; ++i) 1191 E->setTemporary(i, Reader.ReadCXXTemporary(Record, Idx)); 1192 } 1193 E->setSubExpr(Reader.ReadSubExpr()); 1194} 1195 1196void 1197ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){ 1198 VisitExpr(E); 1199 1200 if (Record[Idx++]) 1201 ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(), 1202 Record[Idx++]); 1203 1204 E->setBase(Reader.ReadSubExpr()); 1205 E->setBaseType(Reader.GetType(Record[Idx++])); 1206 E->setArrow(Record[Idx++]); 1207 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 1208 E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx)); 1209 E->setQualifierRange(ReadSourceRange(Record, Idx)); 1210 E->setFirstQualifierFoundInScope( 1211 cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++]))); 1212 ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx); 1213} 1214 1215void 1216ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { 1217 VisitExpr(E); 1218 1219 if (Record[Idx++]) 1220 ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(), 1221 Record[Idx++]); 1222 1223 ReadDeclarationNameInfo(E->NameInfo, Record, Idx); 1224 E->setQualifierRange(ReadSourceRange(Record, Idx)); 1225 E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx)); 1226} 1227 1228void 1229ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) { 1230 VisitExpr(E); 1231 assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?"); 1232 ++Idx; // NumArgs; 1233 for (unsigned I = 0, N = E->arg_size(); I != N; ++I) 1234 E->setArg(I, Reader.ReadSubExpr()); 1235 E->Type = GetTypeSourceInfo(Record, Idx); 1236 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 1237 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1238} 1239 1240void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) { 1241 VisitExpr(E); 1242 1243 // Read the explicit template argument list, if available. 1244 if (Record[Idx++]) 1245 ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(), 1246 Record[Idx++]); 1247 1248 unsigned NumDecls = Record[Idx++]; 1249 UnresolvedSet<8> Decls; 1250 for (unsigned i = 0; i != NumDecls; ++i) { 1251 NamedDecl *D = cast<NamedDecl>(Reader.GetDecl(Record[Idx++])); 1252 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 1253 Decls.addDecl(D, AS); 1254 } 1255 E->initializeResults(*Reader.getContext(), Decls.begin(), Decls.end()); 1256 1257 ReadDeclarationNameInfo(E->NameInfo, Record, Idx); 1258 E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx)); 1259 E->setQualifierRange(ReadSourceRange(Record, Idx)); 1260} 1261 1262void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) { 1263 VisitOverloadExpr(E); 1264 E->setArrow(Record[Idx++]); 1265 E->setHasUnresolvedUsing(Record[Idx++]); 1266 E->setBase(Reader.ReadSubExpr()); 1267 E->setBaseType(Reader.GetType(Record[Idx++])); 1268 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 1269} 1270 1271void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { 1272 VisitOverloadExpr(E); 1273 E->setRequiresADL(Record[Idx++]); 1274 E->setOverloaded(Record[Idx++]); 1275 E->setNamingClass(cast_or_null<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]))); 1276} 1277 1278void ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 1279 VisitExpr(E); 1280 E->UTT = (UnaryTypeTrait)Record[Idx++]; 1281 E->Value = (bool)Record[Idx++]; 1282 SourceRange Range = ReadSourceRange(Record, Idx); 1283 E->Loc = Range.getBegin(); 1284 E->RParen = Range.getEnd(); 1285 E->QueriedType = GetTypeSourceInfo(Record, Idx); 1286} 1287 1288void ASTStmtReader::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) { 1289 VisitExpr(E); 1290 E->BTT = (BinaryTypeTrait)Record[Idx++]; 1291 E->Value = (bool)Record[Idx++]; 1292 SourceRange Range = ReadSourceRange(Record, Idx); 1293 E->Loc = Range.getBegin(); 1294 E->RParen = Range.getEnd(); 1295 E->LhsType = GetTypeSourceInfo(Record, Idx); 1296 E->RhsType = GetTypeSourceInfo(Record, Idx); 1297} 1298 1299void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 1300 VisitExpr(E); 1301 E->Value = (bool)Record[Idx++]; 1302 E->Range = ReadSourceRange(Record, Idx); 1303 E->Operand = Reader.ReadSubExpr(); 1304} 1305 1306void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) { 1307 VisitExpr(E); 1308 E->EllipsisLoc = ReadSourceLocation(Record, Idx); 1309 E->NumExpansions = Record[Idx++]; 1310 E->Pattern = Reader.ReadSubExpr(); 1311} 1312 1313void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) { 1314 VisitExpr(E); 1315 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1316 E->PackLoc = ReadSourceLocation(Record, Idx); 1317 E->RParenLoc = ReadSourceLocation(Record, Idx); 1318 E->Length = Record[Idx++]; 1319 E->Pack = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])); 1320} 1321 1322void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr( 1323 SubstNonTypeTemplateParmPackExpr *E) { 1324 VisitExpr(E); 1325 E->Param 1326 = cast_or_null<NonTypeTemplateParmDecl>(Reader.GetDecl(Record[Idx++])); 1327 TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx); 1328 if (ArgPack.getKind() != TemplateArgument::Pack) 1329 return; 1330 1331 E->Arguments = ArgPack.pack_begin(); 1332 E->NumArguments = ArgPack.pack_size(); 1333 E->NameLoc = ReadSourceLocation(Record, Idx); 1334} 1335 1336void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) { 1337 VisitExpr(E); 1338 Idx++; // skip ID 1339 E->Loc = ReadSourceLocation(Record, Idx); 1340} 1341 1342//===----------------------------------------------------------------------===// 1343// CUDA Expressions and Statements 1344//===----------------------------------------------------------------------===// 1345 1346void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 1347 VisitCallExpr(E); 1348 E->setConfig(cast<CallExpr>(Reader.ReadSubExpr())); 1349} 1350 1351Stmt *ASTReader::ReadStmt(PerFileData &F) { 1352 switch (ReadingKind) { 1353 case Read_Decl: 1354 case Read_Type: 1355 return ReadStmtFromStream(F); 1356 case Read_Stmt: 1357 return ReadSubStmt(); 1358 } 1359 1360 llvm_unreachable("ReadingKind not set ?"); 1361 return 0; 1362} 1363 1364Expr *ASTReader::ReadExpr(PerFileData &F) { 1365 return cast_or_null<Expr>(ReadStmt(F)); 1366} 1367 1368Expr *ASTReader::ReadSubExpr() { 1369 return cast_or_null<Expr>(ReadSubStmt()); 1370} 1371 1372// Within the bitstream, expressions are stored in Reverse Polish 1373// Notation, with each of the subexpressions preceding the 1374// expression they are stored in. Subexpressions are stored from last to first. 1375// To evaluate expressions, we continue reading expressions and placing them on 1376// the stack, with expressions having operands removing those operands from the 1377// stack. Evaluation terminates when we see a STMT_STOP record, and 1378// the single remaining expression on the stack is our result. 1379Stmt *ASTReader::ReadStmtFromStream(PerFileData &F) { 1380 1381 ReadingKindTracker ReadingKind(Read_Stmt, *this); 1382 llvm::BitstreamCursor &Cursor = F.DeclsCursor; 1383 1384#ifndef NDEBUG 1385 unsigned PrevNumStmts = StmtStack.size(); 1386#endif 1387 1388 RecordData Record; 1389 unsigned Idx; 1390 ASTStmtReader Reader(*this, F, Cursor, Record, Idx); 1391 Stmt::EmptyShell Empty; 1392 1393 while (true) { 1394 unsigned Code = Cursor.ReadCode(); 1395 if (Code == llvm::bitc::END_BLOCK) { 1396 if (Cursor.ReadBlockEnd()) { 1397 Error("error at end of block in AST file"); 1398 return 0; 1399 } 1400 break; 1401 } 1402 1403 if (Code == llvm::bitc::ENTER_SUBBLOCK) { 1404 // No known subblocks, always skip them. 1405 Cursor.ReadSubBlockID(); 1406 if (Cursor.SkipBlock()) { 1407 Error("malformed block record in AST file"); 1408 return 0; 1409 } 1410 continue; 1411 } 1412 1413 if (Code == llvm::bitc::DEFINE_ABBREV) { 1414 Cursor.ReadAbbrevRecord(); 1415 continue; 1416 } 1417 1418 Stmt *S = 0; 1419 Idx = 0; 1420 Record.clear(); 1421 bool Finished = false; 1422 switch ((StmtCode)Cursor.ReadRecord(Code, Record)) { 1423 case STMT_STOP: 1424 Finished = true; 1425 break; 1426 1427 case STMT_NULL_PTR: 1428 S = 0; 1429 break; 1430 1431 case STMT_NULL: 1432 S = new (Context) NullStmt(Empty); 1433 break; 1434 1435 case STMT_COMPOUND: 1436 S = new (Context) CompoundStmt(Empty); 1437 break; 1438 1439 case STMT_CASE: 1440 S = new (Context) CaseStmt(Empty); 1441 break; 1442 1443 case STMT_DEFAULT: 1444 S = new (Context) DefaultStmt(Empty); 1445 break; 1446 1447 case STMT_LABEL: 1448 S = new (Context) LabelStmt(Empty); 1449 break; 1450 1451 case STMT_IF: 1452 S = new (Context) IfStmt(Empty); 1453 break; 1454 1455 case STMT_SWITCH: 1456 S = new (Context) SwitchStmt(Empty); 1457 break; 1458 1459 case STMT_WHILE: 1460 S = new (Context) WhileStmt(Empty); 1461 break; 1462 1463 case STMT_DO: 1464 S = new (Context) DoStmt(Empty); 1465 break; 1466 1467 case STMT_FOR: 1468 S = new (Context) ForStmt(Empty); 1469 break; 1470 1471 case STMT_GOTO: 1472 S = new (Context) GotoStmt(Empty); 1473 break; 1474 1475 case STMT_INDIRECT_GOTO: 1476 S = new (Context) IndirectGotoStmt(Empty); 1477 break; 1478 1479 case STMT_CONTINUE: 1480 S = new (Context) ContinueStmt(Empty); 1481 break; 1482 1483 case STMT_BREAK: 1484 S = new (Context) BreakStmt(Empty); 1485 break; 1486 1487 case STMT_RETURN: 1488 S = new (Context) ReturnStmt(Empty); 1489 break; 1490 1491 case STMT_DECL: 1492 S = new (Context) DeclStmt(Empty); 1493 break; 1494 1495 case STMT_ASM: 1496 S = new (Context) AsmStmt(Empty); 1497 break; 1498 1499 case EXPR_PREDEFINED: 1500 S = new (Context) PredefinedExpr(Empty); 1501 break; 1502 1503 case EXPR_DECL_REF: 1504 S = DeclRefExpr::CreateEmpty(*Context, 1505 /*HasQualifier=*/Record[ASTStmtReader::NumExprFields], 1506 /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 1], 1507 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 1] 1508 ? Record[ASTStmtReader::NumExprFields + 2] 1509 : 0); 1510 break; 1511 1512 case EXPR_INTEGER_LITERAL: 1513 S = IntegerLiteral::Create(*Context, Empty); 1514 break; 1515 1516 case EXPR_FLOATING_LITERAL: 1517 S = FloatingLiteral::Create(*Context, Empty); 1518 break; 1519 1520 case EXPR_IMAGINARY_LITERAL: 1521 S = new (Context) ImaginaryLiteral(Empty); 1522 break; 1523 1524 case EXPR_STRING_LITERAL: 1525 S = StringLiteral::CreateEmpty(*Context, 1526 Record[ASTStmtReader::NumExprFields + 1]); 1527 break; 1528 1529 case EXPR_CHARACTER_LITERAL: 1530 S = new (Context) CharacterLiteral(Empty); 1531 break; 1532 1533 case EXPR_PAREN: 1534 S = new (Context) ParenExpr(Empty); 1535 break; 1536 1537 case EXPR_PAREN_LIST: 1538 S = new (Context) ParenListExpr(Empty); 1539 break; 1540 1541 case EXPR_UNARY_OPERATOR: 1542 S = new (Context) UnaryOperator(Empty); 1543 break; 1544 1545 case EXPR_OFFSETOF: 1546 S = OffsetOfExpr::CreateEmpty(*Context, 1547 Record[ASTStmtReader::NumExprFields], 1548 Record[ASTStmtReader::NumExprFields + 1]); 1549 break; 1550 1551 case EXPR_SIZEOF_ALIGN_OF: 1552 S = new (Context) SizeOfAlignOfExpr(Empty); 1553 break; 1554 1555 case EXPR_ARRAY_SUBSCRIPT: 1556 S = new (Context) ArraySubscriptExpr(Empty); 1557 break; 1558 1559 case EXPR_CALL: 1560 S = new (Context) CallExpr(*Context, Stmt::CallExprClass, Empty); 1561 break; 1562 1563 case EXPR_MEMBER: { 1564 // We load everything here and fully initialize it at creation. 1565 // That way we can use MemberExpr::Create and don't have to duplicate its 1566 // logic with a MemberExpr::CreateEmpty. 1567 1568 assert(Idx == 0); 1569 NestedNameSpecifier *NNS = 0; 1570 SourceRange QualifierRange; 1571 if (Record[Idx++]) { // HasQualifier. 1572 NNS = ReadNestedNameSpecifier(Record, Idx); 1573 QualifierRange = ReadSourceRange(F, Record, Idx); 1574 } 1575 1576 TemplateArgumentListInfo ArgInfo; 1577 bool HasExplicitTemplateArgs = Record[Idx++]; 1578 if (HasExplicitTemplateArgs) { 1579 unsigned NumTemplateArgs = Record[Idx++]; 1580 ArgInfo.setLAngleLoc(ReadSourceLocation(F, Record, Idx)); 1581 ArgInfo.setRAngleLoc(ReadSourceLocation(F, Record, Idx)); 1582 for (unsigned i = 0; i != NumTemplateArgs; ++i) 1583 ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx)); 1584 } 1585 1586 NamedDecl *FoundD = cast_or_null<NamedDecl>(GetDecl(Record[Idx++])); 1587 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 1588 DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS); 1589 1590 QualType T = GetType(Record[Idx++]); 1591 ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]); 1592 ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]); 1593 Expr *Base = ReadSubExpr(); 1594 ValueDecl *MemberD = cast<ValueDecl>(GetDecl(Record[Idx++])); 1595 SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx); 1596 DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc); 1597 bool IsArrow = Record[Idx++]; 1598 1599 S = MemberExpr::Create(*Context, Base, IsArrow, NNS, QualifierRange, 1600 MemberD, FoundDecl, MemberNameInfo, 1601 HasExplicitTemplateArgs ? &ArgInfo : 0, T, VK, OK); 1602 ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc, 1603 MemberD->getDeclName(), Record, Idx); 1604 break; 1605 } 1606 1607 case EXPR_BINARY_OPERATOR: 1608 S = new (Context) BinaryOperator(Empty); 1609 break; 1610 1611 case EXPR_COMPOUND_ASSIGN_OPERATOR: 1612 S = new (Context) CompoundAssignOperator(Empty); 1613 break; 1614 1615 case EXPR_CONDITIONAL_OPERATOR: 1616 S = new (Context) ConditionalOperator(Empty); 1617 break; 1618 1619 case EXPR_BINARY_CONDITIONAL_OPERATOR: 1620 S = new (Context) BinaryConditionalOperator(Empty); 1621 break; 1622 1623 case EXPR_IMPLICIT_CAST: 1624 S = ImplicitCastExpr::CreateEmpty(*Context, 1625 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 1626 break; 1627 1628 case EXPR_CSTYLE_CAST: 1629 S = CStyleCastExpr::CreateEmpty(*Context, 1630 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 1631 break; 1632 1633 case EXPR_COMPOUND_LITERAL: 1634 S = new (Context) CompoundLiteralExpr(Empty); 1635 break; 1636 1637 case EXPR_EXT_VECTOR_ELEMENT: 1638 S = new (Context) ExtVectorElementExpr(Empty); 1639 break; 1640 1641 case EXPR_INIT_LIST: 1642 S = new (Context) InitListExpr(*getContext(), Empty); 1643 break; 1644 1645 case EXPR_DESIGNATED_INIT: 1646 S = DesignatedInitExpr::CreateEmpty(*Context, 1647 Record[ASTStmtReader::NumExprFields] - 1); 1648 1649 break; 1650 1651 case EXPR_IMPLICIT_VALUE_INIT: 1652 S = new (Context) ImplicitValueInitExpr(Empty); 1653 break; 1654 1655 case EXPR_VA_ARG: 1656 S = new (Context) VAArgExpr(Empty); 1657 break; 1658 1659 case EXPR_ADDR_LABEL: 1660 S = new (Context) AddrLabelExpr(Empty); 1661 break; 1662 1663 case EXPR_STMT: 1664 S = new (Context) StmtExpr(Empty); 1665 break; 1666 1667 case EXPR_CHOOSE: 1668 S = new (Context) ChooseExpr(Empty); 1669 break; 1670 1671 case EXPR_GNU_NULL: 1672 S = new (Context) GNUNullExpr(Empty); 1673 break; 1674 1675 case EXPR_SHUFFLE_VECTOR: 1676 S = new (Context) ShuffleVectorExpr(Empty); 1677 break; 1678 1679 case EXPR_BLOCK: 1680 S = new (Context) BlockExpr(Empty); 1681 break; 1682 1683 case EXPR_BLOCK_DECL_REF: 1684 S = new (Context) BlockDeclRefExpr(Empty); 1685 break; 1686 1687 case EXPR_OBJC_STRING_LITERAL: 1688 S = new (Context) ObjCStringLiteral(Empty); 1689 break; 1690 case EXPR_OBJC_ENCODE: 1691 S = new (Context) ObjCEncodeExpr(Empty); 1692 break; 1693 case EXPR_OBJC_SELECTOR_EXPR: 1694 S = new (Context) ObjCSelectorExpr(Empty); 1695 break; 1696 case EXPR_OBJC_PROTOCOL_EXPR: 1697 S = new (Context) ObjCProtocolExpr(Empty); 1698 break; 1699 case EXPR_OBJC_IVAR_REF_EXPR: 1700 S = new (Context) ObjCIvarRefExpr(Empty); 1701 break; 1702 case EXPR_OBJC_PROPERTY_REF_EXPR: 1703 S = new (Context) ObjCPropertyRefExpr(Empty); 1704 break; 1705 case EXPR_OBJC_KVC_REF_EXPR: 1706 llvm_unreachable("mismatching AST file"); 1707 break; 1708 case EXPR_OBJC_MESSAGE_EXPR: 1709 S = ObjCMessageExpr::CreateEmpty(*Context, 1710 Record[ASTStmtReader::NumExprFields]); 1711 break; 1712 case EXPR_OBJC_ISA: 1713 S = new (Context) ObjCIsaExpr(Empty); 1714 break; 1715 case STMT_OBJC_FOR_COLLECTION: 1716 S = new (Context) ObjCForCollectionStmt(Empty); 1717 break; 1718 case STMT_OBJC_CATCH: 1719 S = new (Context) ObjCAtCatchStmt(Empty); 1720 break; 1721 case STMT_OBJC_FINALLY: 1722 S = new (Context) ObjCAtFinallyStmt(Empty); 1723 break; 1724 case STMT_OBJC_AT_TRY: 1725 S = ObjCAtTryStmt::CreateEmpty(*Context, 1726 Record[ASTStmtReader::NumStmtFields], 1727 Record[ASTStmtReader::NumStmtFields + 1]); 1728 break; 1729 case STMT_OBJC_AT_SYNCHRONIZED: 1730 S = new (Context) ObjCAtSynchronizedStmt(Empty); 1731 break; 1732 case STMT_OBJC_AT_THROW: 1733 S = new (Context) ObjCAtThrowStmt(Empty); 1734 break; 1735 1736 case STMT_CXX_CATCH: 1737 S = new (Context) CXXCatchStmt(Empty); 1738 break; 1739 1740 case STMT_CXX_TRY: 1741 S = CXXTryStmt::Create(*Context, Empty, 1742 /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]); 1743 break; 1744 1745 case EXPR_CXX_OPERATOR_CALL: 1746 S = new (Context) CXXOperatorCallExpr(*Context, Empty); 1747 break; 1748 1749 case EXPR_CXX_MEMBER_CALL: 1750 S = new (Context) CXXMemberCallExpr(*Context, Empty); 1751 break; 1752 1753 case EXPR_CXX_CONSTRUCT: 1754 S = new (Context) CXXConstructExpr(Empty); 1755 break; 1756 1757 case EXPR_CXX_TEMPORARY_OBJECT: 1758 S = new (Context) CXXTemporaryObjectExpr(Empty); 1759 break; 1760 1761 case EXPR_CXX_STATIC_CAST: 1762 S = CXXStaticCastExpr::CreateEmpty(*Context, 1763 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 1764 break; 1765 1766 case EXPR_CXX_DYNAMIC_CAST: 1767 S = CXXDynamicCastExpr::CreateEmpty(*Context, 1768 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 1769 break; 1770 1771 case EXPR_CXX_REINTERPRET_CAST: 1772 S = CXXReinterpretCastExpr::CreateEmpty(*Context, 1773 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 1774 break; 1775 1776 case EXPR_CXX_CONST_CAST: 1777 S = CXXConstCastExpr::CreateEmpty(*Context); 1778 break; 1779 1780 case EXPR_CXX_FUNCTIONAL_CAST: 1781 S = CXXFunctionalCastExpr::CreateEmpty(*Context, 1782 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 1783 break; 1784 1785 case EXPR_CXX_BOOL_LITERAL: 1786 S = new (Context) CXXBoolLiteralExpr(Empty); 1787 break; 1788 1789 case EXPR_CXX_NULL_PTR_LITERAL: 1790 S = new (Context) CXXNullPtrLiteralExpr(Empty); 1791 break; 1792 case EXPR_CXX_TYPEID_EXPR: 1793 S = new (Context) CXXTypeidExpr(Empty, true); 1794 break; 1795 case EXPR_CXX_TYPEID_TYPE: 1796 S = new (Context) CXXTypeidExpr(Empty, false); 1797 break; 1798 case EXPR_CXX_UUIDOF_EXPR: 1799 S = new (Context) CXXUuidofExpr(Empty, true); 1800 break; 1801 case EXPR_CXX_UUIDOF_TYPE: 1802 S = new (Context) CXXUuidofExpr(Empty, false); 1803 break; 1804 case EXPR_CXX_THIS: 1805 S = new (Context) CXXThisExpr(Empty); 1806 break; 1807 case EXPR_CXX_THROW: 1808 S = new (Context) CXXThrowExpr(Empty); 1809 break; 1810 case EXPR_CXX_DEFAULT_ARG: { 1811 bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields]; 1812 if (HasOtherExprStored) { 1813 Expr *SubExpr = ReadSubExpr(); 1814 S = CXXDefaultArgExpr::Create(*Context, SourceLocation(), 0, SubExpr); 1815 } else 1816 S = new (Context) CXXDefaultArgExpr(Empty); 1817 break; 1818 } 1819 case EXPR_CXX_BIND_TEMPORARY: 1820 S = new (Context) CXXBindTemporaryExpr(Empty); 1821 break; 1822 1823 case EXPR_CXX_SCALAR_VALUE_INIT: 1824 S = new (Context) CXXScalarValueInitExpr(Empty); 1825 break; 1826 case EXPR_CXX_NEW: 1827 S = new (Context) CXXNewExpr(Empty); 1828 break; 1829 case EXPR_CXX_DELETE: 1830 S = new (Context) CXXDeleteExpr(Empty); 1831 break; 1832 case EXPR_CXX_PSEUDO_DESTRUCTOR: 1833 S = new (Context) CXXPseudoDestructorExpr(Empty); 1834 break; 1835 1836 case EXPR_EXPR_WITH_CLEANUPS: 1837 S = new (Context) ExprWithCleanups(Empty); 1838 break; 1839 1840 case EXPR_CXX_DEPENDENT_SCOPE_MEMBER: 1841 S = CXXDependentScopeMemberExpr::CreateEmpty(*Context, 1842 /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields], 1843 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 1844 ? Record[ASTStmtReader::NumExprFields + 1] 1845 : 0); 1846 break; 1847 1848 case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF: 1849 S = DependentScopeDeclRefExpr::CreateEmpty(*Context, 1850 /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields], 1851 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 1852 ? Record[ASTStmtReader::NumExprFields + 1] 1853 : 0); 1854 break; 1855 1856 case EXPR_CXX_UNRESOLVED_CONSTRUCT: 1857 S = CXXUnresolvedConstructExpr::CreateEmpty(*Context, 1858 /*NumArgs=*/Record[ASTStmtReader::NumExprFields]); 1859 break; 1860 1861 case EXPR_CXX_UNRESOLVED_MEMBER: 1862 S = UnresolvedMemberExpr::CreateEmpty(*Context, 1863 /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields], 1864 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 1865 ? Record[ASTStmtReader::NumExprFields + 1] 1866 : 0); 1867 break; 1868 1869 case EXPR_CXX_UNRESOLVED_LOOKUP: 1870 S = UnresolvedLookupExpr::CreateEmpty(*Context, 1871 /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields], 1872 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 1873 ? Record[ASTStmtReader::NumExprFields + 1] 1874 : 0); 1875 break; 1876 1877 case EXPR_CXX_UNARY_TYPE_TRAIT: 1878 S = new (Context) UnaryTypeTraitExpr(Empty); 1879 break; 1880 1881 case EXPR_BINARY_TYPE_TRAIT: 1882 S = new (Context) BinaryTypeTraitExpr(Empty); 1883 break; 1884 1885 case EXPR_CXX_NOEXCEPT: 1886 S = new (Context) CXXNoexceptExpr(Empty); 1887 break; 1888 1889 case EXPR_PACK_EXPANSION: 1890 S = new (Context) PackExpansionExpr(Empty); 1891 break; 1892 1893 case EXPR_SIZEOF_PACK: 1894 S = new (Context) SizeOfPackExpr(Empty); 1895 break; 1896 1897 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK: 1898 S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty); 1899 break; 1900 1901 case EXPR_OPAQUE_VALUE: { 1902 unsigned key = Record[ASTStmtReader::NumExprFields]; 1903 OpaqueValueExpr *&expr = OpaqueValueExprs[key]; 1904 1905 // If we already have an entry for this opaque value expression, 1906 // don't bother reading it again. 1907 if (expr) { 1908 StmtStack.push_back(expr); 1909 continue; 1910 } 1911 1912 S = expr = new (Context) OpaqueValueExpr(Empty); 1913 break; 1914 } 1915 1916 case EXPR_CUDA_KERNEL_CALL: 1917 S = new (Context) CUDAKernelCallExpr(*Context, Empty); 1918 break; 1919 } 1920 1921 // We hit a STMT_STOP, so we're done with this expression. 1922 if (Finished) 1923 break; 1924 1925 ++NumStatementsRead; 1926 1927 if (S) 1928 Reader.Visit(S); 1929 1930 assert(Idx == Record.size() && "Invalid deserialization of statement"); 1931 StmtStack.push_back(S); 1932 } 1933 1934#ifndef NDEBUG 1935 assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!"); 1936 assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!"); 1937#endif 1938 1939 return StmtStack.pop_back_val(); 1940} 1941