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/ASTContext.h" 17 #include "clang/AST/DeclCXX.h" 18 #include "clang/AST/DeclTemplate.h" 19 #include "clang/AST/StmtVisitor.h" 20 #include "clang/Lex/Token.h" 21 #include "llvm/ADT/SmallString.h" 22 using namespace clang; 23 using namespace clang::serialization; 24 25 namespace clang { 26 27 class ASTStmtReader : public StmtVisitor<ASTStmtReader> { 28 friend class OMPClauseReader; 29 typedef ASTReader::RecordData RecordData; 30 31 ASTReader &Reader; 32 ModuleFile &F; 33 llvm::BitstreamCursor &DeclsCursor; 34 const ASTReader::RecordData &Record; 35 unsigned &Idx; 36 37 Token ReadToken(const RecordData &R, unsigned &I) { 38 return Reader.ReadToken(F, R, I); 39 } 40 41 SourceLocation ReadSourceLocation(const RecordData &R, unsigned &I) { 42 return Reader.ReadSourceLocation(F, R, I); 43 } 44 45 SourceRange ReadSourceRange(const RecordData &R, unsigned &I) { 46 return Reader.ReadSourceRange(F, R, I); 47 } 48 49 std::string ReadString(const RecordData &R, unsigned &I) { 50 return Reader.ReadString(R, I); 51 } 52 53 TypeSourceInfo *GetTypeSourceInfo(const RecordData &R, unsigned &I) { 54 return Reader.GetTypeSourceInfo(F, R, I); 55 } 56 57 serialization::DeclID ReadDeclID(const RecordData &R, unsigned &I) { 58 return Reader.ReadDeclID(F, R, I); 59 } 60 61 Decl *ReadDecl(const RecordData &R, unsigned &I) { 62 return Reader.ReadDecl(F, R, I); 63 } 64 65 template<typename T> 66 T *ReadDeclAs(const RecordData &R, unsigned &I) { 67 return Reader.ReadDeclAs<T>(F, R, I); 68 } 69 70 void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name, 71 const ASTReader::RecordData &R, unsigned &I) { 72 Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I); 73 } 74 75 void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo, 76 const ASTReader::RecordData &R, unsigned &I) { 77 Reader.ReadDeclarationNameInfo(F, NameInfo, R, I); 78 } 79 80 public: 81 ASTStmtReader(ASTReader &Reader, ModuleFile &F, 82 llvm::BitstreamCursor &Cursor, 83 const ASTReader::RecordData &Record, unsigned &Idx) 84 : Reader(Reader), F(F), DeclsCursor(Cursor), Record(Record), Idx(Idx) { } 85 86 /// \brief The number of record fields required for the Stmt class 87 /// itself. 88 static const unsigned NumStmtFields = 0; 89 90 /// \brief The number of record fields required for the Expr class 91 /// itself. 92 static const unsigned NumExprFields = NumStmtFields + 7; 93 94 /// \brief Read and initialize a ExplicitTemplateArgumentList structure. 95 void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, 96 TemplateArgumentLoc *ArgsLocArray, 97 unsigned NumTemplateArgs); 98 /// \brief Read and initialize a ExplicitTemplateArgumentList structure. 99 void ReadExplicitTemplateArgumentList(ASTTemplateArgumentListInfo &ArgList, 100 unsigned NumTemplateArgs); 101 102 void VisitStmt(Stmt *S); 103 #define STMT(Type, Base) \ 104 void Visit##Type(Type *); 105 #include "clang/AST/StmtNodes.inc" 106 }; 107 } 108 109 void ASTStmtReader::ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, 110 TemplateArgumentLoc *ArgsLocArray, 111 unsigned NumTemplateArgs) { 112 SourceLocation TemplateKWLoc = ReadSourceLocation(Record, Idx); 113 TemplateArgumentListInfo ArgInfo; 114 ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx)); 115 ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx)); 116 for (unsigned i = 0; i != NumTemplateArgs; ++i) 117 ArgInfo.addArgument( 118 Reader.ReadTemplateArgumentLoc(F, Record, Idx)); 119 Args.initializeFrom(TemplateKWLoc, ArgInfo, ArgsLocArray); 120 } 121 122 void ASTStmtReader::VisitStmt(Stmt *S) { 123 assert(Idx == NumStmtFields && "Incorrect statement field count"); 124 } 125 126 void ASTStmtReader::VisitNullStmt(NullStmt *S) { 127 VisitStmt(S); 128 S->setSemiLoc(ReadSourceLocation(Record, Idx)); 129 S->HasLeadingEmptyMacro = Record[Idx++]; 130 } 131 132 void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) { 133 VisitStmt(S); 134 SmallVector<Stmt *, 16> Stmts; 135 unsigned NumStmts = Record[Idx++]; 136 while (NumStmts--) 137 Stmts.push_back(Reader.ReadSubStmt()); 138 S->setStmts(Reader.getContext(), Stmts); 139 S->LBraceLoc = ReadSourceLocation(Record, Idx); 140 S->RBraceLoc = ReadSourceLocation(Record, Idx); 141 } 142 143 void ASTStmtReader::VisitSwitchCase(SwitchCase *S) { 144 VisitStmt(S); 145 Reader.RecordSwitchCaseID(S, Record[Idx++]); 146 S->setKeywordLoc(ReadSourceLocation(Record, Idx)); 147 S->setColonLoc(ReadSourceLocation(Record, Idx)); 148 } 149 150 void ASTStmtReader::VisitCaseStmt(CaseStmt *S) { 151 VisitSwitchCase(S); 152 S->setLHS(Reader.ReadSubExpr()); 153 S->setRHS(Reader.ReadSubExpr()); 154 S->setSubStmt(Reader.ReadSubStmt()); 155 S->setEllipsisLoc(ReadSourceLocation(Record, Idx)); 156 } 157 158 void ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) { 159 VisitSwitchCase(S); 160 S->setSubStmt(Reader.ReadSubStmt()); 161 } 162 163 void ASTStmtReader::VisitLabelStmt(LabelStmt *S) { 164 VisitStmt(S); 165 LabelDecl *LD = ReadDeclAs<LabelDecl>(Record, Idx); 166 LD->setStmt(S); 167 S->setDecl(LD); 168 S->setSubStmt(Reader.ReadSubStmt()); 169 S->setIdentLoc(ReadSourceLocation(Record, Idx)); 170 } 171 172 void ASTStmtReader::VisitAttributedStmt(AttributedStmt *S) { 173 VisitStmt(S); 174 uint64_t NumAttrs = Record[Idx++]; 175 AttrVec Attrs; 176 Reader.ReadAttributes(F, Attrs, Record, Idx); 177 (void)NumAttrs; 178 assert(NumAttrs == S->NumAttrs); 179 assert(NumAttrs == Attrs.size()); 180 std::copy(Attrs.begin(), Attrs.end(), S->getAttrArrayPtr()); 181 S->SubStmt = Reader.ReadSubStmt(); 182 S->AttrLoc = ReadSourceLocation(Record, Idx); 183 } 184 185 void ASTStmtReader::VisitIfStmt(IfStmt *S) { 186 VisitStmt(S); 187 S->setConstexpr(Record[Idx++]); 188 S->setInit(Reader.ReadSubStmt()); 189 S->setConditionVariable(Reader.getContext(), 190 ReadDeclAs<VarDecl>(Record, Idx)); 191 S->setCond(Reader.ReadSubExpr()); 192 S->setThen(Reader.ReadSubStmt()); 193 S->setElse(Reader.ReadSubStmt()); 194 S->setIfLoc(ReadSourceLocation(Record, Idx)); 195 S->setElseLoc(ReadSourceLocation(Record, Idx)); 196 } 197 198 void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) { 199 VisitStmt(S); 200 S->setInit(Reader.ReadSubStmt()); 201 S->setConditionVariable(Reader.getContext(), 202 ReadDeclAs<VarDecl>(Record, Idx)); 203 S->setCond(Reader.ReadSubExpr()); 204 S->setBody(Reader.ReadSubStmt()); 205 S->setSwitchLoc(ReadSourceLocation(Record, Idx)); 206 if (Record[Idx++]) 207 S->setAllEnumCasesCovered(); 208 209 SwitchCase *PrevSC = nullptr; 210 for (unsigned N = Record.size(); Idx != N; ++Idx) { 211 SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]); 212 if (PrevSC) 213 PrevSC->setNextSwitchCase(SC); 214 else 215 S->setSwitchCaseList(SC); 216 217 PrevSC = SC; 218 } 219 } 220 221 void ASTStmtReader::VisitWhileStmt(WhileStmt *S) { 222 VisitStmt(S); 223 S->setConditionVariable(Reader.getContext(), 224 ReadDeclAs<VarDecl>(Record, Idx)); 225 226 S->setCond(Reader.ReadSubExpr()); 227 S->setBody(Reader.ReadSubStmt()); 228 S->setWhileLoc(ReadSourceLocation(Record, Idx)); 229 } 230 231 void ASTStmtReader::VisitDoStmt(DoStmt *S) { 232 VisitStmt(S); 233 S->setCond(Reader.ReadSubExpr()); 234 S->setBody(Reader.ReadSubStmt()); 235 S->setDoLoc(ReadSourceLocation(Record, Idx)); 236 S->setWhileLoc(ReadSourceLocation(Record, Idx)); 237 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 238 } 239 240 void ASTStmtReader::VisitForStmt(ForStmt *S) { 241 VisitStmt(S); 242 S->setInit(Reader.ReadSubStmt()); 243 S->setCond(Reader.ReadSubExpr()); 244 S->setConditionVariable(Reader.getContext(), 245 ReadDeclAs<VarDecl>(Record, Idx)); 246 S->setInc(Reader.ReadSubExpr()); 247 S->setBody(Reader.ReadSubStmt()); 248 S->setForLoc(ReadSourceLocation(Record, Idx)); 249 S->setLParenLoc(ReadSourceLocation(Record, Idx)); 250 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 251 } 252 253 void ASTStmtReader::VisitGotoStmt(GotoStmt *S) { 254 VisitStmt(S); 255 S->setLabel(ReadDeclAs<LabelDecl>(Record, Idx)); 256 S->setGotoLoc(ReadSourceLocation(Record, Idx)); 257 S->setLabelLoc(ReadSourceLocation(Record, Idx)); 258 } 259 260 void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) { 261 VisitStmt(S); 262 S->setGotoLoc(ReadSourceLocation(Record, Idx)); 263 S->setStarLoc(ReadSourceLocation(Record, Idx)); 264 S->setTarget(Reader.ReadSubExpr()); 265 } 266 267 void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) { 268 VisitStmt(S); 269 S->setContinueLoc(ReadSourceLocation(Record, Idx)); 270 } 271 272 void ASTStmtReader::VisitBreakStmt(BreakStmt *S) { 273 VisitStmt(S); 274 S->setBreakLoc(ReadSourceLocation(Record, Idx)); 275 } 276 277 void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) { 278 VisitStmt(S); 279 S->setRetValue(Reader.ReadSubExpr()); 280 S->setReturnLoc(ReadSourceLocation(Record, Idx)); 281 S->setNRVOCandidate(ReadDeclAs<VarDecl>(Record, Idx)); 282 } 283 284 void ASTStmtReader::VisitDeclStmt(DeclStmt *S) { 285 VisitStmt(S); 286 S->setStartLoc(ReadSourceLocation(Record, Idx)); 287 S->setEndLoc(ReadSourceLocation(Record, Idx)); 288 289 if (Idx + 1 == Record.size()) { 290 // Single declaration 291 S->setDeclGroup(DeclGroupRef(ReadDecl(Record, Idx))); 292 } else { 293 SmallVector<Decl *, 16> Decls; 294 Decls.reserve(Record.size() - Idx); 295 for (unsigned N = Record.size(); Idx != N; ) 296 Decls.push_back(ReadDecl(Record, Idx)); 297 S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Reader.getContext(), 298 Decls.data(), 299 Decls.size()))); 300 } 301 } 302 303 void ASTStmtReader::VisitAsmStmt(AsmStmt *S) { 304 VisitStmt(S); 305 S->NumOutputs = Record[Idx++]; 306 S->NumInputs = Record[Idx++]; 307 S->NumClobbers = Record[Idx++]; 308 S->setAsmLoc(ReadSourceLocation(Record, Idx)); 309 S->setVolatile(Record[Idx++]); 310 S->setSimple(Record[Idx++]); 311 } 312 313 void ASTStmtReader::VisitGCCAsmStmt(GCCAsmStmt *S) { 314 VisitAsmStmt(S); 315 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 316 S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 317 318 unsigned NumOutputs = S->getNumOutputs(); 319 unsigned NumInputs = S->getNumInputs(); 320 unsigned NumClobbers = S->getNumClobbers(); 321 322 // Outputs and inputs 323 SmallVector<IdentifierInfo *, 16> Names; 324 SmallVector<StringLiteral*, 16> Constraints; 325 SmallVector<Stmt*, 16> Exprs; 326 for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) { 327 Names.push_back(Reader.GetIdentifierInfo(F, Record, Idx)); 328 Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 329 Exprs.push_back(Reader.ReadSubStmt()); 330 } 331 332 // Constraints 333 SmallVector<StringLiteral*, 16> Clobbers; 334 for (unsigned I = 0; I != NumClobbers; ++I) 335 Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt())); 336 337 S->setOutputsAndInputsAndClobbers(Reader.getContext(), 338 Names.data(), Constraints.data(), 339 Exprs.data(), NumOutputs, NumInputs, 340 Clobbers.data(), NumClobbers); 341 } 342 343 void ASTStmtReader::VisitMSAsmStmt(MSAsmStmt *S) { 344 VisitAsmStmt(S); 345 S->LBraceLoc = ReadSourceLocation(Record, Idx); 346 S->EndLoc = ReadSourceLocation(Record, Idx); 347 S->NumAsmToks = Record[Idx++]; 348 std::string AsmStr = ReadString(Record, Idx); 349 350 // Read the tokens. 351 SmallVector<Token, 16> AsmToks; 352 AsmToks.reserve(S->NumAsmToks); 353 for (unsigned i = 0, e = S->NumAsmToks; i != e; ++i) { 354 AsmToks.push_back(ReadToken(Record, Idx)); 355 } 356 357 // The calls to reserve() for the FooData vectors are mandatory to 358 // prevent dead StringRefs in the Foo vectors. 359 360 // Read the clobbers. 361 SmallVector<std::string, 16> ClobbersData; 362 SmallVector<StringRef, 16> Clobbers; 363 ClobbersData.reserve(S->NumClobbers); 364 Clobbers.reserve(S->NumClobbers); 365 for (unsigned i = 0, e = S->NumClobbers; i != e; ++i) { 366 ClobbersData.push_back(ReadString(Record, Idx)); 367 Clobbers.push_back(ClobbersData.back()); 368 } 369 370 // Read the operands. 371 unsigned NumOperands = S->NumOutputs + S->NumInputs; 372 SmallVector<Expr*, 16> Exprs; 373 SmallVector<std::string, 16> ConstraintsData; 374 SmallVector<StringRef, 16> Constraints; 375 Exprs.reserve(NumOperands); 376 ConstraintsData.reserve(NumOperands); 377 Constraints.reserve(NumOperands); 378 for (unsigned i = 0; i != NumOperands; ++i) { 379 Exprs.push_back(cast<Expr>(Reader.ReadSubStmt())); 380 ConstraintsData.push_back(ReadString(Record, Idx)); 381 Constraints.push_back(ConstraintsData.back()); 382 } 383 384 S->initialize(Reader.getContext(), AsmStr, AsmToks, 385 Constraints, Exprs, Clobbers); 386 } 387 388 void ASTStmtReader::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) { 389 // FIXME: Implement coroutine serialization. 390 llvm_unreachable("unimplemented"); 391 } 392 393 void ASTStmtReader::VisitCoreturnStmt(CoreturnStmt *S) { 394 // FIXME: Implement coroutine serialization. 395 llvm_unreachable("unimplemented"); 396 } 397 398 void ASTStmtReader::VisitCoawaitExpr(CoawaitExpr *S) { 399 // FIXME: Implement coroutine serialization. 400 llvm_unreachable("unimplemented"); 401 } 402 403 void ASTStmtReader::VisitCoyieldExpr(CoyieldExpr *S) { 404 // FIXME: Implement coroutine serialization. 405 llvm_unreachable("unimplemented"); 406 } 407 408 void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) { 409 VisitStmt(S); 410 ++Idx; 411 S->setCapturedDecl(ReadDeclAs<CapturedDecl>(Record, Idx)); 412 S->setCapturedRegionKind(static_cast<CapturedRegionKind>(Record[Idx++])); 413 S->setCapturedRecordDecl(ReadDeclAs<RecordDecl>(Record, Idx)); 414 415 // Capture inits 416 for (CapturedStmt::capture_init_iterator I = S->capture_init_begin(), 417 E = S->capture_init_end(); 418 I != E; ++I) 419 *I = Reader.ReadSubExpr(); 420 421 // Body 422 S->setCapturedStmt(Reader.ReadSubStmt()); 423 S->getCapturedDecl()->setBody(S->getCapturedStmt()); 424 425 // Captures 426 for (auto &I : S->captures()) { 427 I.VarAndKind.setPointer(ReadDeclAs<VarDecl>(Record, Idx)); 428 I.VarAndKind 429 .setInt(static_cast<CapturedStmt::VariableCaptureKind>(Record[Idx++])); 430 I.Loc = ReadSourceLocation(Record, Idx); 431 } 432 } 433 434 void ASTStmtReader::VisitExpr(Expr *E) { 435 VisitStmt(E); 436 E->setType(Reader.readType(F, Record, Idx)); 437 E->setTypeDependent(Record[Idx++]); 438 E->setValueDependent(Record[Idx++]); 439 E->setInstantiationDependent(Record[Idx++]); 440 E->ExprBits.ContainsUnexpandedParameterPack = Record[Idx++]; 441 E->setValueKind(static_cast<ExprValueKind>(Record[Idx++])); 442 E->setObjectKind(static_cast<ExprObjectKind>(Record[Idx++])); 443 assert(Idx == NumExprFields && "Incorrect expression field count"); 444 } 445 446 void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) { 447 VisitExpr(E); 448 E->setLocation(ReadSourceLocation(Record, Idx)); 449 E->Type = (PredefinedExpr::IdentType)Record[Idx++]; 450 E->FnName = cast_or_null<StringLiteral>(Reader.ReadSubExpr()); 451 } 452 453 void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) { 454 VisitExpr(E); 455 456 E->DeclRefExprBits.HasQualifier = Record[Idx++]; 457 E->DeclRefExprBits.HasFoundDecl = Record[Idx++]; 458 E->DeclRefExprBits.HasTemplateKWAndArgsInfo = Record[Idx++]; 459 E->DeclRefExprBits.HadMultipleCandidates = Record[Idx++]; 460 E->DeclRefExprBits.RefersToEnclosingVariableOrCapture = Record[Idx++]; 461 unsigned NumTemplateArgs = 0; 462 if (E->hasTemplateKWAndArgsInfo()) 463 NumTemplateArgs = Record[Idx++]; 464 465 if (E->hasQualifier()) 466 new (E->getTrailingObjects<NestedNameSpecifierLoc>()) 467 NestedNameSpecifierLoc( 468 Reader.ReadNestedNameSpecifierLoc(F, Record, Idx)); 469 470 if (E->hasFoundDecl()) 471 *E->getTrailingObjects<NamedDecl *>() = ReadDeclAs<NamedDecl>(Record, Idx); 472 473 if (E->hasTemplateKWAndArgsInfo()) 474 ReadTemplateKWAndArgsInfo( 475 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), 476 E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs); 477 478 E->setDecl(ReadDeclAs<ValueDecl>(Record, Idx)); 479 E->setLocation(ReadSourceLocation(Record, Idx)); 480 ReadDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record, Idx); 481 } 482 483 void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) { 484 VisitExpr(E); 485 E->setLocation(ReadSourceLocation(Record, Idx)); 486 E->setValue(Reader.getContext(), Reader.ReadAPInt(Record, Idx)); 487 } 488 489 void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) { 490 VisitExpr(E); 491 E->setRawSemantics(static_cast<Stmt::APFloatSemantics>(Record[Idx++])); 492 E->setExact(Record[Idx++]); 493 E->setValue(Reader.getContext(), 494 Reader.ReadAPFloat(Record, E->getSemantics(), Idx)); 495 E->setLocation(ReadSourceLocation(Record, Idx)); 496 } 497 498 void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) { 499 VisitExpr(E); 500 E->setSubExpr(Reader.ReadSubExpr()); 501 } 502 503 void ASTStmtReader::VisitStringLiteral(StringLiteral *E) { 504 VisitExpr(E); 505 unsigned Len = Record[Idx++]; 506 assert(Record[Idx] == E->getNumConcatenated() && 507 "Wrong number of concatenated tokens!"); 508 ++Idx; 509 StringLiteral::StringKind kind = 510 static_cast<StringLiteral::StringKind>(Record[Idx++]); 511 bool isPascal = Record[Idx++]; 512 513 // Read string data 514 SmallString<16> Str(&Record[Idx], &Record[Idx] + Len); 515 E->setString(Reader.getContext(), Str, kind, isPascal); 516 Idx += Len; 517 518 // Read source locations 519 for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I) 520 E->setStrTokenLoc(I, ReadSourceLocation(Record, Idx)); 521 } 522 523 void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) { 524 VisitExpr(E); 525 E->setValue(Record[Idx++]); 526 E->setLocation(ReadSourceLocation(Record, Idx)); 527 E->setKind(static_cast<CharacterLiteral::CharacterKind>(Record[Idx++])); 528 } 529 530 void ASTStmtReader::VisitParenExpr(ParenExpr *E) { 531 VisitExpr(E); 532 E->setLParen(ReadSourceLocation(Record, Idx)); 533 E->setRParen(ReadSourceLocation(Record, Idx)); 534 E->setSubExpr(Reader.ReadSubExpr()); 535 } 536 537 void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) { 538 VisitExpr(E); 539 unsigned NumExprs = Record[Idx++]; 540 E->Exprs = new (Reader.getContext()) Stmt*[NumExprs]; 541 for (unsigned i = 0; i != NumExprs; ++i) 542 E->Exprs[i] = Reader.ReadSubStmt(); 543 E->NumExprs = NumExprs; 544 E->LParenLoc = ReadSourceLocation(Record, Idx); 545 E->RParenLoc = ReadSourceLocation(Record, Idx); 546 } 547 548 void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) { 549 VisitExpr(E); 550 E->setSubExpr(Reader.ReadSubExpr()); 551 E->setOpcode((UnaryOperator::Opcode)Record[Idx++]); 552 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 553 } 554 555 void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) { 556 VisitExpr(E); 557 assert(E->getNumComponents() == Record[Idx]); 558 ++Idx; 559 assert(E->getNumExpressions() == Record[Idx]); 560 ++Idx; 561 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 562 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 563 E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 564 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 565 OffsetOfNode::Kind Kind = static_cast<OffsetOfNode::Kind>(Record[Idx++]); 566 SourceLocation Start = ReadSourceLocation(Record, Idx); 567 SourceLocation End = ReadSourceLocation(Record, Idx); 568 switch (Kind) { 569 case OffsetOfNode::Array: 570 E->setComponent(I, OffsetOfNode(Start, Record[Idx++], End)); 571 break; 572 573 case OffsetOfNode::Field: 574 E->setComponent( 575 I, OffsetOfNode(Start, ReadDeclAs<FieldDecl>(Record, Idx), End)); 576 break; 577 578 case OffsetOfNode::Identifier: 579 E->setComponent( 580 I, 581 OffsetOfNode(Start, Reader.GetIdentifierInfo(F, Record, Idx), End)); 582 break; 583 584 case OffsetOfNode::Base: { 585 CXXBaseSpecifier *Base = new (Reader.getContext()) CXXBaseSpecifier(); 586 *Base = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 587 E->setComponent(I, OffsetOfNode(Base)); 588 break; 589 } 590 } 591 } 592 593 for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I) 594 E->setIndexExpr(I, Reader.ReadSubExpr()); 595 } 596 597 void ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) { 598 VisitExpr(E); 599 E->setKind(static_cast<UnaryExprOrTypeTrait>(Record[Idx++])); 600 if (Record[Idx] == 0) { 601 E->setArgument(Reader.ReadSubExpr()); 602 ++Idx; 603 } else { 604 E->setArgument(GetTypeSourceInfo(Record, Idx)); 605 } 606 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 607 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 608 } 609 610 void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 611 VisitExpr(E); 612 E->setLHS(Reader.ReadSubExpr()); 613 E->setRHS(Reader.ReadSubExpr()); 614 E->setRBracketLoc(ReadSourceLocation(Record, Idx)); 615 } 616 617 void ASTStmtReader::VisitOMPArraySectionExpr(OMPArraySectionExpr *E) { 618 VisitExpr(E); 619 E->setBase(Reader.ReadSubExpr()); 620 E->setLowerBound(Reader.ReadSubExpr()); 621 E->setLength(Reader.ReadSubExpr()); 622 E->setColonLoc(ReadSourceLocation(Record, Idx)); 623 E->setRBracketLoc(ReadSourceLocation(Record, Idx)); 624 } 625 626 void ASTStmtReader::VisitCallExpr(CallExpr *E) { 627 VisitExpr(E); 628 E->setNumArgs(Reader.getContext(), Record[Idx++]); 629 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 630 E->setCallee(Reader.ReadSubExpr()); 631 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 632 E->setArg(I, Reader.ReadSubExpr()); 633 } 634 635 void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) { 636 VisitCallExpr(E); 637 } 638 639 void ASTStmtReader::VisitMemberExpr(MemberExpr *E) { 640 // Don't call VisitExpr, this is fully initialized at creation. 641 assert(E->getStmtClass() == Stmt::MemberExprClass && 642 "It's a subclass, we must advance Idx!"); 643 } 644 645 void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) { 646 VisitExpr(E); 647 E->setBase(Reader.ReadSubExpr()); 648 E->setIsaMemberLoc(ReadSourceLocation(Record, Idx)); 649 E->setOpLoc(ReadSourceLocation(Record, Idx)); 650 E->setArrow(Record[Idx++]); 651 } 652 653 void ASTStmtReader:: 654 VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 655 VisitExpr(E); 656 E->Operand = Reader.ReadSubExpr(); 657 E->setShouldCopy(Record[Idx++]); 658 } 659 660 void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 661 VisitExplicitCastExpr(E); 662 E->LParenLoc = ReadSourceLocation(Record, Idx); 663 E->BridgeKeywordLoc = ReadSourceLocation(Record, Idx); 664 E->Kind = Record[Idx++]; 665 } 666 667 void ASTStmtReader::VisitCastExpr(CastExpr *E) { 668 VisitExpr(E); 669 unsigned NumBaseSpecs = Record[Idx++]; 670 assert(NumBaseSpecs == E->path_size()); 671 E->setSubExpr(Reader.ReadSubExpr()); 672 E->setCastKind((CastKind)Record[Idx++]); 673 CastExpr::path_iterator BaseI = E->path_begin(); 674 while (NumBaseSpecs--) { 675 CXXBaseSpecifier *BaseSpec = new (Reader.getContext()) CXXBaseSpecifier; 676 *BaseSpec = Reader.ReadCXXBaseSpecifier(F, Record, Idx); 677 *BaseI++ = BaseSpec; 678 } 679 } 680 681 void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) { 682 VisitExpr(E); 683 E->setLHS(Reader.ReadSubExpr()); 684 E->setRHS(Reader.ReadSubExpr()); 685 E->setOpcode((BinaryOperator::Opcode)Record[Idx++]); 686 E->setOperatorLoc(ReadSourceLocation(Record, Idx)); 687 E->setFPContractable((bool)Record[Idx++]); 688 } 689 690 void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) { 691 VisitBinaryOperator(E); 692 E->setComputationLHSType(Reader.readType(F, Record, Idx)); 693 E->setComputationResultType(Reader.readType(F, Record, Idx)); 694 } 695 696 void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) { 697 VisitExpr(E); 698 E->SubExprs[ConditionalOperator::COND] = Reader.ReadSubExpr(); 699 E->SubExprs[ConditionalOperator::LHS] = Reader.ReadSubExpr(); 700 E->SubExprs[ConditionalOperator::RHS] = Reader.ReadSubExpr(); 701 E->QuestionLoc = ReadSourceLocation(Record, Idx); 702 E->ColonLoc = ReadSourceLocation(Record, Idx); 703 } 704 705 void 706 ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) { 707 VisitExpr(E); 708 E->OpaqueValue = cast<OpaqueValueExpr>(Reader.ReadSubExpr()); 709 E->SubExprs[BinaryConditionalOperator::COMMON] = Reader.ReadSubExpr(); 710 E->SubExprs[BinaryConditionalOperator::COND] = Reader.ReadSubExpr(); 711 E->SubExprs[BinaryConditionalOperator::LHS] = Reader.ReadSubExpr(); 712 E->SubExprs[BinaryConditionalOperator::RHS] = Reader.ReadSubExpr(); 713 E->QuestionLoc = ReadSourceLocation(Record, Idx); 714 E->ColonLoc = ReadSourceLocation(Record, Idx); 715 } 716 717 void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) { 718 VisitCastExpr(E); 719 } 720 721 void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) { 722 VisitCastExpr(E); 723 E->setTypeInfoAsWritten(GetTypeSourceInfo(Record, Idx)); 724 } 725 726 void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) { 727 VisitExplicitCastExpr(E); 728 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 729 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 730 } 731 732 void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { 733 VisitExpr(E); 734 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 735 E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 736 E->setInitializer(Reader.ReadSubExpr()); 737 E->setFileScope(Record[Idx++]); 738 } 739 740 void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) { 741 VisitExpr(E); 742 E->setBase(Reader.ReadSubExpr()); 743 E->setAccessor(Reader.GetIdentifierInfo(F, Record, Idx)); 744 E->setAccessorLoc(ReadSourceLocation(Record, Idx)); 745 } 746 747 void ASTStmtReader::VisitInitListExpr(InitListExpr *E) { 748 VisitExpr(E); 749 if (InitListExpr *SyntForm = cast_or_null<InitListExpr>(Reader.ReadSubStmt())) 750 E->setSyntacticForm(SyntForm); 751 E->setLBraceLoc(ReadSourceLocation(Record, Idx)); 752 E->setRBraceLoc(ReadSourceLocation(Record, Idx)); 753 bool isArrayFiller = Record[Idx++]; 754 Expr *filler = nullptr; 755 if (isArrayFiller) { 756 filler = Reader.ReadSubExpr(); 757 E->ArrayFillerOrUnionFieldInit = filler; 758 } else 759 E->ArrayFillerOrUnionFieldInit = ReadDeclAs<FieldDecl>(Record, Idx); 760 E->sawArrayRangeDesignator(Record[Idx++]); 761 unsigned NumInits = Record[Idx++]; 762 E->reserveInits(Reader.getContext(), NumInits); 763 if (isArrayFiller) { 764 for (unsigned I = 0; I != NumInits; ++I) { 765 Expr *init = Reader.ReadSubExpr(); 766 E->updateInit(Reader.getContext(), I, init ? init : filler); 767 } 768 } else { 769 for (unsigned I = 0; I != NumInits; ++I) 770 E->updateInit(Reader.getContext(), I, Reader.ReadSubExpr()); 771 } 772 } 773 774 void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) { 775 typedef DesignatedInitExpr::Designator Designator; 776 777 VisitExpr(E); 778 unsigned NumSubExprs = Record[Idx++]; 779 assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs"); 780 for (unsigned I = 0; I != NumSubExprs; ++I) 781 E->setSubExpr(I, Reader.ReadSubExpr()); 782 E->setEqualOrColonLoc(ReadSourceLocation(Record, Idx)); 783 E->setGNUSyntax(Record[Idx++]); 784 785 SmallVector<Designator, 4> Designators; 786 while (Idx < Record.size()) { 787 switch ((DesignatorTypes)Record[Idx++]) { 788 case DESIG_FIELD_DECL: { 789 FieldDecl *Field = ReadDeclAs<FieldDecl>(Record, Idx); 790 SourceLocation DotLoc 791 = ReadSourceLocation(Record, Idx); 792 SourceLocation FieldLoc 793 = ReadSourceLocation(Record, Idx); 794 Designators.push_back(Designator(Field->getIdentifier(), DotLoc, 795 FieldLoc)); 796 Designators.back().setField(Field); 797 break; 798 } 799 800 case DESIG_FIELD_NAME: { 801 const IdentifierInfo *Name = Reader.GetIdentifierInfo(F, Record, Idx); 802 SourceLocation DotLoc 803 = ReadSourceLocation(Record, Idx); 804 SourceLocation FieldLoc 805 = ReadSourceLocation(Record, Idx); 806 Designators.push_back(Designator(Name, DotLoc, FieldLoc)); 807 break; 808 } 809 810 case DESIG_ARRAY: { 811 unsigned Index = Record[Idx++]; 812 SourceLocation LBracketLoc 813 = ReadSourceLocation(Record, Idx); 814 SourceLocation RBracketLoc 815 = ReadSourceLocation(Record, Idx); 816 Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc)); 817 break; 818 } 819 820 case DESIG_ARRAY_RANGE: { 821 unsigned Index = Record[Idx++]; 822 SourceLocation LBracketLoc 823 = ReadSourceLocation(Record, Idx); 824 SourceLocation EllipsisLoc 825 = ReadSourceLocation(Record, Idx); 826 SourceLocation RBracketLoc 827 = ReadSourceLocation(Record, Idx); 828 Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc, 829 RBracketLoc)); 830 break; 831 } 832 } 833 } 834 E->setDesignators(Reader.getContext(), 835 Designators.data(), Designators.size()); 836 } 837 838 void ASTStmtReader::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) { 839 VisitExpr(E); 840 E->setBase(Reader.ReadSubExpr()); 841 E->setUpdater(Reader.ReadSubExpr()); 842 } 843 844 void ASTStmtReader::VisitNoInitExpr(NoInitExpr *E) { 845 VisitExpr(E); 846 } 847 848 void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { 849 VisitExpr(E); 850 } 851 852 void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) { 853 VisitExpr(E); 854 E->setSubExpr(Reader.ReadSubExpr()); 855 E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx)); 856 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 857 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 858 E->setIsMicrosoftABI(Record[Idx++]); 859 } 860 861 void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) { 862 VisitExpr(E); 863 E->setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 864 E->setLabelLoc(ReadSourceLocation(Record, Idx)); 865 E->setLabel(ReadDeclAs<LabelDecl>(Record, Idx)); 866 } 867 868 void ASTStmtReader::VisitStmtExpr(StmtExpr *E) { 869 VisitExpr(E); 870 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 871 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 872 E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt())); 873 } 874 875 void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) { 876 VisitExpr(E); 877 E->setCond(Reader.ReadSubExpr()); 878 E->setLHS(Reader.ReadSubExpr()); 879 E->setRHS(Reader.ReadSubExpr()); 880 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 881 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 882 E->setIsConditionTrue(Record[Idx++]); 883 } 884 885 void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) { 886 VisitExpr(E); 887 E->setTokenLocation(ReadSourceLocation(Record, Idx)); 888 } 889 890 void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) { 891 VisitExpr(E); 892 SmallVector<Expr *, 16> Exprs; 893 unsigned NumExprs = Record[Idx++]; 894 while (NumExprs--) 895 Exprs.push_back(Reader.ReadSubExpr()); 896 E->setExprs(Reader.getContext(), Exprs); 897 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 898 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 899 } 900 901 void ASTStmtReader::VisitConvertVectorExpr(ConvertVectorExpr *E) { 902 VisitExpr(E); 903 E->BuiltinLoc = ReadSourceLocation(Record, Idx); 904 E->RParenLoc = ReadSourceLocation(Record, Idx); 905 E->TInfo = GetTypeSourceInfo(Record, Idx); 906 E->SrcExpr = Reader.ReadSubExpr(); 907 } 908 909 void ASTStmtReader::VisitBlockExpr(BlockExpr *E) { 910 VisitExpr(E); 911 E->setBlockDecl(ReadDeclAs<BlockDecl>(Record, Idx)); 912 } 913 914 void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) { 915 VisitExpr(E); 916 E->NumAssocs = Record[Idx++]; 917 E->AssocTypes = new (Reader.getContext()) TypeSourceInfo*[E->NumAssocs]; 918 E->SubExprs = 919 new(Reader.getContext()) Stmt*[GenericSelectionExpr::END_EXPR+E->NumAssocs]; 920 921 E->SubExprs[GenericSelectionExpr::CONTROLLING] = Reader.ReadSubExpr(); 922 for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) { 923 E->AssocTypes[I] = GetTypeSourceInfo(Record, Idx); 924 E->SubExprs[GenericSelectionExpr::END_EXPR+I] = Reader.ReadSubExpr(); 925 } 926 E->ResultIndex = Record[Idx++]; 927 928 E->GenericLoc = ReadSourceLocation(Record, Idx); 929 E->DefaultLoc = ReadSourceLocation(Record, Idx); 930 E->RParenLoc = ReadSourceLocation(Record, Idx); 931 } 932 933 void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) { 934 VisitExpr(E); 935 unsigned numSemanticExprs = Record[Idx++]; 936 assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs); 937 E->PseudoObjectExprBits.ResultIndex = Record[Idx++]; 938 939 // Read the syntactic expression. 940 E->getSubExprsBuffer()[0] = Reader.ReadSubExpr(); 941 942 // Read all the semantic expressions. 943 for (unsigned i = 0; i != numSemanticExprs; ++i) { 944 Expr *subExpr = Reader.ReadSubExpr(); 945 E->getSubExprsBuffer()[i+1] = subExpr; 946 } 947 } 948 949 void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) { 950 VisitExpr(E); 951 E->Op = AtomicExpr::AtomicOp(Record[Idx++]); 952 E->NumSubExprs = AtomicExpr::getNumSubExprs(E->Op); 953 for (unsigned I = 0; I != E->NumSubExprs; ++I) 954 E->SubExprs[I] = Reader.ReadSubExpr(); 955 E->BuiltinLoc = ReadSourceLocation(Record, Idx); 956 E->RParenLoc = ReadSourceLocation(Record, Idx); 957 } 958 959 //===----------------------------------------------------------------------===// 960 // Objective-C Expressions and Statements 961 962 void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) { 963 VisitExpr(E); 964 E->setString(cast<StringLiteral>(Reader.ReadSubStmt())); 965 E->setAtLoc(ReadSourceLocation(Record, Idx)); 966 } 967 968 void ASTStmtReader::VisitObjCBoxedExpr(ObjCBoxedExpr *E) { 969 VisitExpr(E); 970 // could be one of several IntegerLiteral, FloatLiteral, etc. 971 E->SubExpr = Reader.ReadSubStmt(); 972 E->BoxingMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 973 E->Range = ReadSourceRange(Record, Idx); 974 } 975 976 void ASTStmtReader::VisitObjCArrayLiteral(ObjCArrayLiteral *E) { 977 VisitExpr(E); 978 unsigned NumElements = Record[Idx++]; 979 assert(NumElements == E->getNumElements() && "Wrong number of elements"); 980 Expr **Elements = E->getElements(); 981 for (unsigned I = 0, N = NumElements; I != N; ++I) 982 Elements[I] = Reader.ReadSubExpr(); 983 E->ArrayWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 984 E->Range = ReadSourceRange(Record, Idx); 985 } 986 987 void ASTStmtReader::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) { 988 VisitExpr(E); 989 unsigned NumElements = Record[Idx++]; 990 assert(NumElements == E->getNumElements() && "Wrong number of elements"); 991 bool HasPackExpansions = Record[Idx++]; 992 assert(HasPackExpansions == E->HasPackExpansions &&"Pack expansion mismatch"); 993 ObjCDictionaryLiteral::KeyValuePair *KeyValues = 994 E->getTrailingObjects<ObjCDictionaryLiteral::KeyValuePair>(); 995 ObjCDictionaryLiteral::ExpansionData *Expansions = 996 E->getTrailingObjects<ObjCDictionaryLiteral::ExpansionData>(); 997 for (unsigned I = 0; I != NumElements; ++I) { 998 KeyValues[I].Key = Reader.ReadSubExpr(); 999 KeyValues[I].Value = Reader.ReadSubExpr(); 1000 if (HasPackExpansions) { 1001 Expansions[I].EllipsisLoc = ReadSourceLocation(Record, Idx); 1002 Expansions[I].NumExpansionsPlusOne = Record[Idx++]; 1003 } 1004 } 1005 E->DictWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 1006 E->Range = ReadSourceRange(Record, Idx); 1007 } 1008 1009 void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) { 1010 VisitExpr(E); 1011 E->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 1012 E->setAtLoc(ReadSourceLocation(Record, Idx)); 1013 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1014 } 1015 1016 void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) { 1017 VisitExpr(E); 1018 E->setSelector(Reader.ReadSelector(F, Record, Idx)); 1019 E->setAtLoc(ReadSourceLocation(Record, Idx)); 1020 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1021 } 1022 1023 void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { 1024 VisitExpr(E); 1025 E->setProtocol(ReadDeclAs<ObjCProtocolDecl>(Record, Idx)); 1026 E->setAtLoc(ReadSourceLocation(Record, Idx)); 1027 E->ProtoLoc = ReadSourceLocation(Record, Idx); 1028 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1029 } 1030 1031 void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { 1032 VisitExpr(E); 1033 E->setDecl(ReadDeclAs<ObjCIvarDecl>(Record, Idx)); 1034 E->setLocation(ReadSourceLocation(Record, Idx)); 1035 E->setOpLoc(ReadSourceLocation(Record, Idx)); 1036 E->setBase(Reader.ReadSubExpr()); 1037 E->setIsArrow(Record[Idx++]); 1038 E->setIsFreeIvar(Record[Idx++]); 1039 } 1040 1041 void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 1042 VisitExpr(E); 1043 unsigned MethodRefFlags = Record[Idx++]; 1044 bool Implicit = Record[Idx++] != 0; 1045 if (Implicit) { 1046 ObjCMethodDecl *Getter = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 1047 ObjCMethodDecl *Setter = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 1048 E->setImplicitProperty(Getter, Setter, MethodRefFlags); 1049 } else { 1050 E->setExplicitProperty(ReadDeclAs<ObjCPropertyDecl>(Record, Idx), 1051 MethodRefFlags); 1052 } 1053 E->setLocation(ReadSourceLocation(Record, Idx)); 1054 E->setReceiverLocation(ReadSourceLocation(Record, Idx)); 1055 switch (Record[Idx++]) { 1056 case 0: 1057 E->setBase(Reader.ReadSubExpr()); 1058 break; 1059 case 1: 1060 E->setSuperReceiver(Reader.readType(F, Record, Idx)); 1061 break; 1062 case 2: 1063 E->setClassReceiver(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx)); 1064 break; 1065 } 1066 } 1067 1068 void ASTStmtReader::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 1069 VisitExpr(E); 1070 E->setRBracket(ReadSourceLocation(Record, Idx)); 1071 E->setBaseExpr(Reader.ReadSubExpr()); 1072 E->setKeyExpr(Reader.ReadSubExpr()); 1073 E->GetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 1074 E->SetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 1075 } 1076 1077 void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) { 1078 VisitExpr(E); 1079 assert(Record[Idx] == E->getNumArgs()); 1080 ++Idx; 1081 unsigned NumStoredSelLocs = Record[Idx++]; 1082 E->SelLocsKind = Record[Idx++]; 1083 E->setDelegateInitCall(Record[Idx++]); 1084 E->IsImplicit = Record[Idx++]; 1085 ObjCMessageExpr::ReceiverKind Kind 1086 = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]); 1087 switch (Kind) { 1088 case ObjCMessageExpr::Instance: 1089 E->setInstanceReceiver(Reader.ReadSubExpr()); 1090 break; 1091 1092 case ObjCMessageExpr::Class: 1093 E->setClassReceiver(GetTypeSourceInfo(Record, Idx)); 1094 break; 1095 1096 case ObjCMessageExpr::SuperClass: 1097 case ObjCMessageExpr::SuperInstance: { 1098 QualType T = Reader.readType(F, Record, Idx); 1099 SourceLocation SuperLoc = ReadSourceLocation(Record, Idx); 1100 E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance); 1101 break; 1102 } 1103 } 1104 1105 assert(Kind == E->getReceiverKind()); 1106 1107 if (Record[Idx++]) 1108 E->setMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx)); 1109 else 1110 E->setSelector(Reader.ReadSelector(F, Record, Idx)); 1111 1112 E->LBracLoc = ReadSourceLocation(Record, Idx); 1113 E->RBracLoc = ReadSourceLocation(Record, Idx); 1114 1115 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 1116 E->setArg(I, Reader.ReadSubExpr()); 1117 1118 SourceLocation *Locs = E->getStoredSelLocs(); 1119 for (unsigned I = 0; I != NumStoredSelLocs; ++I) 1120 Locs[I] = ReadSourceLocation(Record, Idx); 1121 } 1122 1123 void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { 1124 VisitStmt(S); 1125 S->setElement(Reader.ReadSubStmt()); 1126 S->setCollection(Reader.ReadSubExpr()); 1127 S->setBody(Reader.ReadSubStmt()); 1128 S->setForLoc(ReadSourceLocation(Record, Idx)); 1129 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 1130 } 1131 1132 void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { 1133 VisitStmt(S); 1134 S->setCatchBody(Reader.ReadSubStmt()); 1135 S->setCatchParamDecl(ReadDeclAs<VarDecl>(Record, Idx)); 1136 S->setAtCatchLoc(ReadSourceLocation(Record, Idx)); 1137 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 1138 } 1139 1140 void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 1141 VisitStmt(S); 1142 S->setFinallyBody(Reader.ReadSubStmt()); 1143 S->setAtFinallyLoc(ReadSourceLocation(Record, Idx)); 1144 } 1145 1146 void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) { 1147 VisitStmt(S); 1148 S->setSubStmt(Reader.ReadSubStmt()); 1149 S->setAtLoc(ReadSourceLocation(Record, Idx)); 1150 } 1151 1152 void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { 1153 VisitStmt(S); 1154 assert(Record[Idx] == S->getNumCatchStmts()); 1155 ++Idx; 1156 bool HasFinally = Record[Idx++]; 1157 S->setTryBody(Reader.ReadSubStmt()); 1158 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) 1159 S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt())); 1160 1161 if (HasFinally) 1162 S->setFinallyStmt(Reader.ReadSubStmt()); 1163 S->setAtTryLoc(ReadSourceLocation(Record, Idx)); 1164 } 1165 1166 void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) { 1167 VisitStmt(S); 1168 S->setSynchExpr(Reader.ReadSubStmt()); 1169 S->setSynchBody(Reader.ReadSubStmt()); 1170 S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx)); 1171 } 1172 1173 void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { 1174 VisitStmt(S); 1175 S->setThrowExpr(Reader.ReadSubStmt()); 1176 S->setThrowLoc(ReadSourceLocation(Record, Idx)); 1177 } 1178 1179 void ASTStmtReader::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 1180 VisitExpr(E); 1181 E->setValue(Record[Idx++]); 1182 E->setLocation(ReadSourceLocation(Record, Idx)); 1183 } 1184 1185 void ASTStmtReader::VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr *E) { 1186 VisitExpr(E); 1187 SourceRange R = Reader.ReadSourceRange(F, Record, Idx); 1188 E->AtLoc = R.getBegin(); 1189 E->RParen = R.getEnd(); 1190 E->VersionToCheck = Reader.ReadVersionTuple(Record, Idx); 1191 } 1192 1193 //===----------------------------------------------------------------------===// 1194 // C++ Expressions and Statements 1195 //===----------------------------------------------------------------------===// 1196 1197 void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) { 1198 VisitStmt(S); 1199 S->CatchLoc = ReadSourceLocation(Record, Idx); 1200 S->ExceptionDecl = ReadDeclAs<VarDecl>(Record, Idx); 1201 S->HandlerBlock = Reader.ReadSubStmt(); 1202 } 1203 1204 void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) { 1205 VisitStmt(S); 1206 assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?"); 1207 ++Idx; 1208 S->TryLoc = ReadSourceLocation(Record, Idx); 1209 S->getStmts()[0] = Reader.ReadSubStmt(); 1210 for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i) 1211 S->getStmts()[i + 1] = Reader.ReadSubStmt(); 1212 } 1213 1214 void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) { 1215 VisitStmt(S); 1216 S->ForLoc = ReadSourceLocation(Record, Idx); 1217 S->CoawaitLoc = ReadSourceLocation(Record, Idx); 1218 S->ColonLoc = ReadSourceLocation(Record, Idx); 1219 S->RParenLoc = ReadSourceLocation(Record, Idx); 1220 S->setRangeStmt(Reader.ReadSubStmt()); 1221 S->setBeginStmt(Reader.ReadSubStmt()); 1222 S->setEndStmt(Reader.ReadSubStmt()); 1223 S->setCond(Reader.ReadSubExpr()); 1224 S->setInc(Reader.ReadSubExpr()); 1225 S->setLoopVarStmt(Reader.ReadSubStmt()); 1226 S->setBody(Reader.ReadSubStmt()); 1227 } 1228 1229 void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) { 1230 VisitStmt(S); 1231 S->KeywordLoc = ReadSourceLocation(Record, Idx); 1232 S->IsIfExists = Record[Idx++]; 1233 S->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1234 ReadDeclarationNameInfo(S->NameInfo, Record, Idx); 1235 S->SubStmt = Reader.ReadSubStmt(); 1236 } 1237 1238 void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 1239 VisitCallExpr(E); 1240 E->Operator = (OverloadedOperatorKind)Record[Idx++]; 1241 E->Range = Reader.ReadSourceRange(F, Record, Idx); 1242 E->setFPContractable((bool)Record[Idx++]); 1243 } 1244 1245 void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) { 1246 VisitExpr(E); 1247 E->NumArgs = Record[Idx++]; 1248 if (E->NumArgs) 1249 E->Args = new (Reader.getContext()) Stmt*[E->NumArgs]; 1250 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 1251 E->setArg(I, Reader.ReadSubExpr()); 1252 E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx)); 1253 E->setLocation(ReadSourceLocation(Record, Idx)); 1254 E->setElidable(Record[Idx++]); 1255 E->setHadMultipleCandidates(Record[Idx++]); 1256 E->setListInitialization(Record[Idx++]); 1257 E->setStdInitListInitialization(Record[Idx++]); 1258 E->setRequiresZeroInitialization(Record[Idx++]); 1259 E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]); 1260 E->ParenOrBraceRange = ReadSourceRange(Record, Idx); 1261 } 1262 1263 void ASTStmtReader::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) { 1264 VisitExpr(E); 1265 E->Constructor = ReadDeclAs<CXXConstructorDecl>(Record, Idx); 1266 E->Loc = ReadSourceLocation(Record, Idx); 1267 E->ConstructsVirtualBase = Record[Idx++]; 1268 E->InheritedFromVirtualBase = Record[Idx++]; 1269 } 1270 1271 void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) { 1272 VisitCXXConstructExpr(E); 1273 E->Type = GetTypeSourceInfo(Record, Idx); 1274 } 1275 1276 void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) { 1277 VisitExpr(E); 1278 unsigned NumCaptures = Record[Idx++]; 1279 assert(NumCaptures == E->NumCaptures);(void)NumCaptures; 1280 unsigned NumArrayIndexVars = Record[Idx++]; 1281 E->IntroducerRange = ReadSourceRange(Record, Idx); 1282 E->CaptureDefault = static_cast<LambdaCaptureDefault>(Record[Idx++]); 1283 E->CaptureDefaultLoc = ReadSourceLocation(Record, Idx); 1284 E->ExplicitParams = Record[Idx++]; 1285 E->ExplicitResultType = Record[Idx++]; 1286 E->ClosingBrace = ReadSourceLocation(Record, Idx); 1287 1288 // Read capture initializers. 1289 for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(), 1290 CEnd = E->capture_init_end(); 1291 C != CEnd; ++C) 1292 *C = Reader.ReadSubExpr(); 1293 1294 // Read array capture index variables. 1295 if (NumArrayIndexVars > 0) { 1296 unsigned *ArrayIndexStarts = E->getArrayIndexStarts(); 1297 for (unsigned I = 0; I != NumCaptures + 1; ++I) 1298 ArrayIndexStarts[I] = Record[Idx++]; 1299 1300 VarDecl **ArrayIndexVars = E->getArrayIndexVars(); 1301 for (unsigned I = 0; I != NumArrayIndexVars; ++I) 1302 ArrayIndexVars[I] = ReadDeclAs<VarDecl>(Record, Idx); 1303 } 1304 } 1305 1306 void 1307 ASTStmtReader::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) { 1308 VisitExpr(E); 1309 E->SubExpr = Reader.ReadSubExpr(); 1310 } 1311 1312 void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) { 1313 VisitExplicitCastExpr(E); 1314 SourceRange R = ReadSourceRange(Record, Idx); 1315 E->Loc = R.getBegin(); 1316 E->RParenLoc = R.getEnd(); 1317 R = ReadSourceRange(Record, Idx); 1318 E->AngleBrackets = R; 1319 } 1320 1321 void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) { 1322 return VisitCXXNamedCastExpr(E); 1323 } 1324 1325 void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 1326 return VisitCXXNamedCastExpr(E); 1327 } 1328 1329 void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) { 1330 return VisitCXXNamedCastExpr(E); 1331 } 1332 1333 void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) { 1334 return VisitCXXNamedCastExpr(E); 1335 } 1336 1337 void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) { 1338 VisitExplicitCastExpr(E); 1339 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 1340 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1341 } 1342 1343 void ASTStmtReader::VisitUserDefinedLiteral(UserDefinedLiteral *E) { 1344 VisitCallExpr(E); 1345 E->UDSuffixLoc = ReadSourceLocation(Record, Idx); 1346 } 1347 1348 void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 1349 VisitExpr(E); 1350 E->setValue(Record[Idx++]); 1351 E->setLocation(ReadSourceLocation(Record, Idx)); 1352 } 1353 1354 void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) { 1355 VisitExpr(E); 1356 E->setLocation(ReadSourceLocation(Record, Idx)); 1357 } 1358 1359 void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) { 1360 VisitExpr(E); 1361 E->setSourceRange(ReadSourceRange(Record, Idx)); 1362 if (E->isTypeOperand()) { // typeid(int) 1363 E->setTypeOperandSourceInfo( 1364 GetTypeSourceInfo(Record, Idx)); 1365 return; 1366 } 1367 1368 // typeid(42+2) 1369 E->setExprOperand(Reader.ReadSubExpr()); 1370 } 1371 1372 void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) { 1373 VisitExpr(E); 1374 E->setLocation(ReadSourceLocation(Record, Idx)); 1375 E->setImplicit(Record[Idx++]); 1376 } 1377 1378 void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) { 1379 VisitExpr(E); 1380 E->ThrowLoc = ReadSourceLocation(Record, Idx); 1381 E->Op = Reader.ReadSubExpr(); 1382 E->IsThrownVariableInScope = Record[Idx++]; 1383 } 1384 1385 void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 1386 VisitExpr(E); 1387 E->Param = ReadDeclAs<ParmVarDecl>(Record, Idx); 1388 E->Loc = ReadSourceLocation(Record, Idx); 1389 } 1390 1391 void ASTStmtReader::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 1392 VisitExpr(E); 1393 E->Field = ReadDeclAs<FieldDecl>(Record, Idx); 1394 E->Loc = ReadSourceLocation(Record, Idx); 1395 } 1396 1397 void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 1398 VisitExpr(E); 1399 E->setTemporary(Reader.ReadCXXTemporary(F, Record, Idx)); 1400 E->setSubExpr(Reader.ReadSubExpr()); 1401 } 1402 1403 void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { 1404 VisitExpr(E); 1405 E->TypeInfo = GetTypeSourceInfo(Record, Idx); 1406 E->RParenLoc = ReadSourceLocation(Record, Idx); 1407 } 1408 1409 void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) { 1410 VisitExpr(E); 1411 E->GlobalNew = Record[Idx++]; 1412 bool isArray = Record[Idx++]; 1413 E->PassAlignment = Record[Idx++]; 1414 E->UsualArrayDeleteWantsSize = Record[Idx++]; 1415 unsigned NumPlacementArgs = Record[Idx++]; 1416 E->StoredInitializationStyle = Record[Idx++]; 1417 E->setOperatorNew(ReadDeclAs<FunctionDecl>(Record, Idx)); 1418 E->setOperatorDelete(ReadDeclAs<FunctionDecl>(Record, Idx)); 1419 E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx); 1420 E->TypeIdParens = ReadSourceRange(Record, Idx); 1421 E->Range = ReadSourceRange(Record, Idx); 1422 E->DirectInitRange = ReadSourceRange(Record, Idx); 1423 1424 E->AllocateArgsArray(Reader.getContext(), isArray, NumPlacementArgs, 1425 E->StoredInitializationStyle != 0); 1426 1427 // Install all the subexpressions. 1428 for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end(); 1429 I != e; ++I) 1430 *I = Reader.ReadSubStmt(); 1431 } 1432 1433 void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 1434 VisitExpr(E); 1435 E->GlobalDelete = Record[Idx++]; 1436 E->ArrayForm = Record[Idx++]; 1437 E->ArrayFormAsWritten = Record[Idx++]; 1438 E->UsualArrayDeleteWantsSize = Record[Idx++]; 1439 E->OperatorDelete = ReadDeclAs<FunctionDecl>(Record, Idx); 1440 E->Argument = Reader.ReadSubExpr(); 1441 E->Loc = ReadSourceLocation(Record, Idx); 1442 } 1443 1444 void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 1445 VisitExpr(E); 1446 1447 E->Base = Reader.ReadSubExpr(); 1448 E->IsArrow = Record[Idx++]; 1449 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1450 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1451 E->ScopeType = GetTypeSourceInfo(Record, Idx); 1452 E->ColonColonLoc = ReadSourceLocation(Record, Idx); 1453 E->TildeLoc = ReadSourceLocation(Record, Idx); 1454 1455 IdentifierInfo *II = Reader.GetIdentifierInfo(F, Record, Idx); 1456 if (II) 1457 E->setDestroyedType(II, ReadSourceLocation(Record, Idx)); 1458 else 1459 E->setDestroyedType(GetTypeSourceInfo(Record, Idx)); 1460 } 1461 1462 void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) { 1463 VisitExpr(E); 1464 1465 unsigned NumObjects = Record[Idx++]; 1466 assert(NumObjects == E->getNumObjects()); 1467 for (unsigned i = 0; i != NumObjects; ++i) 1468 E->getTrailingObjects<BlockDecl *>()[i] = 1469 ReadDeclAs<BlockDecl>(Record, Idx); 1470 1471 E->ExprWithCleanupsBits.CleanupsHaveSideEffects = Record[Idx++]; 1472 E->SubExpr = Reader.ReadSubExpr(); 1473 } 1474 1475 void 1476 ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){ 1477 VisitExpr(E); 1478 1479 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 1480 ReadTemplateKWAndArgsInfo( 1481 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), 1482 E->getTrailingObjects<TemplateArgumentLoc>(), 1483 /*NumTemplateArgs=*/Record[Idx++]); 1484 1485 E->Base = Reader.ReadSubExpr(); 1486 E->BaseType = Reader.readType(F, Record, Idx); 1487 E->IsArrow = Record[Idx++]; 1488 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1489 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1490 E->FirstQualifierFoundInScope = ReadDeclAs<NamedDecl>(Record, Idx); 1491 ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx); 1492 } 1493 1494 void 1495 ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { 1496 VisitExpr(E); 1497 1498 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 1499 ReadTemplateKWAndArgsInfo( 1500 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), 1501 E->getTrailingObjects<TemplateArgumentLoc>(), 1502 /*NumTemplateArgs=*/Record[Idx++]); 1503 1504 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1505 ReadDeclarationNameInfo(E->NameInfo, Record, Idx); 1506 } 1507 1508 void 1509 ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) { 1510 VisitExpr(E); 1511 assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?"); 1512 ++Idx; // NumArgs; 1513 for (unsigned I = 0, N = E->arg_size(); I != N; ++I) 1514 E->setArg(I, Reader.ReadSubExpr()); 1515 E->Type = GetTypeSourceInfo(Record, Idx); 1516 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 1517 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1518 } 1519 1520 void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) { 1521 VisitExpr(E); 1522 1523 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 1524 ReadTemplateKWAndArgsInfo(*E->getTrailingASTTemplateKWAndArgsInfo(), 1525 E->getTrailingTemplateArgumentLoc(), 1526 /*NumTemplateArgs=*/Record[Idx++]); 1527 1528 unsigned NumDecls = Record[Idx++]; 1529 UnresolvedSet<8> Decls; 1530 for (unsigned i = 0; i != NumDecls; ++i) { 1531 NamedDecl *D = ReadDeclAs<NamedDecl>(Record, Idx); 1532 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 1533 Decls.addDecl(D, AS); 1534 } 1535 E->initializeResults(Reader.getContext(), Decls.begin(), Decls.end()); 1536 1537 ReadDeclarationNameInfo(E->NameInfo, Record, Idx); 1538 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1539 } 1540 1541 void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) { 1542 VisitOverloadExpr(E); 1543 E->IsArrow = Record[Idx++]; 1544 E->HasUnresolvedUsing = Record[Idx++]; 1545 E->Base = Reader.ReadSubExpr(); 1546 E->BaseType = Reader.readType(F, Record, Idx); 1547 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1548 } 1549 1550 void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { 1551 VisitOverloadExpr(E); 1552 E->RequiresADL = Record[Idx++]; 1553 E->Overloaded = Record[Idx++]; 1554 E->NamingClass = ReadDeclAs<CXXRecordDecl>(Record, Idx); 1555 } 1556 1557 void ASTStmtReader::VisitTypeTraitExpr(TypeTraitExpr *E) { 1558 VisitExpr(E); 1559 E->TypeTraitExprBits.NumArgs = Record[Idx++]; 1560 E->TypeTraitExprBits.Kind = Record[Idx++]; 1561 E->TypeTraitExprBits.Value = Record[Idx++]; 1562 SourceRange Range = ReadSourceRange(Record, Idx); 1563 E->Loc = Range.getBegin(); 1564 E->RParenLoc = Range.getEnd(); 1565 1566 TypeSourceInfo **Args = E->getTrailingObjects<TypeSourceInfo *>(); 1567 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 1568 Args[I] = GetTypeSourceInfo(Record, Idx); 1569 } 1570 1571 void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 1572 VisitExpr(E); 1573 E->ATT = (ArrayTypeTrait)Record[Idx++]; 1574 E->Value = (unsigned int)Record[Idx++]; 1575 SourceRange Range = ReadSourceRange(Record, Idx); 1576 E->Loc = Range.getBegin(); 1577 E->RParen = Range.getEnd(); 1578 E->QueriedType = GetTypeSourceInfo(Record, Idx); 1579 E->Dimension = Reader.ReadSubExpr(); 1580 } 1581 1582 void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 1583 VisitExpr(E); 1584 E->ET = (ExpressionTrait)Record[Idx++]; 1585 E->Value = (bool)Record[Idx++]; 1586 SourceRange Range = ReadSourceRange(Record, Idx); 1587 E->QueriedExpression = Reader.ReadSubExpr(); 1588 E->Loc = Range.getBegin(); 1589 E->RParen = Range.getEnd(); 1590 } 1591 1592 void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 1593 VisitExpr(E); 1594 E->Value = (bool)Record[Idx++]; 1595 E->Range = ReadSourceRange(Record, Idx); 1596 E->Operand = Reader.ReadSubExpr(); 1597 } 1598 1599 void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) { 1600 VisitExpr(E); 1601 E->EllipsisLoc = ReadSourceLocation(Record, Idx); 1602 E->NumExpansions = Record[Idx++]; 1603 E->Pattern = Reader.ReadSubExpr(); 1604 } 1605 1606 void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) { 1607 VisitExpr(E); 1608 unsigned NumPartialArgs = Record[Idx++]; 1609 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1610 E->PackLoc = ReadSourceLocation(Record, Idx); 1611 E->RParenLoc = ReadSourceLocation(Record, Idx); 1612 E->Pack = Reader.ReadDeclAs<NamedDecl>(F, Record, Idx); 1613 if (E->isPartiallySubstituted()) { 1614 assert(E->Length == NumPartialArgs); 1615 for (auto *I = E->getTrailingObjects<TemplateArgument>(), 1616 *E = I + NumPartialArgs; 1617 I != E; ++I) 1618 new (I) TemplateArgument(Reader.ReadTemplateArgument(F, Record, Idx)); 1619 } else if (!E->isValueDependent()) { 1620 E->Length = Record[Idx++]; 1621 } 1622 } 1623 1624 void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( 1625 SubstNonTypeTemplateParmExpr *E) { 1626 VisitExpr(E); 1627 E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx); 1628 E->NameLoc = ReadSourceLocation(Record, Idx); 1629 E->Replacement = Reader.ReadSubExpr(); 1630 } 1631 1632 void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr( 1633 SubstNonTypeTemplateParmPackExpr *E) { 1634 VisitExpr(E); 1635 E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx); 1636 TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx); 1637 if (ArgPack.getKind() != TemplateArgument::Pack) 1638 return; 1639 1640 E->Arguments = ArgPack.pack_begin(); 1641 E->NumArguments = ArgPack.pack_size(); 1642 E->NameLoc = ReadSourceLocation(Record, Idx); 1643 } 1644 1645 void ASTStmtReader::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) { 1646 VisitExpr(E); 1647 E->NumParameters = Record[Idx++]; 1648 E->ParamPack = ReadDeclAs<ParmVarDecl>(Record, Idx); 1649 E->NameLoc = ReadSourceLocation(Record, Idx); 1650 ParmVarDecl **Parms = E->getTrailingObjects<ParmVarDecl *>(); 1651 for (unsigned i = 0, n = E->NumParameters; i != n; ++i) 1652 Parms[i] = ReadDeclAs<ParmVarDecl>(Record, Idx); 1653 } 1654 1655 void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) { 1656 VisitExpr(E); 1657 E->State = Reader.ReadSubExpr(); 1658 auto VD = ReadDeclAs<ValueDecl>(Record, Idx); 1659 unsigned ManglingNumber = Record[Idx++]; 1660 E->setExtendingDecl(VD, ManglingNumber); 1661 } 1662 1663 void ASTStmtReader::VisitCXXFoldExpr(CXXFoldExpr *E) { 1664 VisitExpr(E); 1665 E->LParenLoc = ReadSourceLocation(Record, Idx); 1666 E->EllipsisLoc = ReadSourceLocation(Record, Idx); 1667 E->RParenLoc = ReadSourceLocation(Record, Idx); 1668 E->SubExprs[0] = Reader.ReadSubExpr(); 1669 E->SubExprs[1] = Reader.ReadSubExpr(); 1670 E->Opcode = (BinaryOperatorKind)Record[Idx++]; 1671 } 1672 1673 void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) { 1674 VisitExpr(E); 1675 E->SourceExpr = Reader.ReadSubExpr(); 1676 E->Loc = ReadSourceLocation(Record, Idx); 1677 } 1678 1679 void ASTStmtReader::VisitTypoExpr(TypoExpr *E) { 1680 llvm_unreachable("Cannot read TypoExpr nodes"); 1681 } 1682 1683 //===----------------------------------------------------------------------===// 1684 // Microsoft Expressions and Statements 1685 //===----------------------------------------------------------------------===// 1686 void ASTStmtReader::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) { 1687 VisitExpr(E); 1688 E->IsArrow = (Record[Idx++] != 0); 1689 E->BaseExpr = Reader.ReadSubExpr(); 1690 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1691 E->MemberLoc = ReadSourceLocation(Record, Idx); 1692 E->TheDecl = ReadDeclAs<MSPropertyDecl>(Record, Idx); 1693 } 1694 1695 void ASTStmtReader::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) { 1696 VisitExpr(E); 1697 E->setBase(Reader.ReadSubExpr()); 1698 E->setIdx(Reader.ReadSubExpr()); 1699 E->setRBracketLoc(ReadSourceLocation(Record, Idx)); 1700 } 1701 1702 void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) { 1703 VisitExpr(E); 1704 E->setSourceRange(ReadSourceRange(Record, Idx)); 1705 std::string UuidStr = ReadString(Record, Idx); 1706 E->setUuidStr(StringRef(UuidStr).copy(Reader.getContext())); 1707 if (E->isTypeOperand()) { // __uuidof(ComType) 1708 E->setTypeOperandSourceInfo( 1709 GetTypeSourceInfo(Record, Idx)); 1710 return; 1711 } 1712 1713 // __uuidof(expr) 1714 E->setExprOperand(Reader.ReadSubExpr()); 1715 } 1716 1717 void ASTStmtReader::VisitSEHLeaveStmt(SEHLeaveStmt *S) { 1718 VisitStmt(S); 1719 S->setLeaveLoc(ReadSourceLocation(Record, Idx)); 1720 } 1721 1722 void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) { 1723 VisitStmt(S); 1724 S->Loc = ReadSourceLocation(Record, Idx); 1725 S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt(); 1726 S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt(); 1727 } 1728 1729 void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) { 1730 VisitStmt(S); 1731 S->Loc = ReadSourceLocation(Record, Idx); 1732 S->Block = Reader.ReadSubStmt(); 1733 } 1734 1735 void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) { 1736 VisitStmt(S); 1737 S->IsCXXTry = Record[Idx++]; 1738 S->TryLoc = ReadSourceLocation(Record, Idx); 1739 S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt(); 1740 S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt(); 1741 } 1742 1743 //===----------------------------------------------------------------------===// 1744 // CUDA Expressions and Statements 1745 //===----------------------------------------------------------------------===// 1746 1747 void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 1748 VisitCallExpr(E); 1749 E->setConfig(cast<CallExpr>(Reader.ReadSubExpr())); 1750 } 1751 1752 //===----------------------------------------------------------------------===// 1753 // OpenCL Expressions and Statements. 1754 //===----------------------------------------------------------------------===// 1755 void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) { 1756 VisitExpr(E); 1757 E->BuiltinLoc = ReadSourceLocation(Record, Idx); 1758 E->RParenLoc = ReadSourceLocation(Record, Idx); 1759 E->SrcExpr = Reader.ReadSubExpr(); 1760 } 1761 1762 //===----------------------------------------------------------------------===// 1763 // OpenMP Clauses. 1764 //===----------------------------------------------------------------------===// 1765 1766 namespace clang { 1767 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 1768 ASTStmtReader *Reader; 1769 ASTContext &Context; 1770 const ASTReader::RecordData &Record; 1771 unsigned &Idx; 1772 public: 1773 OMPClauseReader(ASTStmtReader *R, ASTContext &C, 1774 const ASTReader::RecordData &Record, unsigned &Idx) 1775 : Reader(R), Context(C), Record(Record), Idx(Idx) { } 1776 #define OPENMP_CLAUSE(Name, Class) void Visit##Class(Class *C); 1777 #include "clang/Basic/OpenMPKinds.def" 1778 OMPClause *readClause(); 1779 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 1780 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 1781 }; 1782 } 1783 1784 OMPClause *OMPClauseReader::readClause() { 1785 OMPClause *C; 1786 switch (Record[Idx++]) { 1787 case OMPC_if: 1788 C = new (Context) OMPIfClause(); 1789 break; 1790 case OMPC_final: 1791 C = new (Context) OMPFinalClause(); 1792 break; 1793 case OMPC_num_threads: 1794 C = new (Context) OMPNumThreadsClause(); 1795 break; 1796 case OMPC_safelen: 1797 C = new (Context) OMPSafelenClause(); 1798 break; 1799 case OMPC_simdlen: 1800 C = new (Context) OMPSimdlenClause(); 1801 break; 1802 case OMPC_collapse: 1803 C = new (Context) OMPCollapseClause(); 1804 break; 1805 case OMPC_default: 1806 C = new (Context) OMPDefaultClause(); 1807 break; 1808 case OMPC_proc_bind: 1809 C = new (Context) OMPProcBindClause(); 1810 break; 1811 case OMPC_schedule: 1812 C = new (Context) OMPScheduleClause(); 1813 break; 1814 case OMPC_ordered: 1815 C = new (Context) OMPOrderedClause(); 1816 break; 1817 case OMPC_nowait: 1818 C = new (Context) OMPNowaitClause(); 1819 break; 1820 case OMPC_untied: 1821 C = new (Context) OMPUntiedClause(); 1822 break; 1823 case OMPC_mergeable: 1824 C = new (Context) OMPMergeableClause(); 1825 break; 1826 case OMPC_read: 1827 C = new (Context) OMPReadClause(); 1828 break; 1829 case OMPC_write: 1830 C = new (Context) OMPWriteClause(); 1831 break; 1832 case OMPC_update: 1833 C = new (Context) OMPUpdateClause(); 1834 break; 1835 case OMPC_capture: 1836 C = new (Context) OMPCaptureClause(); 1837 break; 1838 case OMPC_seq_cst: 1839 C = new (Context) OMPSeqCstClause(); 1840 break; 1841 case OMPC_threads: 1842 C = new (Context) OMPThreadsClause(); 1843 break; 1844 case OMPC_simd: 1845 C = new (Context) OMPSIMDClause(); 1846 break; 1847 case OMPC_nogroup: 1848 C = new (Context) OMPNogroupClause(); 1849 break; 1850 case OMPC_private: 1851 C = OMPPrivateClause::CreateEmpty(Context, Record[Idx++]); 1852 break; 1853 case OMPC_firstprivate: 1854 C = OMPFirstprivateClause::CreateEmpty(Context, Record[Idx++]); 1855 break; 1856 case OMPC_lastprivate: 1857 C = OMPLastprivateClause::CreateEmpty(Context, Record[Idx++]); 1858 break; 1859 case OMPC_shared: 1860 C = OMPSharedClause::CreateEmpty(Context, Record[Idx++]); 1861 break; 1862 case OMPC_reduction: 1863 C = OMPReductionClause::CreateEmpty(Context, Record[Idx++]); 1864 break; 1865 case OMPC_linear: 1866 C = OMPLinearClause::CreateEmpty(Context, Record[Idx++]); 1867 break; 1868 case OMPC_aligned: 1869 C = OMPAlignedClause::CreateEmpty(Context, Record[Idx++]); 1870 break; 1871 case OMPC_copyin: 1872 C = OMPCopyinClause::CreateEmpty(Context, Record[Idx++]); 1873 break; 1874 case OMPC_copyprivate: 1875 C = OMPCopyprivateClause::CreateEmpty(Context, Record[Idx++]); 1876 break; 1877 case OMPC_flush: 1878 C = OMPFlushClause::CreateEmpty(Context, Record[Idx++]); 1879 break; 1880 case OMPC_depend: 1881 C = OMPDependClause::CreateEmpty(Context, Record[Idx++]); 1882 break; 1883 case OMPC_device: 1884 C = new (Context) OMPDeviceClause(); 1885 break; 1886 case OMPC_map: { 1887 unsigned NumVars = Record[Idx++]; 1888 unsigned NumDeclarations = Record[Idx++]; 1889 unsigned NumLists = Record[Idx++]; 1890 unsigned NumComponents = Record[Idx++]; 1891 C = OMPMapClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists, 1892 NumComponents); 1893 break; 1894 } 1895 case OMPC_num_teams: 1896 C = new (Context) OMPNumTeamsClause(); 1897 break; 1898 case OMPC_thread_limit: 1899 C = new (Context) OMPThreadLimitClause(); 1900 break; 1901 case OMPC_priority: 1902 C = new (Context) OMPPriorityClause(); 1903 break; 1904 case OMPC_grainsize: 1905 C = new (Context) OMPGrainsizeClause(); 1906 break; 1907 case OMPC_num_tasks: 1908 C = new (Context) OMPNumTasksClause(); 1909 break; 1910 case OMPC_hint: 1911 C = new (Context) OMPHintClause(); 1912 break; 1913 case OMPC_dist_schedule: 1914 C = new (Context) OMPDistScheduleClause(); 1915 break; 1916 case OMPC_defaultmap: 1917 C = new (Context) OMPDefaultmapClause(); 1918 break; 1919 case OMPC_to: { 1920 unsigned NumVars = Record[Idx++]; 1921 unsigned NumDeclarations = Record[Idx++]; 1922 unsigned NumLists = Record[Idx++]; 1923 unsigned NumComponents = Record[Idx++]; 1924 C = OMPToClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists, 1925 NumComponents); 1926 break; 1927 } 1928 case OMPC_from: { 1929 unsigned NumVars = Record[Idx++]; 1930 unsigned NumDeclarations = Record[Idx++]; 1931 unsigned NumLists = Record[Idx++]; 1932 unsigned NumComponents = Record[Idx++]; 1933 C = OMPFromClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists, 1934 NumComponents); 1935 break; 1936 } 1937 case OMPC_use_device_ptr: { 1938 unsigned NumVars = Record[Idx++]; 1939 unsigned NumDeclarations = Record[Idx++]; 1940 unsigned NumLists = Record[Idx++]; 1941 unsigned NumComponents = Record[Idx++]; 1942 C = OMPUseDevicePtrClause::CreateEmpty(Context, NumVars, NumDeclarations, 1943 NumLists, NumComponents); 1944 break; 1945 } 1946 case OMPC_is_device_ptr: { 1947 unsigned NumVars = Record[Idx++]; 1948 unsigned NumDeclarations = Record[Idx++]; 1949 unsigned NumLists = Record[Idx++]; 1950 unsigned NumComponents = Record[Idx++]; 1951 C = OMPIsDevicePtrClause::CreateEmpty(Context, NumVars, NumDeclarations, 1952 NumLists, NumComponents); 1953 break; 1954 } 1955 } 1956 Visit(C); 1957 C->setLocStart(Reader->ReadSourceLocation(Record, Idx)); 1958 C->setLocEnd(Reader->ReadSourceLocation(Record, Idx)); 1959 1960 return C; 1961 } 1962 1963 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 1964 C->setPreInitStmt(Reader->Reader.ReadSubStmt()); 1965 } 1966 1967 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 1968 VisitOMPClauseWithPreInit(C); 1969 C->setPostUpdateExpr(Reader->Reader.ReadSubExpr()); 1970 } 1971 1972 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 1973 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record[Idx++])); 1974 C->setNameModifierLoc(Reader->ReadSourceLocation(Record, Idx)); 1975 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 1976 C->setCondition(Reader->Reader.ReadSubExpr()); 1977 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 1978 } 1979 1980 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 1981 C->setCondition(Reader->Reader.ReadSubExpr()); 1982 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 1983 } 1984 1985 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 1986 C->setNumThreads(Reader->Reader.ReadSubExpr()); 1987 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 1988 } 1989 1990 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 1991 C->setSafelen(Reader->Reader.ReadSubExpr()); 1992 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 1993 } 1994 1995 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 1996 C->setSimdlen(Reader->Reader.ReadSubExpr()); 1997 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 1998 } 1999 2000 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 2001 C->setNumForLoops(Reader->Reader.ReadSubExpr()); 2002 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2003 } 2004 2005 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 2006 C->setDefaultKind( 2007 static_cast<OpenMPDefaultClauseKind>(Record[Idx++])); 2008 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2009 C->setDefaultKindKwLoc(Reader->ReadSourceLocation(Record, Idx)); 2010 } 2011 2012 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 2013 C->setProcBindKind( 2014 static_cast<OpenMPProcBindClauseKind>(Record[Idx++])); 2015 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2016 C->setProcBindKindKwLoc(Reader->ReadSourceLocation(Record, Idx)); 2017 } 2018 2019 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 2020 VisitOMPClauseWithPreInit(C); 2021 C->setScheduleKind( 2022 static_cast<OpenMPScheduleClauseKind>(Record[Idx++])); 2023 C->setFirstScheduleModifier( 2024 static_cast<OpenMPScheduleClauseModifier>(Record[Idx++])); 2025 C->setSecondScheduleModifier( 2026 static_cast<OpenMPScheduleClauseModifier>(Record[Idx++])); 2027 C->setChunkSize(Reader->Reader.ReadSubExpr()); 2028 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2029 C->setFirstScheduleModifierLoc(Reader->ReadSourceLocation(Record, Idx)); 2030 C->setSecondScheduleModifierLoc(Reader->ReadSourceLocation(Record, Idx)); 2031 C->setScheduleKindLoc(Reader->ReadSourceLocation(Record, Idx)); 2032 C->setCommaLoc(Reader->ReadSourceLocation(Record, Idx)); 2033 } 2034 2035 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 2036 C->setNumForLoops(Reader->Reader.ReadSubExpr()); 2037 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2038 } 2039 2040 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 2041 2042 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 2043 2044 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 2045 2046 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 2047 2048 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 2049 2050 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {} 2051 2052 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 2053 2054 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 2055 2056 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 2057 2058 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 2059 2060 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 2061 2062 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 2063 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2064 unsigned NumVars = C->varlist_size(); 2065 SmallVector<Expr *, 16> Vars; 2066 Vars.reserve(NumVars); 2067 for (unsigned i = 0; i != NumVars; ++i) 2068 Vars.push_back(Reader->Reader.ReadSubExpr()); 2069 C->setVarRefs(Vars); 2070 Vars.clear(); 2071 for (unsigned i = 0; i != NumVars; ++i) 2072 Vars.push_back(Reader->Reader.ReadSubExpr()); 2073 C->setPrivateCopies(Vars); 2074 } 2075 2076 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 2077 VisitOMPClauseWithPreInit(C); 2078 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2079 unsigned NumVars = C->varlist_size(); 2080 SmallVector<Expr *, 16> Vars; 2081 Vars.reserve(NumVars); 2082 for (unsigned i = 0; i != NumVars; ++i) 2083 Vars.push_back(Reader->Reader.ReadSubExpr()); 2084 C->setVarRefs(Vars); 2085 Vars.clear(); 2086 for (unsigned i = 0; i != NumVars; ++i) 2087 Vars.push_back(Reader->Reader.ReadSubExpr()); 2088 C->setPrivateCopies(Vars); 2089 Vars.clear(); 2090 for (unsigned i = 0; i != NumVars; ++i) 2091 Vars.push_back(Reader->Reader.ReadSubExpr()); 2092 C->setInits(Vars); 2093 } 2094 2095 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 2096 VisitOMPClauseWithPostUpdate(C); 2097 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2098 unsigned NumVars = C->varlist_size(); 2099 SmallVector<Expr *, 16> Vars; 2100 Vars.reserve(NumVars); 2101 for (unsigned i = 0; i != NumVars; ++i) 2102 Vars.push_back(Reader->Reader.ReadSubExpr()); 2103 C->setVarRefs(Vars); 2104 Vars.clear(); 2105 for (unsigned i = 0; i != NumVars; ++i) 2106 Vars.push_back(Reader->Reader.ReadSubExpr()); 2107 C->setPrivateCopies(Vars); 2108 Vars.clear(); 2109 for (unsigned i = 0; i != NumVars; ++i) 2110 Vars.push_back(Reader->Reader.ReadSubExpr()); 2111 C->setSourceExprs(Vars); 2112 Vars.clear(); 2113 for (unsigned i = 0; i != NumVars; ++i) 2114 Vars.push_back(Reader->Reader.ReadSubExpr()); 2115 C->setDestinationExprs(Vars); 2116 Vars.clear(); 2117 for (unsigned i = 0; i != NumVars; ++i) 2118 Vars.push_back(Reader->Reader.ReadSubExpr()); 2119 C->setAssignmentOps(Vars); 2120 } 2121 2122 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 2123 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2124 unsigned NumVars = C->varlist_size(); 2125 SmallVector<Expr *, 16> Vars; 2126 Vars.reserve(NumVars); 2127 for (unsigned i = 0; i != NumVars; ++i) 2128 Vars.push_back(Reader->Reader.ReadSubExpr()); 2129 C->setVarRefs(Vars); 2130 } 2131 2132 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 2133 VisitOMPClauseWithPostUpdate(C); 2134 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2135 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 2136 NestedNameSpecifierLoc NNSL = 2137 Reader->Reader.ReadNestedNameSpecifierLoc(Reader->F, Record, Idx); 2138 DeclarationNameInfo DNI; 2139 Reader->ReadDeclarationNameInfo(DNI, Record, Idx); 2140 C->setQualifierLoc(NNSL); 2141 C->setNameInfo(DNI); 2142 2143 unsigned NumVars = C->varlist_size(); 2144 SmallVector<Expr *, 16> Vars; 2145 Vars.reserve(NumVars); 2146 for (unsigned i = 0; i != NumVars; ++i) 2147 Vars.push_back(Reader->Reader.ReadSubExpr()); 2148 C->setVarRefs(Vars); 2149 Vars.clear(); 2150 for (unsigned i = 0; i != NumVars; ++i) 2151 Vars.push_back(Reader->Reader.ReadSubExpr()); 2152 C->setPrivates(Vars); 2153 Vars.clear(); 2154 for (unsigned i = 0; i != NumVars; ++i) 2155 Vars.push_back(Reader->Reader.ReadSubExpr()); 2156 C->setLHSExprs(Vars); 2157 Vars.clear(); 2158 for (unsigned i = 0; i != NumVars; ++i) 2159 Vars.push_back(Reader->Reader.ReadSubExpr()); 2160 C->setRHSExprs(Vars); 2161 Vars.clear(); 2162 for (unsigned i = 0; i != NumVars; ++i) 2163 Vars.push_back(Reader->Reader.ReadSubExpr()); 2164 C->setReductionOps(Vars); 2165 } 2166 2167 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 2168 VisitOMPClauseWithPostUpdate(C); 2169 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2170 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 2171 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record[Idx++])); 2172 C->setModifierLoc(Reader->ReadSourceLocation(Record, Idx)); 2173 unsigned NumVars = C->varlist_size(); 2174 SmallVector<Expr *, 16> Vars; 2175 Vars.reserve(NumVars); 2176 for (unsigned i = 0; i != NumVars; ++i) 2177 Vars.push_back(Reader->Reader.ReadSubExpr()); 2178 C->setVarRefs(Vars); 2179 Vars.clear(); 2180 for (unsigned i = 0; i != NumVars; ++i) 2181 Vars.push_back(Reader->Reader.ReadSubExpr()); 2182 C->setPrivates(Vars); 2183 Vars.clear(); 2184 for (unsigned i = 0; i != NumVars; ++i) 2185 Vars.push_back(Reader->Reader.ReadSubExpr()); 2186 C->setInits(Vars); 2187 Vars.clear(); 2188 for (unsigned i = 0; i != NumVars; ++i) 2189 Vars.push_back(Reader->Reader.ReadSubExpr()); 2190 C->setUpdates(Vars); 2191 Vars.clear(); 2192 for (unsigned i = 0; i != NumVars; ++i) 2193 Vars.push_back(Reader->Reader.ReadSubExpr()); 2194 C->setFinals(Vars); 2195 C->setStep(Reader->Reader.ReadSubExpr()); 2196 C->setCalcStep(Reader->Reader.ReadSubExpr()); 2197 } 2198 2199 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 2200 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2201 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 2202 unsigned NumVars = C->varlist_size(); 2203 SmallVector<Expr *, 16> Vars; 2204 Vars.reserve(NumVars); 2205 for (unsigned i = 0; i != NumVars; ++i) 2206 Vars.push_back(Reader->Reader.ReadSubExpr()); 2207 C->setVarRefs(Vars); 2208 C->setAlignment(Reader->Reader.ReadSubExpr()); 2209 } 2210 2211 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 2212 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2213 unsigned NumVars = C->varlist_size(); 2214 SmallVector<Expr *, 16> Exprs; 2215 Exprs.reserve(NumVars); 2216 for (unsigned i = 0; i != NumVars; ++i) 2217 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2218 C->setVarRefs(Exprs); 2219 Exprs.clear(); 2220 for (unsigned i = 0; i != NumVars; ++i) 2221 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2222 C->setSourceExprs(Exprs); 2223 Exprs.clear(); 2224 for (unsigned i = 0; i != NumVars; ++i) 2225 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2226 C->setDestinationExprs(Exprs); 2227 Exprs.clear(); 2228 for (unsigned i = 0; i != NumVars; ++i) 2229 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2230 C->setAssignmentOps(Exprs); 2231 } 2232 2233 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 2234 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2235 unsigned NumVars = C->varlist_size(); 2236 SmallVector<Expr *, 16> Exprs; 2237 Exprs.reserve(NumVars); 2238 for (unsigned i = 0; i != NumVars; ++i) 2239 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2240 C->setVarRefs(Exprs); 2241 Exprs.clear(); 2242 for (unsigned i = 0; i != NumVars; ++i) 2243 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2244 C->setSourceExprs(Exprs); 2245 Exprs.clear(); 2246 for (unsigned i = 0; i != NumVars; ++i) 2247 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2248 C->setDestinationExprs(Exprs); 2249 Exprs.clear(); 2250 for (unsigned i = 0; i != NumVars; ++i) 2251 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2252 C->setAssignmentOps(Exprs); 2253 } 2254 2255 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 2256 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2257 unsigned NumVars = C->varlist_size(); 2258 SmallVector<Expr *, 16> Vars; 2259 Vars.reserve(NumVars); 2260 for (unsigned i = 0; i != NumVars; ++i) 2261 Vars.push_back(Reader->Reader.ReadSubExpr()); 2262 C->setVarRefs(Vars); 2263 } 2264 2265 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 2266 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2267 C->setDependencyKind(static_cast<OpenMPDependClauseKind>(Record[Idx++])); 2268 C->setDependencyLoc(Reader->ReadSourceLocation(Record, Idx)); 2269 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 2270 unsigned NumVars = C->varlist_size(); 2271 SmallVector<Expr *, 16> Vars; 2272 Vars.reserve(NumVars); 2273 for (unsigned i = 0; i != NumVars; ++i) 2274 Vars.push_back(Reader->Reader.ReadSubExpr()); 2275 C->setVarRefs(Vars); 2276 C->setCounterValue(Reader->Reader.ReadSubExpr()); 2277 } 2278 2279 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 2280 C->setDevice(Reader->Reader.ReadSubExpr()); 2281 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2282 } 2283 2284 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 2285 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2286 C->setMapTypeModifier( 2287 static_cast<OpenMPMapClauseKind>(Record[Idx++])); 2288 C->setMapType( 2289 static_cast<OpenMPMapClauseKind>(Record[Idx++])); 2290 C->setMapLoc(Reader->ReadSourceLocation(Record, Idx)); 2291 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 2292 auto NumVars = C->varlist_size(); 2293 auto UniqueDecls = C->getUniqueDeclarationsNum(); 2294 auto TotalLists = C->getTotalComponentListNum(); 2295 auto TotalComponents = C->getTotalComponentsNum(); 2296 2297 SmallVector<Expr *, 16> Vars; 2298 Vars.reserve(NumVars); 2299 for (unsigned i = 0; i != NumVars; ++i) 2300 Vars.push_back(Reader->Reader.ReadSubExpr()); 2301 C->setVarRefs(Vars); 2302 2303 SmallVector<ValueDecl *, 16> Decls; 2304 Decls.reserve(UniqueDecls); 2305 for (unsigned i = 0; i < UniqueDecls; ++i) 2306 Decls.push_back( 2307 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx)); 2308 C->setUniqueDecls(Decls); 2309 2310 SmallVector<unsigned, 16> ListsPerDecl; 2311 ListsPerDecl.reserve(UniqueDecls); 2312 for (unsigned i = 0; i < UniqueDecls; ++i) 2313 ListsPerDecl.push_back(Record[Idx++]); 2314 C->setDeclNumLists(ListsPerDecl); 2315 2316 SmallVector<unsigned, 32> ListSizes; 2317 ListSizes.reserve(TotalLists); 2318 for (unsigned i = 0; i < TotalLists; ++i) 2319 ListSizes.push_back(Record[Idx++]); 2320 C->setComponentListSizes(ListSizes); 2321 2322 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 2323 Components.reserve(TotalComponents); 2324 for (unsigned i = 0; i < TotalComponents; ++i) { 2325 Expr *AssociatedExpr = Reader->Reader.ReadSubExpr(); 2326 ValueDecl *AssociatedDecl = 2327 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx); 2328 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 2329 AssociatedExpr, AssociatedDecl)); 2330 } 2331 C->setComponents(Components, ListSizes); 2332 } 2333 2334 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 2335 C->setNumTeams(Reader->Reader.ReadSubExpr()); 2336 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2337 } 2338 2339 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 2340 C->setThreadLimit(Reader->Reader.ReadSubExpr()); 2341 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2342 } 2343 2344 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 2345 C->setPriority(Reader->Reader.ReadSubExpr()); 2346 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2347 } 2348 2349 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 2350 C->setGrainsize(Reader->Reader.ReadSubExpr()); 2351 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2352 } 2353 2354 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 2355 C->setNumTasks(Reader->Reader.ReadSubExpr()); 2356 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2357 } 2358 2359 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 2360 C->setHint(Reader->Reader.ReadSubExpr()); 2361 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2362 } 2363 2364 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 2365 VisitOMPClauseWithPreInit(C); 2366 C->setDistScheduleKind( 2367 static_cast<OpenMPDistScheduleClauseKind>(Record[Idx++])); 2368 C->setChunkSize(Reader->Reader.ReadSubExpr()); 2369 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2370 C->setDistScheduleKindLoc(Reader->ReadSourceLocation(Record, Idx)); 2371 C->setCommaLoc(Reader->ReadSourceLocation(Record, Idx)); 2372 } 2373 2374 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 2375 C->setDefaultmapKind( 2376 static_cast<OpenMPDefaultmapClauseKind>(Record[Idx++])); 2377 C->setDefaultmapModifier( 2378 static_cast<OpenMPDefaultmapClauseModifier>(Record[Idx++])); 2379 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2380 C->setDefaultmapModifierLoc(Reader->ReadSourceLocation(Record, Idx)); 2381 C->setDefaultmapKindLoc(Reader->ReadSourceLocation(Record, Idx)); 2382 } 2383 2384 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 2385 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2386 auto NumVars = C->varlist_size(); 2387 auto UniqueDecls = C->getUniqueDeclarationsNum(); 2388 auto TotalLists = C->getTotalComponentListNum(); 2389 auto TotalComponents = C->getTotalComponentsNum(); 2390 2391 SmallVector<Expr *, 16> Vars; 2392 Vars.reserve(NumVars); 2393 for (unsigned i = 0; i != NumVars; ++i) 2394 Vars.push_back(Reader->Reader.ReadSubExpr()); 2395 C->setVarRefs(Vars); 2396 2397 SmallVector<ValueDecl *, 16> Decls; 2398 Decls.reserve(UniqueDecls); 2399 for (unsigned i = 0; i < UniqueDecls; ++i) 2400 Decls.push_back( 2401 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx)); 2402 C->setUniqueDecls(Decls); 2403 2404 SmallVector<unsigned, 16> ListsPerDecl; 2405 ListsPerDecl.reserve(UniqueDecls); 2406 for (unsigned i = 0; i < UniqueDecls; ++i) 2407 ListsPerDecl.push_back(Record[Idx++]); 2408 C->setDeclNumLists(ListsPerDecl); 2409 2410 SmallVector<unsigned, 32> ListSizes; 2411 ListSizes.reserve(TotalLists); 2412 for (unsigned i = 0; i < TotalLists; ++i) 2413 ListSizes.push_back(Record[Idx++]); 2414 C->setComponentListSizes(ListSizes); 2415 2416 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 2417 Components.reserve(TotalComponents); 2418 for (unsigned i = 0; i < TotalComponents; ++i) { 2419 Expr *AssociatedExpr = Reader->Reader.ReadSubExpr(); 2420 ValueDecl *AssociatedDecl = 2421 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx); 2422 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 2423 AssociatedExpr, AssociatedDecl)); 2424 } 2425 C->setComponents(Components, ListSizes); 2426 } 2427 2428 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 2429 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2430 auto NumVars = C->varlist_size(); 2431 auto UniqueDecls = C->getUniqueDeclarationsNum(); 2432 auto TotalLists = C->getTotalComponentListNum(); 2433 auto TotalComponents = C->getTotalComponentsNum(); 2434 2435 SmallVector<Expr *, 16> Vars; 2436 Vars.reserve(NumVars); 2437 for (unsigned i = 0; i != NumVars; ++i) 2438 Vars.push_back(Reader->Reader.ReadSubExpr()); 2439 C->setVarRefs(Vars); 2440 2441 SmallVector<ValueDecl *, 16> Decls; 2442 Decls.reserve(UniqueDecls); 2443 for (unsigned i = 0; i < UniqueDecls; ++i) 2444 Decls.push_back( 2445 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx)); 2446 C->setUniqueDecls(Decls); 2447 2448 SmallVector<unsigned, 16> ListsPerDecl; 2449 ListsPerDecl.reserve(UniqueDecls); 2450 for (unsigned i = 0; i < UniqueDecls; ++i) 2451 ListsPerDecl.push_back(Record[Idx++]); 2452 C->setDeclNumLists(ListsPerDecl); 2453 2454 SmallVector<unsigned, 32> ListSizes; 2455 ListSizes.reserve(TotalLists); 2456 for (unsigned i = 0; i < TotalLists; ++i) 2457 ListSizes.push_back(Record[Idx++]); 2458 C->setComponentListSizes(ListSizes); 2459 2460 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 2461 Components.reserve(TotalComponents); 2462 for (unsigned i = 0; i < TotalComponents; ++i) { 2463 Expr *AssociatedExpr = Reader->Reader.ReadSubExpr(); 2464 ValueDecl *AssociatedDecl = 2465 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx); 2466 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 2467 AssociatedExpr, AssociatedDecl)); 2468 } 2469 C->setComponents(Components, ListSizes); 2470 } 2471 2472 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 2473 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2474 auto NumVars = C->varlist_size(); 2475 auto UniqueDecls = C->getUniqueDeclarationsNum(); 2476 auto TotalLists = C->getTotalComponentListNum(); 2477 auto TotalComponents = C->getTotalComponentsNum(); 2478 2479 SmallVector<Expr *, 16> Vars; 2480 Vars.reserve(NumVars); 2481 for (unsigned i = 0; i != NumVars; ++i) 2482 Vars.push_back(Reader->Reader.ReadSubExpr()); 2483 C->setVarRefs(Vars); 2484 Vars.clear(); 2485 for (unsigned i = 0; i != NumVars; ++i) 2486 Vars.push_back(Reader->Reader.ReadSubExpr()); 2487 C->setPrivateCopies(Vars); 2488 Vars.clear(); 2489 for (unsigned i = 0; i != NumVars; ++i) 2490 Vars.push_back(Reader->Reader.ReadSubExpr()); 2491 C->setInits(Vars); 2492 2493 SmallVector<ValueDecl *, 16> Decls; 2494 Decls.reserve(UniqueDecls); 2495 for (unsigned i = 0; i < UniqueDecls; ++i) 2496 Decls.push_back( 2497 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx)); 2498 C->setUniqueDecls(Decls); 2499 2500 SmallVector<unsigned, 16> ListsPerDecl; 2501 ListsPerDecl.reserve(UniqueDecls); 2502 for (unsigned i = 0; i < UniqueDecls; ++i) 2503 ListsPerDecl.push_back(Record[Idx++]); 2504 C->setDeclNumLists(ListsPerDecl); 2505 2506 SmallVector<unsigned, 32> ListSizes; 2507 ListSizes.reserve(TotalLists); 2508 for (unsigned i = 0; i < TotalLists; ++i) 2509 ListSizes.push_back(Record[Idx++]); 2510 C->setComponentListSizes(ListSizes); 2511 2512 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 2513 Components.reserve(TotalComponents); 2514 for (unsigned i = 0; i < TotalComponents; ++i) { 2515 Expr *AssociatedExpr = Reader->Reader.ReadSubExpr(); 2516 ValueDecl *AssociatedDecl = 2517 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx); 2518 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 2519 AssociatedExpr, AssociatedDecl)); 2520 } 2521 C->setComponents(Components, ListSizes); 2522 } 2523 2524 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 2525 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2526 auto NumVars = C->varlist_size(); 2527 auto UniqueDecls = C->getUniqueDeclarationsNum(); 2528 auto TotalLists = C->getTotalComponentListNum(); 2529 auto TotalComponents = C->getTotalComponentsNum(); 2530 2531 SmallVector<Expr *, 16> Vars; 2532 Vars.reserve(NumVars); 2533 for (unsigned i = 0; i != NumVars; ++i) 2534 Vars.push_back(Reader->Reader.ReadSubExpr()); 2535 C->setVarRefs(Vars); 2536 Vars.clear(); 2537 2538 SmallVector<ValueDecl *, 16> Decls; 2539 Decls.reserve(UniqueDecls); 2540 for (unsigned i = 0; i < UniqueDecls; ++i) 2541 Decls.push_back( 2542 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx)); 2543 C->setUniqueDecls(Decls); 2544 2545 SmallVector<unsigned, 16> ListsPerDecl; 2546 ListsPerDecl.reserve(UniqueDecls); 2547 for (unsigned i = 0; i < UniqueDecls; ++i) 2548 ListsPerDecl.push_back(Record[Idx++]); 2549 C->setDeclNumLists(ListsPerDecl); 2550 2551 SmallVector<unsigned, 32> ListSizes; 2552 ListSizes.reserve(TotalLists); 2553 for (unsigned i = 0; i < TotalLists; ++i) 2554 ListSizes.push_back(Record[Idx++]); 2555 C->setComponentListSizes(ListSizes); 2556 2557 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 2558 Components.reserve(TotalComponents); 2559 for (unsigned i = 0; i < TotalComponents; ++i) { 2560 Expr *AssociatedExpr = Reader->Reader.ReadSubExpr(); 2561 ValueDecl *AssociatedDecl = 2562 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx); 2563 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 2564 AssociatedExpr, AssociatedDecl)); 2565 } 2566 C->setComponents(Components, ListSizes); 2567 } 2568 2569 //===----------------------------------------------------------------------===// 2570 // OpenMP Directives. 2571 //===----------------------------------------------------------------------===// 2572 void ASTStmtReader::VisitOMPExecutableDirective(OMPExecutableDirective *E) { 2573 E->setLocStart(ReadSourceLocation(Record, Idx)); 2574 E->setLocEnd(ReadSourceLocation(Record, Idx)); 2575 OMPClauseReader ClauseReader(this, Reader.getContext(), Record, Idx); 2576 SmallVector<OMPClause *, 5> Clauses; 2577 for (unsigned i = 0; i < E->getNumClauses(); ++i) 2578 Clauses.push_back(ClauseReader.readClause()); 2579 E->setClauses(Clauses); 2580 if (E->hasAssociatedStmt()) 2581 E->setAssociatedStmt(Reader.ReadSubStmt()); 2582 } 2583 2584 void ASTStmtReader::VisitOMPLoopDirective(OMPLoopDirective *D) { 2585 VisitStmt(D); 2586 // Two fields (NumClauses and CollapsedNum) were read in ReadStmtFromStream. 2587 Idx += 2; 2588 VisitOMPExecutableDirective(D); 2589 D->setIterationVariable(Reader.ReadSubExpr()); 2590 D->setLastIteration(Reader.ReadSubExpr()); 2591 D->setCalcLastIteration(Reader.ReadSubExpr()); 2592 D->setPreCond(Reader.ReadSubExpr()); 2593 D->setCond(Reader.ReadSubExpr()); 2594 D->setInit(Reader.ReadSubExpr()); 2595 D->setInc(Reader.ReadSubExpr()); 2596 D->setPreInits(Reader.ReadSubStmt()); 2597 if (isOpenMPWorksharingDirective(D->getDirectiveKind()) || 2598 isOpenMPTaskLoopDirective(D->getDirectiveKind()) || 2599 isOpenMPDistributeDirective(D->getDirectiveKind())) { 2600 D->setIsLastIterVariable(Reader.ReadSubExpr()); 2601 D->setLowerBoundVariable(Reader.ReadSubExpr()); 2602 D->setUpperBoundVariable(Reader.ReadSubExpr()); 2603 D->setStrideVariable(Reader.ReadSubExpr()); 2604 D->setEnsureUpperBound(Reader.ReadSubExpr()); 2605 D->setNextLowerBound(Reader.ReadSubExpr()); 2606 D->setNextUpperBound(Reader.ReadSubExpr()); 2607 D->setNumIterations(Reader.ReadSubExpr()); 2608 } 2609 if (isOpenMPLoopBoundSharingDirective(D->getDirectiveKind())) { 2610 D->setPrevLowerBoundVariable(Reader.ReadSubExpr()); 2611 D->setPrevUpperBoundVariable(Reader.ReadSubExpr()); 2612 } 2613 SmallVector<Expr *, 4> Sub; 2614 unsigned CollapsedNum = D->getCollapsedNumber(); 2615 Sub.reserve(CollapsedNum); 2616 for (unsigned i = 0; i < CollapsedNum; ++i) 2617 Sub.push_back(Reader.ReadSubExpr()); 2618 D->setCounters(Sub); 2619 Sub.clear(); 2620 for (unsigned i = 0; i < CollapsedNum; ++i) 2621 Sub.push_back(Reader.ReadSubExpr()); 2622 D->setPrivateCounters(Sub); 2623 Sub.clear(); 2624 for (unsigned i = 0; i < CollapsedNum; ++i) 2625 Sub.push_back(Reader.ReadSubExpr()); 2626 D->setInits(Sub); 2627 Sub.clear(); 2628 for (unsigned i = 0; i < CollapsedNum; ++i) 2629 Sub.push_back(Reader.ReadSubExpr()); 2630 D->setUpdates(Sub); 2631 Sub.clear(); 2632 for (unsigned i = 0; i < CollapsedNum; ++i) 2633 Sub.push_back(Reader.ReadSubExpr()); 2634 D->setFinals(Sub); 2635 } 2636 2637 void ASTStmtReader::VisitOMPParallelDirective(OMPParallelDirective *D) { 2638 VisitStmt(D); 2639 // The NumClauses field was read in ReadStmtFromStream. 2640 ++Idx; 2641 VisitOMPExecutableDirective(D); 2642 D->setHasCancel(Record[Idx++]); 2643 } 2644 2645 void ASTStmtReader::VisitOMPSimdDirective(OMPSimdDirective *D) { 2646 VisitOMPLoopDirective(D); 2647 } 2648 2649 void ASTStmtReader::VisitOMPForDirective(OMPForDirective *D) { 2650 VisitOMPLoopDirective(D); 2651 D->setHasCancel(Record[Idx++]); 2652 } 2653 2654 void ASTStmtReader::VisitOMPForSimdDirective(OMPForSimdDirective *D) { 2655 VisitOMPLoopDirective(D); 2656 } 2657 2658 void ASTStmtReader::VisitOMPSectionsDirective(OMPSectionsDirective *D) { 2659 VisitStmt(D); 2660 // The NumClauses field was read in ReadStmtFromStream. 2661 ++Idx; 2662 VisitOMPExecutableDirective(D); 2663 D->setHasCancel(Record[Idx++]); 2664 } 2665 2666 void ASTStmtReader::VisitOMPSectionDirective(OMPSectionDirective *D) { 2667 VisitStmt(D); 2668 VisitOMPExecutableDirective(D); 2669 D->setHasCancel(Record[Idx++]); 2670 } 2671 2672 void ASTStmtReader::VisitOMPSingleDirective(OMPSingleDirective *D) { 2673 VisitStmt(D); 2674 // The NumClauses field was read in ReadStmtFromStream. 2675 ++Idx; 2676 VisitOMPExecutableDirective(D); 2677 } 2678 2679 void ASTStmtReader::VisitOMPMasterDirective(OMPMasterDirective *D) { 2680 VisitStmt(D); 2681 VisitOMPExecutableDirective(D); 2682 } 2683 2684 void ASTStmtReader::VisitOMPCriticalDirective(OMPCriticalDirective *D) { 2685 VisitStmt(D); 2686 // The NumClauses field was read in ReadStmtFromStream. 2687 ++Idx; 2688 VisitOMPExecutableDirective(D); 2689 ReadDeclarationNameInfo(D->DirName, Record, Idx); 2690 } 2691 2692 void ASTStmtReader::VisitOMPParallelForDirective(OMPParallelForDirective *D) { 2693 VisitOMPLoopDirective(D); 2694 D->setHasCancel(Record[Idx++]); 2695 } 2696 2697 void ASTStmtReader::VisitOMPParallelForSimdDirective( 2698 OMPParallelForSimdDirective *D) { 2699 VisitOMPLoopDirective(D); 2700 } 2701 2702 void ASTStmtReader::VisitOMPParallelSectionsDirective( 2703 OMPParallelSectionsDirective *D) { 2704 VisitStmt(D); 2705 // The NumClauses field was read in ReadStmtFromStream. 2706 ++Idx; 2707 VisitOMPExecutableDirective(D); 2708 D->setHasCancel(Record[Idx++]); 2709 } 2710 2711 void ASTStmtReader::VisitOMPTaskDirective(OMPTaskDirective *D) { 2712 VisitStmt(D); 2713 // The NumClauses field was read in ReadStmtFromStream. 2714 ++Idx; 2715 VisitOMPExecutableDirective(D); 2716 D->setHasCancel(Record[Idx++]); 2717 } 2718 2719 void ASTStmtReader::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) { 2720 VisitStmt(D); 2721 VisitOMPExecutableDirective(D); 2722 } 2723 2724 void ASTStmtReader::VisitOMPBarrierDirective(OMPBarrierDirective *D) { 2725 VisitStmt(D); 2726 VisitOMPExecutableDirective(D); 2727 } 2728 2729 void ASTStmtReader::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 2730 VisitStmt(D); 2731 VisitOMPExecutableDirective(D); 2732 } 2733 2734 void ASTStmtReader::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) { 2735 VisitStmt(D); 2736 VisitOMPExecutableDirective(D); 2737 } 2738 2739 void ASTStmtReader::VisitOMPFlushDirective(OMPFlushDirective *D) { 2740 VisitStmt(D); 2741 // The NumClauses field was read in ReadStmtFromStream. 2742 ++Idx; 2743 VisitOMPExecutableDirective(D); 2744 } 2745 2746 void ASTStmtReader::VisitOMPOrderedDirective(OMPOrderedDirective *D) { 2747 VisitStmt(D); 2748 // The NumClauses field was read in ReadStmtFromStream. 2749 ++Idx; 2750 VisitOMPExecutableDirective(D); 2751 } 2752 2753 void ASTStmtReader::VisitOMPAtomicDirective(OMPAtomicDirective *D) { 2754 VisitStmt(D); 2755 // The NumClauses field was read in ReadStmtFromStream. 2756 ++Idx; 2757 VisitOMPExecutableDirective(D); 2758 D->setX(Reader.ReadSubExpr()); 2759 D->setV(Reader.ReadSubExpr()); 2760 D->setExpr(Reader.ReadSubExpr()); 2761 D->setUpdateExpr(Reader.ReadSubExpr()); 2762 D->IsXLHSInRHSPart = Record[Idx++] != 0; 2763 D->IsPostfixUpdate = Record[Idx++] != 0; 2764 } 2765 2766 void ASTStmtReader::VisitOMPTargetDirective(OMPTargetDirective *D) { 2767 VisitStmt(D); 2768 // The NumClauses field was read in ReadStmtFromStream. 2769 ++Idx; 2770 VisitOMPExecutableDirective(D); 2771 } 2772 2773 void ASTStmtReader::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) { 2774 VisitStmt(D); 2775 ++Idx; 2776 VisitOMPExecutableDirective(D); 2777 } 2778 2779 void ASTStmtReader::VisitOMPTargetEnterDataDirective( 2780 OMPTargetEnterDataDirective *D) { 2781 VisitStmt(D); 2782 ++Idx; 2783 VisitOMPExecutableDirective(D); 2784 } 2785 2786 void ASTStmtReader::VisitOMPTargetExitDataDirective( 2787 OMPTargetExitDataDirective *D) { 2788 VisitStmt(D); 2789 ++Idx; 2790 VisitOMPExecutableDirective(D); 2791 } 2792 2793 void ASTStmtReader::VisitOMPTargetParallelDirective( 2794 OMPTargetParallelDirective *D) { 2795 VisitStmt(D); 2796 ++Idx; 2797 VisitOMPExecutableDirective(D); 2798 } 2799 2800 void ASTStmtReader::VisitOMPTargetParallelForDirective( 2801 OMPTargetParallelForDirective *D) { 2802 VisitOMPLoopDirective(D); 2803 D->setHasCancel(Record[Idx++]); 2804 } 2805 2806 void ASTStmtReader::VisitOMPTeamsDirective(OMPTeamsDirective *D) { 2807 VisitStmt(D); 2808 // The NumClauses field was read in ReadStmtFromStream. 2809 ++Idx; 2810 VisitOMPExecutableDirective(D); 2811 } 2812 2813 void ASTStmtReader::VisitOMPCancellationPointDirective( 2814 OMPCancellationPointDirective *D) { 2815 VisitStmt(D); 2816 VisitOMPExecutableDirective(D); 2817 D->setCancelRegion(static_cast<OpenMPDirectiveKind>(Record[Idx++])); 2818 } 2819 2820 void ASTStmtReader::VisitOMPCancelDirective(OMPCancelDirective *D) { 2821 VisitStmt(D); 2822 // The NumClauses field was read in ReadStmtFromStream. 2823 ++Idx; 2824 VisitOMPExecutableDirective(D); 2825 D->setCancelRegion(static_cast<OpenMPDirectiveKind>(Record[Idx++])); 2826 } 2827 2828 void ASTStmtReader::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 2829 VisitOMPLoopDirective(D); 2830 } 2831 2832 void ASTStmtReader::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) { 2833 VisitOMPLoopDirective(D); 2834 } 2835 2836 void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective *D) { 2837 VisitOMPLoopDirective(D); 2838 } 2839 2840 void ASTStmtReader::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) { 2841 VisitStmt(D); 2842 ++Idx; 2843 VisitOMPExecutableDirective(D); 2844 } 2845 void ASTStmtReader::VisitOMPDistributeParallelForDirective( 2846 OMPDistributeParallelForDirective *D) { 2847 VisitOMPLoopDirective(D); 2848 } 2849 2850 void ASTStmtReader::VisitOMPDistributeParallelForSimdDirective( 2851 OMPDistributeParallelForSimdDirective *D) { 2852 VisitOMPLoopDirective(D); 2853 } 2854 2855 void ASTStmtReader::VisitOMPDistributeSimdDirective( 2856 OMPDistributeSimdDirective *D) { 2857 VisitOMPLoopDirective(D); 2858 } 2859 2860 void ASTStmtReader::VisitOMPTargetParallelForSimdDirective( 2861 OMPTargetParallelForSimdDirective *D) { 2862 VisitOMPLoopDirective(D); 2863 } 2864 2865 void ASTStmtReader::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *D) { 2866 VisitOMPLoopDirective(D); 2867 } 2868 2869 void ASTStmtReader::VisitOMPTeamsDistributeDirective( 2870 OMPTeamsDistributeDirective *D) { 2871 VisitOMPLoopDirective(D); 2872 } 2873 2874 //===----------------------------------------------------------------------===// 2875 // ASTReader Implementation 2876 //===----------------------------------------------------------------------===// 2877 2878 Stmt *ASTReader::ReadStmt(ModuleFile &F) { 2879 switch (ReadingKind) { 2880 case Read_None: 2881 llvm_unreachable("should not call this when not reading anything"); 2882 case Read_Decl: 2883 case Read_Type: 2884 return ReadStmtFromStream(F); 2885 case Read_Stmt: 2886 return ReadSubStmt(); 2887 } 2888 2889 llvm_unreachable("ReadingKind not set ?"); 2890 } 2891 2892 Expr *ASTReader::ReadExpr(ModuleFile &F) { 2893 return cast_or_null<Expr>(ReadStmt(F)); 2894 } 2895 2896 Expr *ASTReader::ReadSubExpr() { 2897 return cast_or_null<Expr>(ReadSubStmt()); 2898 } 2899 2900 // Within the bitstream, expressions are stored in Reverse Polish 2901 // Notation, with each of the subexpressions preceding the 2902 // expression they are stored in. Subexpressions are stored from last to first. 2903 // To evaluate expressions, we continue reading expressions and placing them on 2904 // the stack, with expressions having operands removing those operands from the 2905 // stack. Evaluation terminates when we see a STMT_STOP record, and 2906 // the single remaining expression on the stack is our result. 2907 Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) { 2908 2909 ReadingKindTracker ReadingKind(Read_Stmt, *this); 2910 llvm::BitstreamCursor &Cursor = F.DeclsCursor; 2911 2912 // Map of offset to previously deserialized stmt. The offset points 2913 /// just after the stmt record. 2914 llvm::DenseMap<uint64_t, Stmt *> StmtEntries; 2915 2916 #ifndef NDEBUG 2917 unsigned PrevNumStmts = StmtStack.size(); 2918 #endif 2919 2920 RecordData Record; 2921 unsigned Idx; 2922 ASTStmtReader Reader(*this, F, Cursor, Record, Idx); 2923 Stmt::EmptyShell Empty; 2924 2925 while (true) { 2926 llvm::BitstreamEntry Entry = Cursor.advanceSkippingSubblocks(); 2927 2928 switch (Entry.Kind) { 2929 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 2930 case llvm::BitstreamEntry::Error: 2931 Error("malformed block record in AST file"); 2932 return nullptr; 2933 case llvm::BitstreamEntry::EndBlock: 2934 goto Done; 2935 case llvm::BitstreamEntry::Record: 2936 // The interesting case. 2937 break; 2938 } 2939 2940 Stmt *S = nullptr; 2941 Idx = 0; 2942 Record.clear(); 2943 bool Finished = false; 2944 bool IsStmtReference = false; 2945 switch ((StmtCode)Cursor.readRecord(Entry.ID, Record)) { 2946 case STMT_STOP: 2947 Finished = true; 2948 break; 2949 2950 case STMT_REF_PTR: 2951 IsStmtReference = true; 2952 assert(StmtEntries.find(Record[0]) != StmtEntries.end() && 2953 "No stmt was recorded for this offset reference!"); 2954 S = StmtEntries[Record[Idx++]]; 2955 break; 2956 2957 case STMT_NULL_PTR: 2958 S = nullptr; 2959 break; 2960 2961 case STMT_NULL: 2962 S = new (Context) NullStmt(Empty); 2963 break; 2964 2965 case STMT_COMPOUND: 2966 S = new (Context) CompoundStmt(Empty); 2967 break; 2968 2969 case STMT_CASE: 2970 S = new (Context) CaseStmt(Empty); 2971 break; 2972 2973 case STMT_DEFAULT: 2974 S = new (Context) DefaultStmt(Empty); 2975 break; 2976 2977 case STMT_LABEL: 2978 S = new (Context) LabelStmt(Empty); 2979 break; 2980 2981 case STMT_ATTRIBUTED: 2982 S = AttributedStmt::CreateEmpty( 2983 Context, 2984 /*NumAttrs*/Record[ASTStmtReader::NumStmtFields]); 2985 break; 2986 2987 case STMT_IF: 2988 S = new (Context) IfStmt(Empty); 2989 break; 2990 2991 case STMT_SWITCH: 2992 S = new (Context) SwitchStmt(Empty); 2993 break; 2994 2995 case STMT_WHILE: 2996 S = new (Context) WhileStmt(Empty); 2997 break; 2998 2999 case STMT_DO: 3000 S = new (Context) DoStmt(Empty); 3001 break; 3002 3003 case STMT_FOR: 3004 S = new (Context) ForStmt(Empty); 3005 break; 3006 3007 case STMT_GOTO: 3008 S = new (Context) GotoStmt(Empty); 3009 break; 3010 3011 case STMT_INDIRECT_GOTO: 3012 S = new (Context) IndirectGotoStmt(Empty); 3013 break; 3014 3015 case STMT_CONTINUE: 3016 S = new (Context) ContinueStmt(Empty); 3017 break; 3018 3019 case STMT_BREAK: 3020 S = new (Context) BreakStmt(Empty); 3021 break; 3022 3023 case STMT_RETURN: 3024 S = new (Context) ReturnStmt(Empty); 3025 break; 3026 3027 case STMT_DECL: 3028 S = new (Context) DeclStmt(Empty); 3029 break; 3030 3031 case STMT_GCCASM: 3032 S = new (Context) GCCAsmStmt(Empty); 3033 break; 3034 3035 case STMT_MSASM: 3036 S = new (Context) MSAsmStmt(Empty); 3037 break; 3038 3039 case STMT_CAPTURED: 3040 S = CapturedStmt::CreateDeserialized(Context, 3041 Record[ASTStmtReader::NumStmtFields]); 3042 break; 3043 3044 case EXPR_PREDEFINED: 3045 S = new (Context) PredefinedExpr(Empty); 3046 break; 3047 3048 case EXPR_DECL_REF: 3049 S = DeclRefExpr::CreateEmpty( 3050 Context, 3051 /*HasQualifier=*/Record[ASTStmtReader::NumExprFields], 3052 /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1], 3053 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 2], 3054 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ? 3055 Record[ASTStmtReader::NumExprFields + 5] : 0); 3056 break; 3057 3058 case EXPR_INTEGER_LITERAL: 3059 S = IntegerLiteral::Create(Context, Empty); 3060 break; 3061 3062 case EXPR_FLOATING_LITERAL: 3063 S = FloatingLiteral::Create(Context, Empty); 3064 break; 3065 3066 case EXPR_IMAGINARY_LITERAL: 3067 S = new (Context) ImaginaryLiteral(Empty); 3068 break; 3069 3070 case EXPR_STRING_LITERAL: 3071 S = StringLiteral::CreateEmpty(Context, 3072 Record[ASTStmtReader::NumExprFields + 1]); 3073 break; 3074 3075 case EXPR_CHARACTER_LITERAL: 3076 S = new (Context) CharacterLiteral(Empty); 3077 break; 3078 3079 case EXPR_PAREN: 3080 S = new (Context) ParenExpr(Empty); 3081 break; 3082 3083 case EXPR_PAREN_LIST: 3084 S = new (Context) ParenListExpr(Empty); 3085 break; 3086 3087 case EXPR_UNARY_OPERATOR: 3088 S = new (Context) UnaryOperator(Empty); 3089 break; 3090 3091 case EXPR_OFFSETOF: 3092 S = OffsetOfExpr::CreateEmpty(Context, 3093 Record[ASTStmtReader::NumExprFields], 3094 Record[ASTStmtReader::NumExprFields + 1]); 3095 break; 3096 3097 case EXPR_SIZEOF_ALIGN_OF: 3098 S = new (Context) UnaryExprOrTypeTraitExpr(Empty); 3099 break; 3100 3101 case EXPR_ARRAY_SUBSCRIPT: 3102 S = new (Context) ArraySubscriptExpr(Empty); 3103 break; 3104 3105 case EXPR_OMP_ARRAY_SECTION: 3106 S = new (Context) OMPArraySectionExpr(Empty); 3107 break; 3108 3109 case EXPR_CALL: 3110 S = new (Context) CallExpr(Context, Stmt::CallExprClass, Empty); 3111 break; 3112 3113 case EXPR_MEMBER: { 3114 // We load everything here and fully initialize it at creation. 3115 // That way we can use MemberExpr::Create and don't have to duplicate its 3116 // logic with a MemberExpr::CreateEmpty. 3117 3118 assert(Idx == 0); 3119 NestedNameSpecifierLoc QualifierLoc; 3120 if (Record[Idx++]) { // HasQualifier. 3121 QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 3122 } 3123 3124 SourceLocation TemplateKWLoc; 3125 TemplateArgumentListInfo ArgInfo; 3126 bool HasTemplateKWAndArgsInfo = Record[Idx++]; 3127 if (HasTemplateKWAndArgsInfo) { 3128 TemplateKWLoc = ReadSourceLocation(F, Record, Idx); 3129 unsigned NumTemplateArgs = Record[Idx++]; 3130 ArgInfo.setLAngleLoc(ReadSourceLocation(F, Record, Idx)); 3131 ArgInfo.setRAngleLoc(ReadSourceLocation(F, Record, Idx)); 3132 for (unsigned i = 0; i != NumTemplateArgs; ++i) 3133 ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx)); 3134 } 3135 3136 bool HadMultipleCandidates = Record[Idx++]; 3137 3138 NamedDecl *FoundD = ReadDeclAs<NamedDecl>(F, Record, Idx); 3139 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 3140 DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS); 3141 3142 QualType T = readType(F, Record, Idx); 3143 ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]); 3144 ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]); 3145 Expr *Base = ReadSubExpr(); 3146 ValueDecl *MemberD = ReadDeclAs<ValueDecl>(F, Record, Idx); 3147 SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx); 3148 DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc); 3149 bool IsArrow = Record[Idx++]; 3150 SourceLocation OperatorLoc = ReadSourceLocation(F, Record, Idx); 3151 3152 S = MemberExpr::Create(Context, Base, IsArrow, OperatorLoc, QualifierLoc, 3153 TemplateKWLoc, MemberD, FoundDecl, MemberNameInfo, 3154 HasTemplateKWAndArgsInfo ? &ArgInfo : nullptr, T, 3155 VK, OK); 3156 ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc, 3157 MemberD->getDeclName(), Record, Idx); 3158 if (HadMultipleCandidates) 3159 cast<MemberExpr>(S)->setHadMultipleCandidates(true); 3160 break; 3161 } 3162 3163 case EXPR_BINARY_OPERATOR: 3164 S = new (Context) BinaryOperator(Empty); 3165 break; 3166 3167 case EXPR_COMPOUND_ASSIGN_OPERATOR: 3168 S = new (Context) CompoundAssignOperator(Empty); 3169 break; 3170 3171 case EXPR_CONDITIONAL_OPERATOR: 3172 S = new (Context) ConditionalOperator(Empty); 3173 break; 3174 3175 case EXPR_BINARY_CONDITIONAL_OPERATOR: 3176 S = new (Context) BinaryConditionalOperator(Empty); 3177 break; 3178 3179 case EXPR_IMPLICIT_CAST: 3180 S = ImplicitCastExpr::CreateEmpty(Context, 3181 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3182 break; 3183 3184 case EXPR_CSTYLE_CAST: 3185 S = CStyleCastExpr::CreateEmpty(Context, 3186 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3187 break; 3188 3189 case EXPR_COMPOUND_LITERAL: 3190 S = new (Context) CompoundLiteralExpr(Empty); 3191 break; 3192 3193 case EXPR_EXT_VECTOR_ELEMENT: 3194 S = new (Context) ExtVectorElementExpr(Empty); 3195 break; 3196 3197 case EXPR_INIT_LIST: 3198 S = new (Context) InitListExpr(Empty); 3199 break; 3200 3201 case EXPR_DESIGNATED_INIT: 3202 S = DesignatedInitExpr::CreateEmpty(Context, 3203 Record[ASTStmtReader::NumExprFields] - 1); 3204 3205 break; 3206 3207 case EXPR_DESIGNATED_INIT_UPDATE: 3208 S = new (Context) DesignatedInitUpdateExpr(Empty); 3209 break; 3210 3211 case EXPR_IMPLICIT_VALUE_INIT: 3212 S = new (Context) ImplicitValueInitExpr(Empty); 3213 break; 3214 3215 case EXPR_NO_INIT: 3216 S = new (Context) NoInitExpr(Empty); 3217 break; 3218 3219 case EXPR_VA_ARG: 3220 S = new (Context) VAArgExpr(Empty); 3221 break; 3222 3223 case EXPR_ADDR_LABEL: 3224 S = new (Context) AddrLabelExpr(Empty); 3225 break; 3226 3227 case EXPR_STMT: 3228 S = new (Context) StmtExpr(Empty); 3229 break; 3230 3231 case EXPR_CHOOSE: 3232 S = new (Context) ChooseExpr(Empty); 3233 break; 3234 3235 case EXPR_GNU_NULL: 3236 S = new (Context) GNUNullExpr(Empty); 3237 break; 3238 3239 case EXPR_SHUFFLE_VECTOR: 3240 S = new (Context) ShuffleVectorExpr(Empty); 3241 break; 3242 3243 case EXPR_CONVERT_VECTOR: 3244 S = new (Context) ConvertVectorExpr(Empty); 3245 break; 3246 3247 case EXPR_BLOCK: 3248 S = new (Context) BlockExpr(Empty); 3249 break; 3250 3251 case EXPR_GENERIC_SELECTION: 3252 S = new (Context) GenericSelectionExpr(Empty); 3253 break; 3254 3255 case EXPR_OBJC_STRING_LITERAL: 3256 S = new (Context) ObjCStringLiteral(Empty); 3257 break; 3258 case EXPR_OBJC_BOXED_EXPRESSION: 3259 S = new (Context) ObjCBoxedExpr(Empty); 3260 break; 3261 case EXPR_OBJC_ARRAY_LITERAL: 3262 S = ObjCArrayLiteral::CreateEmpty(Context, 3263 Record[ASTStmtReader::NumExprFields]); 3264 break; 3265 case EXPR_OBJC_DICTIONARY_LITERAL: 3266 S = ObjCDictionaryLiteral::CreateEmpty(Context, 3267 Record[ASTStmtReader::NumExprFields], 3268 Record[ASTStmtReader::NumExprFields + 1]); 3269 break; 3270 case EXPR_OBJC_ENCODE: 3271 S = new (Context) ObjCEncodeExpr(Empty); 3272 break; 3273 case EXPR_OBJC_SELECTOR_EXPR: 3274 S = new (Context) ObjCSelectorExpr(Empty); 3275 break; 3276 case EXPR_OBJC_PROTOCOL_EXPR: 3277 S = new (Context) ObjCProtocolExpr(Empty); 3278 break; 3279 case EXPR_OBJC_IVAR_REF_EXPR: 3280 S = new (Context) ObjCIvarRefExpr(Empty); 3281 break; 3282 case EXPR_OBJC_PROPERTY_REF_EXPR: 3283 S = new (Context) ObjCPropertyRefExpr(Empty); 3284 break; 3285 case EXPR_OBJC_SUBSCRIPT_REF_EXPR: 3286 S = new (Context) ObjCSubscriptRefExpr(Empty); 3287 break; 3288 case EXPR_OBJC_KVC_REF_EXPR: 3289 llvm_unreachable("mismatching AST file"); 3290 case EXPR_OBJC_MESSAGE_EXPR: 3291 S = ObjCMessageExpr::CreateEmpty(Context, 3292 Record[ASTStmtReader::NumExprFields], 3293 Record[ASTStmtReader::NumExprFields + 1]); 3294 break; 3295 case EXPR_OBJC_ISA: 3296 S = new (Context) ObjCIsaExpr(Empty); 3297 break; 3298 case EXPR_OBJC_INDIRECT_COPY_RESTORE: 3299 S = new (Context) ObjCIndirectCopyRestoreExpr(Empty); 3300 break; 3301 case EXPR_OBJC_BRIDGED_CAST: 3302 S = new (Context) ObjCBridgedCastExpr(Empty); 3303 break; 3304 case STMT_OBJC_FOR_COLLECTION: 3305 S = new (Context) ObjCForCollectionStmt(Empty); 3306 break; 3307 case STMT_OBJC_CATCH: 3308 S = new (Context) ObjCAtCatchStmt(Empty); 3309 break; 3310 case STMT_OBJC_FINALLY: 3311 S = new (Context) ObjCAtFinallyStmt(Empty); 3312 break; 3313 case STMT_OBJC_AT_TRY: 3314 S = ObjCAtTryStmt::CreateEmpty(Context, 3315 Record[ASTStmtReader::NumStmtFields], 3316 Record[ASTStmtReader::NumStmtFields + 1]); 3317 break; 3318 case STMT_OBJC_AT_SYNCHRONIZED: 3319 S = new (Context) ObjCAtSynchronizedStmt(Empty); 3320 break; 3321 case STMT_OBJC_AT_THROW: 3322 S = new (Context) ObjCAtThrowStmt(Empty); 3323 break; 3324 case STMT_OBJC_AUTORELEASE_POOL: 3325 S = new (Context) ObjCAutoreleasePoolStmt(Empty); 3326 break; 3327 case EXPR_OBJC_BOOL_LITERAL: 3328 S = new (Context) ObjCBoolLiteralExpr(Empty); 3329 break; 3330 case EXPR_OBJC_AVAILABILITY_CHECK: 3331 S = new (Context) ObjCAvailabilityCheckExpr(Empty); 3332 break; 3333 case STMT_SEH_LEAVE: 3334 S = new (Context) SEHLeaveStmt(Empty); 3335 break; 3336 case STMT_SEH_EXCEPT: 3337 S = new (Context) SEHExceptStmt(Empty); 3338 break; 3339 case STMT_SEH_FINALLY: 3340 S = new (Context) SEHFinallyStmt(Empty); 3341 break; 3342 case STMT_SEH_TRY: 3343 S = new (Context) SEHTryStmt(Empty); 3344 break; 3345 case STMT_CXX_CATCH: 3346 S = new (Context) CXXCatchStmt(Empty); 3347 break; 3348 3349 case STMT_CXX_TRY: 3350 S = CXXTryStmt::Create(Context, Empty, 3351 /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]); 3352 break; 3353 3354 case STMT_CXX_FOR_RANGE: 3355 S = new (Context) CXXForRangeStmt(Empty); 3356 break; 3357 3358 case STMT_MS_DEPENDENT_EXISTS: 3359 S = new (Context) MSDependentExistsStmt(SourceLocation(), true, 3360 NestedNameSpecifierLoc(), 3361 DeclarationNameInfo(), 3362 nullptr); 3363 break; 3364 3365 case STMT_OMP_PARALLEL_DIRECTIVE: 3366 S = 3367 OMPParallelDirective::CreateEmpty(Context, 3368 Record[ASTStmtReader::NumStmtFields], 3369 Empty); 3370 break; 3371 3372 case STMT_OMP_SIMD_DIRECTIVE: { 3373 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3374 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3375 S = OMPSimdDirective::CreateEmpty(Context, NumClauses, 3376 CollapsedNum, Empty); 3377 break; 3378 } 3379 3380 case STMT_OMP_FOR_DIRECTIVE: { 3381 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3382 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3383 S = OMPForDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3384 Empty); 3385 break; 3386 } 3387 3388 case STMT_OMP_FOR_SIMD_DIRECTIVE: { 3389 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3390 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3391 S = OMPForSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3392 Empty); 3393 break; 3394 } 3395 3396 case STMT_OMP_SECTIONS_DIRECTIVE: 3397 S = OMPSectionsDirective::CreateEmpty( 3398 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3399 break; 3400 3401 case STMT_OMP_SECTION_DIRECTIVE: 3402 S = OMPSectionDirective::CreateEmpty(Context, Empty); 3403 break; 3404 3405 case STMT_OMP_SINGLE_DIRECTIVE: 3406 S = OMPSingleDirective::CreateEmpty( 3407 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3408 break; 3409 3410 case STMT_OMP_MASTER_DIRECTIVE: 3411 S = OMPMasterDirective::CreateEmpty(Context, Empty); 3412 break; 3413 3414 case STMT_OMP_CRITICAL_DIRECTIVE: 3415 S = OMPCriticalDirective::CreateEmpty( 3416 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3417 break; 3418 3419 case STMT_OMP_PARALLEL_FOR_DIRECTIVE: { 3420 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3421 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3422 S = OMPParallelForDirective::CreateEmpty(Context, NumClauses, 3423 CollapsedNum, Empty); 3424 break; 3425 } 3426 3427 case STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE: { 3428 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3429 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3430 S = OMPParallelForSimdDirective::CreateEmpty(Context, NumClauses, 3431 CollapsedNum, Empty); 3432 break; 3433 } 3434 3435 case STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE: 3436 S = OMPParallelSectionsDirective::CreateEmpty( 3437 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3438 break; 3439 3440 case STMT_OMP_TASK_DIRECTIVE: 3441 S = OMPTaskDirective::CreateEmpty( 3442 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3443 break; 3444 3445 case STMT_OMP_TASKYIELD_DIRECTIVE: 3446 S = OMPTaskyieldDirective::CreateEmpty(Context, Empty); 3447 break; 3448 3449 case STMT_OMP_BARRIER_DIRECTIVE: 3450 S = OMPBarrierDirective::CreateEmpty(Context, Empty); 3451 break; 3452 3453 case STMT_OMP_TASKWAIT_DIRECTIVE: 3454 S = OMPTaskwaitDirective::CreateEmpty(Context, Empty); 3455 break; 3456 3457 case STMT_OMP_TASKGROUP_DIRECTIVE: 3458 S = OMPTaskgroupDirective::CreateEmpty(Context, Empty); 3459 break; 3460 3461 case STMT_OMP_FLUSH_DIRECTIVE: 3462 S = OMPFlushDirective::CreateEmpty( 3463 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3464 break; 3465 3466 case STMT_OMP_ORDERED_DIRECTIVE: 3467 S = OMPOrderedDirective::CreateEmpty( 3468 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3469 break; 3470 3471 case STMT_OMP_ATOMIC_DIRECTIVE: 3472 S = OMPAtomicDirective::CreateEmpty( 3473 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3474 break; 3475 3476 case STMT_OMP_TARGET_DIRECTIVE: 3477 S = OMPTargetDirective::CreateEmpty( 3478 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3479 break; 3480 3481 case STMT_OMP_TARGET_DATA_DIRECTIVE: 3482 S = OMPTargetDataDirective::CreateEmpty( 3483 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3484 break; 3485 3486 case STMT_OMP_TARGET_ENTER_DATA_DIRECTIVE: 3487 S = OMPTargetEnterDataDirective::CreateEmpty( 3488 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3489 break; 3490 3491 case STMT_OMP_TARGET_EXIT_DATA_DIRECTIVE: 3492 S = OMPTargetExitDataDirective::CreateEmpty( 3493 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3494 break; 3495 3496 case STMT_OMP_TARGET_PARALLEL_DIRECTIVE: 3497 S = OMPTargetParallelDirective::CreateEmpty( 3498 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3499 break; 3500 3501 case STMT_OMP_TARGET_PARALLEL_FOR_DIRECTIVE: { 3502 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3503 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3504 S = OMPTargetParallelForDirective::CreateEmpty(Context, NumClauses, 3505 CollapsedNum, Empty); 3506 break; 3507 } 3508 3509 case STMT_OMP_TARGET_UPDATE_DIRECTIVE: 3510 S = OMPTargetUpdateDirective::CreateEmpty( 3511 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3512 break; 3513 3514 case STMT_OMP_TEAMS_DIRECTIVE: 3515 S = OMPTeamsDirective::CreateEmpty( 3516 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3517 break; 3518 3519 case STMT_OMP_CANCELLATION_POINT_DIRECTIVE: 3520 S = OMPCancellationPointDirective::CreateEmpty(Context, Empty); 3521 break; 3522 3523 case STMT_OMP_CANCEL_DIRECTIVE: 3524 S = OMPCancelDirective::CreateEmpty( 3525 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3526 break; 3527 3528 case STMT_OMP_TASKLOOP_DIRECTIVE: { 3529 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3530 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3531 S = OMPTaskLoopDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3532 Empty); 3533 break; 3534 } 3535 3536 case STMT_OMP_TASKLOOP_SIMD_DIRECTIVE: { 3537 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3538 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3539 S = OMPTaskLoopSimdDirective::CreateEmpty(Context, NumClauses, 3540 CollapsedNum, Empty); 3541 break; 3542 } 3543 3544 case STMT_OMP_DISTRIBUTE_DIRECTIVE: { 3545 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3546 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3547 S = OMPDistributeDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3548 Empty); 3549 break; 3550 } 3551 3552 case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: { 3553 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3554 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3555 S = OMPDistributeParallelForDirective::CreateEmpty(Context, NumClauses, 3556 CollapsedNum, Empty); 3557 break; 3558 } 3559 3560 case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: { 3561 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3562 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3563 S = OMPDistributeParallelForSimdDirective::CreateEmpty(Context, NumClauses, 3564 CollapsedNum, 3565 Empty); 3566 break; 3567 } 3568 3569 case STMT_OMP_DISTRIBUTE_SIMD_DIRECTIVE: { 3570 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3571 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3572 S = OMPDistributeSimdDirective::CreateEmpty(Context, NumClauses, 3573 CollapsedNum, Empty); 3574 break; 3575 } 3576 3577 case STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE: { 3578 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3579 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3580 S = OMPTargetParallelForSimdDirective::CreateEmpty(Context, NumClauses, 3581 CollapsedNum, Empty); 3582 break; 3583 } 3584 3585 case STMT_OMP_TARGET_SIMD_DIRECTIVE: { 3586 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3587 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3588 S = OMPTargetSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3589 Empty); 3590 break; 3591 } 3592 3593 case STMT_OMP_TEAMS_DISTRIBUTE_DIRECTIVE: { 3594 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3595 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3596 S = OMPTeamsDistributeDirective::CreateEmpty(Context, NumClauses, 3597 CollapsedNum, Empty); 3598 break; 3599 } 3600 3601 case EXPR_CXX_OPERATOR_CALL: 3602 S = new (Context) CXXOperatorCallExpr(Context, Empty); 3603 break; 3604 3605 case EXPR_CXX_MEMBER_CALL: 3606 S = new (Context) CXXMemberCallExpr(Context, Empty); 3607 break; 3608 3609 case EXPR_CXX_CONSTRUCT: 3610 S = new (Context) CXXConstructExpr(Empty); 3611 break; 3612 3613 case EXPR_CXX_INHERITED_CTOR_INIT: 3614 S = new (Context) CXXInheritedCtorInitExpr(Empty); 3615 break; 3616 3617 case EXPR_CXX_TEMPORARY_OBJECT: 3618 S = new (Context) CXXTemporaryObjectExpr(Empty); 3619 break; 3620 3621 case EXPR_CXX_STATIC_CAST: 3622 S = CXXStaticCastExpr::CreateEmpty(Context, 3623 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3624 break; 3625 3626 case EXPR_CXX_DYNAMIC_CAST: 3627 S = CXXDynamicCastExpr::CreateEmpty(Context, 3628 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3629 break; 3630 3631 case EXPR_CXX_REINTERPRET_CAST: 3632 S = CXXReinterpretCastExpr::CreateEmpty(Context, 3633 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3634 break; 3635 3636 case EXPR_CXX_CONST_CAST: 3637 S = CXXConstCastExpr::CreateEmpty(Context); 3638 break; 3639 3640 case EXPR_CXX_FUNCTIONAL_CAST: 3641 S = CXXFunctionalCastExpr::CreateEmpty(Context, 3642 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3643 break; 3644 3645 case EXPR_USER_DEFINED_LITERAL: 3646 S = new (Context) UserDefinedLiteral(Context, Empty); 3647 break; 3648 3649 case EXPR_CXX_STD_INITIALIZER_LIST: 3650 S = new (Context) CXXStdInitializerListExpr(Empty); 3651 break; 3652 3653 case EXPR_CXX_BOOL_LITERAL: 3654 S = new (Context) CXXBoolLiteralExpr(Empty); 3655 break; 3656 3657 case EXPR_CXX_NULL_PTR_LITERAL: 3658 S = new (Context) CXXNullPtrLiteralExpr(Empty); 3659 break; 3660 case EXPR_CXX_TYPEID_EXPR: 3661 S = new (Context) CXXTypeidExpr(Empty, true); 3662 break; 3663 case EXPR_CXX_TYPEID_TYPE: 3664 S = new (Context) CXXTypeidExpr(Empty, false); 3665 break; 3666 case EXPR_CXX_UUIDOF_EXPR: 3667 S = new (Context) CXXUuidofExpr(Empty, true); 3668 break; 3669 case EXPR_CXX_PROPERTY_REF_EXPR: 3670 S = new (Context) MSPropertyRefExpr(Empty); 3671 break; 3672 case EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR: 3673 S = new (Context) MSPropertySubscriptExpr(Empty); 3674 break; 3675 case EXPR_CXX_UUIDOF_TYPE: 3676 S = new (Context) CXXUuidofExpr(Empty, false); 3677 break; 3678 case EXPR_CXX_THIS: 3679 S = new (Context) CXXThisExpr(Empty); 3680 break; 3681 case EXPR_CXX_THROW: 3682 S = new (Context) CXXThrowExpr(Empty); 3683 break; 3684 case EXPR_CXX_DEFAULT_ARG: 3685 S = new (Context) CXXDefaultArgExpr(Empty); 3686 break; 3687 case EXPR_CXX_DEFAULT_INIT: 3688 S = new (Context) CXXDefaultInitExpr(Empty); 3689 break; 3690 case EXPR_CXX_BIND_TEMPORARY: 3691 S = new (Context) CXXBindTemporaryExpr(Empty); 3692 break; 3693 3694 case EXPR_CXX_SCALAR_VALUE_INIT: 3695 S = new (Context) CXXScalarValueInitExpr(Empty); 3696 break; 3697 case EXPR_CXX_NEW: 3698 S = new (Context) CXXNewExpr(Empty); 3699 break; 3700 case EXPR_CXX_DELETE: 3701 S = new (Context) CXXDeleteExpr(Empty); 3702 break; 3703 case EXPR_CXX_PSEUDO_DESTRUCTOR: 3704 S = new (Context) CXXPseudoDestructorExpr(Empty); 3705 break; 3706 3707 case EXPR_EXPR_WITH_CLEANUPS: 3708 S = ExprWithCleanups::Create(Context, Empty, 3709 Record[ASTStmtReader::NumExprFields]); 3710 break; 3711 3712 case EXPR_CXX_DEPENDENT_SCOPE_MEMBER: 3713 S = CXXDependentScopeMemberExpr::CreateEmpty(Context, 3714 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 3715 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 3716 ? Record[ASTStmtReader::NumExprFields + 1] 3717 : 0); 3718 break; 3719 3720 case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF: 3721 S = DependentScopeDeclRefExpr::CreateEmpty(Context, 3722 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 3723 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 3724 ? Record[ASTStmtReader::NumExprFields + 1] 3725 : 0); 3726 break; 3727 3728 case EXPR_CXX_UNRESOLVED_CONSTRUCT: 3729 S = CXXUnresolvedConstructExpr::CreateEmpty(Context, 3730 /*NumArgs=*/Record[ASTStmtReader::NumExprFields]); 3731 break; 3732 3733 case EXPR_CXX_UNRESOLVED_MEMBER: 3734 S = UnresolvedMemberExpr::CreateEmpty(Context, 3735 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 3736 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 3737 ? Record[ASTStmtReader::NumExprFields + 1] 3738 : 0); 3739 break; 3740 3741 case EXPR_CXX_UNRESOLVED_LOOKUP: 3742 S = UnresolvedLookupExpr::CreateEmpty(Context, 3743 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 3744 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 3745 ? Record[ASTStmtReader::NumExprFields + 1] 3746 : 0); 3747 break; 3748 3749 case EXPR_TYPE_TRAIT: 3750 S = TypeTraitExpr::CreateDeserialized(Context, 3751 Record[ASTStmtReader::NumExprFields]); 3752 break; 3753 3754 case EXPR_ARRAY_TYPE_TRAIT: 3755 S = new (Context) ArrayTypeTraitExpr(Empty); 3756 break; 3757 3758 case EXPR_CXX_EXPRESSION_TRAIT: 3759 S = new (Context) ExpressionTraitExpr(Empty); 3760 break; 3761 3762 case EXPR_CXX_NOEXCEPT: 3763 S = new (Context) CXXNoexceptExpr(Empty); 3764 break; 3765 3766 case EXPR_PACK_EXPANSION: 3767 S = new (Context) PackExpansionExpr(Empty); 3768 break; 3769 3770 case EXPR_SIZEOF_PACK: 3771 S = SizeOfPackExpr::CreateDeserialized( 3772 Context, 3773 /*NumPartialArgs=*/Record[ASTStmtReader::NumExprFields]); 3774 break; 3775 3776 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM: 3777 S = new (Context) SubstNonTypeTemplateParmExpr(Empty); 3778 break; 3779 3780 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK: 3781 S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty); 3782 break; 3783 3784 case EXPR_FUNCTION_PARM_PACK: 3785 S = FunctionParmPackExpr::CreateEmpty(Context, 3786 Record[ASTStmtReader::NumExprFields]); 3787 break; 3788 3789 case EXPR_MATERIALIZE_TEMPORARY: 3790 S = new (Context) MaterializeTemporaryExpr(Empty); 3791 break; 3792 3793 case EXPR_CXX_FOLD: 3794 S = new (Context) CXXFoldExpr(Empty); 3795 break; 3796 3797 case EXPR_OPAQUE_VALUE: 3798 S = new (Context) OpaqueValueExpr(Empty); 3799 break; 3800 3801 case EXPR_CUDA_KERNEL_CALL: 3802 S = new (Context) CUDAKernelCallExpr(Context, Empty); 3803 break; 3804 3805 case EXPR_ASTYPE: 3806 S = new (Context) AsTypeExpr(Empty); 3807 break; 3808 3809 case EXPR_PSEUDO_OBJECT: { 3810 unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields]; 3811 S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs); 3812 break; 3813 } 3814 3815 case EXPR_ATOMIC: 3816 S = new (Context) AtomicExpr(Empty); 3817 break; 3818 3819 case EXPR_LAMBDA: { 3820 unsigned NumCaptures = Record[ASTStmtReader::NumExprFields]; 3821 unsigned NumArrayIndexVars = Record[ASTStmtReader::NumExprFields + 1]; 3822 S = LambdaExpr::CreateDeserialized(Context, NumCaptures, 3823 NumArrayIndexVars); 3824 break; 3825 } 3826 } 3827 3828 // We hit a STMT_STOP, so we're done with this expression. 3829 if (Finished) 3830 break; 3831 3832 ++NumStatementsRead; 3833 3834 if (S && !IsStmtReference) { 3835 Reader.Visit(S); 3836 StmtEntries[Cursor.GetCurrentBitNo()] = S; 3837 } 3838 3839 3840 assert(Idx == Record.size() && "Invalid deserialization of statement"); 3841 StmtStack.push_back(S); 3842 } 3843 Done: 3844 assert(StmtStack.size() > PrevNumStmts && "Read too many sub-stmts!"); 3845 assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!"); 3846 return StmtStack.pop_back_val(); 3847 } 3848