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::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) { 849 VisitExpr(E); 850 E->SubExprs[0] = Reader.ReadSubExpr(); 851 E->SubExprs[1] = Reader.ReadSubExpr(); 852 } 853 854 void ASTStmtReader::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) { 855 VisitExpr(E); 856 } 857 858 void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) { 859 VisitExpr(E); 860 } 861 862 void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) { 863 VisitExpr(E); 864 E->setSubExpr(Reader.ReadSubExpr()); 865 E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx)); 866 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 867 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 868 E->setIsMicrosoftABI(Record[Idx++]); 869 } 870 871 void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) { 872 VisitExpr(E); 873 E->setAmpAmpLoc(ReadSourceLocation(Record, Idx)); 874 E->setLabelLoc(ReadSourceLocation(Record, Idx)); 875 E->setLabel(ReadDeclAs<LabelDecl>(Record, Idx)); 876 } 877 878 void ASTStmtReader::VisitStmtExpr(StmtExpr *E) { 879 VisitExpr(E); 880 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 881 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 882 E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt())); 883 } 884 885 void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) { 886 VisitExpr(E); 887 E->setCond(Reader.ReadSubExpr()); 888 E->setLHS(Reader.ReadSubExpr()); 889 E->setRHS(Reader.ReadSubExpr()); 890 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 891 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 892 E->setIsConditionTrue(Record[Idx++]); 893 } 894 895 void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) { 896 VisitExpr(E); 897 E->setTokenLocation(ReadSourceLocation(Record, Idx)); 898 } 899 900 void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) { 901 VisitExpr(E); 902 SmallVector<Expr *, 16> Exprs; 903 unsigned NumExprs = Record[Idx++]; 904 while (NumExprs--) 905 Exprs.push_back(Reader.ReadSubExpr()); 906 E->setExprs(Reader.getContext(), Exprs); 907 E->setBuiltinLoc(ReadSourceLocation(Record, Idx)); 908 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 909 } 910 911 void ASTStmtReader::VisitConvertVectorExpr(ConvertVectorExpr *E) { 912 VisitExpr(E); 913 E->BuiltinLoc = ReadSourceLocation(Record, Idx); 914 E->RParenLoc = ReadSourceLocation(Record, Idx); 915 E->TInfo = GetTypeSourceInfo(Record, Idx); 916 E->SrcExpr = Reader.ReadSubExpr(); 917 } 918 919 void ASTStmtReader::VisitBlockExpr(BlockExpr *E) { 920 VisitExpr(E); 921 E->setBlockDecl(ReadDeclAs<BlockDecl>(Record, Idx)); 922 } 923 924 void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) { 925 VisitExpr(E); 926 E->NumAssocs = Record[Idx++]; 927 E->AssocTypes = new (Reader.getContext()) TypeSourceInfo*[E->NumAssocs]; 928 E->SubExprs = 929 new(Reader.getContext()) Stmt*[GenericSelectionExpr::END_EXPR+E->NumAssocs]; 930 931 E->SubExprs[GenericSelectionExpr::CONTROLLING] = Reader.ReadSubExpr(); 932 for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) { 933 E->AssocTypes[I] = GetTypeSourceInfo(Record, Idx); 934 E->SubExprs[GenericSelectionExpr::END_EXPR+I] = Reader.ReadSubExpr(); 935 } 936 E->ResultIndex = Record[Idx++]; 937 938 E->GenericLoc = ReadSourceLocation(Record, Idx); 939 E->DefaultLoc = ReadSourceLocation(Record, Idx); 940 E->RParenLoc = ReadSourceLocation(Record, Idx); 941 } 942 943 void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) { 944 VisitExpr(E); 945 unsigned numSemanticExprs = Record[Idx++]; 946 assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs); 947 E->PseudoObjectExprBits.ResultIndex = Record[Idx++]; 948 949 // Read the syntactic expression. 950 E->getSubExprsBuffer()[0] = Reader.ReadSubExpr(); 951 952 // Read all the semantic expressions. 953 for (unsigned i = 0; i != numSemanticExprs; ++i) { 954 Expr *subExpr = Reader.ReadSubExpr(); 955 E->getSubExprsBuffer()[i+1] = subExpr; 956 } 957 } 958 959 void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) { 960 VisitExpr(E); 961 E->Op = AtomicExpr::AtomicOp(Record[Idx++]); 962 E->NumSubExprs = AtomicExpr::getNumSubExprs(E->Op); 963 for (unsigned I = 0; I != E->NumSubExprs; ++I) 964 E->SubExprs[I] = Reader.ReadSubExpr(); 965 E->BuiltinLoc = ReadSourceLocation(Record, Idx); 966 E->RParenLoc = ReadSourceLocation(Record, Idx); 967 } 968 969 //===----------------------------------------------------------------------===// 970 // Objective-C Expressions and Statements 971 972 void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) { 973 VisitExpr(E); 974 E->setString(cast<StringLiteral>(Reader.ReadSubStmt())); 975 E->setAtLoc(ReadSourceLocation(Record, Idx)); 976 } 977 978 void ASTStmtReader::VisitObjCBoxedExpr(ObjCBoxedExpr *E) { 979 VisitExpr(E); 980 // could be one of several IntegerLiteral, FloatLiteral, etc. 981 E->SubExpr = Reader.ReadSubStmt(); 982 E->BoxingMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 983 E->Range = ReadSourceRange(Record, Idx); 984 } 985 986 void ASTStmtReader::VisitObjCArrayLiteral(ObjCArrayLiteral *E) { 987 VisitExpr(E); 988 unsigned NumElements = Record[Idx++]; 989 assert(NumElements == E->getNumElements() && "Wrong number of elements"); 990 Expr **Elements = E->getElements(); 991 for (unsigned I = 0, N = NumElements; I != N; ++I) 992 Elements[I] = Reader.ReadSubExpr(); 993 E->ArrayWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 994 E->Range = ReadSourceRange(Record, Idx); 995 } 996 997 void ASTStmtReader::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) { 998 VisitExpr(E); 999 unsigned NumElements = Record[Idx++]; 1000 assert(NumElements == E->getNumElements() && "Wrong number of elements"); 1001 bool HasPackExpansions = Record[Idx++]; 1002 assert(HasPackExpansions == E->HasPackExpansions &&"Pack expansion mismatch"); 1003 ObjCDictionaryLiteral::KeyValuePair *KeyValues = 1004 E->getTrailingObjects<ObjCDictionaryLiteral::KeyValuePair>(); 1005 ObjCDictionaryLiteral::ExpansionData *Expansions = 1006 E->getTrailingObjects<ObjCDictionaryLiteral::ExpansionData>(); 1007 for (unsigned I = 0; I != NumElements; ++I) { 1008 KeyValues[I].Key = Reader.ReadSubExpr(); 1009 KeyValues[I].Value = Reader.ReadSubExpr(); 1010 if (HasPackExpansions) { 1011 Expansions[I].EllipsisLoc = ReadSourceLocation(Record, Idx); 1012 Expansions[I].NumExpansionsPlusOne = Record[Idx++]; 1013 } 1014 } 1015 E->DictWithObjectsMethod = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 1016 E->Range = ReadSourceRange(Record, Idx); 1017 } 1018 1019 void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) { 1020 VisitExpr(E); 1021 E->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record, Idx)); 1022 E->setAtLoc(ReadSourceLocation(Record, Idx)); 1023 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1024 } 1025 1026 void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) { 1027 VisitExpr(E); 1028 E->setSelector(Reader.ReadSelector(F, Record, Idx)); 1029 E->setAtLoc(ReadSourceLocation(Record, Idx)); 1030 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1031 } 1032 1033 void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) { 1034 VisitExpr(E); 1035 E->setProtocol(ReadDeclAs<ObjCProtocolDecl>(Record, Idx)); 1036 E->setAtLoc(ReadSourceLocation(Record, Idx)); 1037 E->ProtoLoc = ReadSourceLocation(Record, Idx); 1038 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1039 } 1040 1041 void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { 1042 VisitExpr(E); 1043 E->setDecl(ReadDeclAs<ObjCIvarDecl>(Record, Idx)); 1044 E->setLocation(ReadSourceLocation(Record, Idx)); 1045 E->setOpLoc(ReadSourceLocation(Record, Idx)); 1046 E->setBase(Reader.ReadSubExpr()); 1047 E->setIsArrow(Record[Idx++]); 1048 E->setIsFreeIvar(Record[Idx++]); 1049 } 1050 1051 void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 1052 VisitExpr(E); 1053 unsigned MethodRefFlags = Record[Idx++]; 1054 bool Implicit = Record[Idx++] != 0; 1055 if (Implicit) { 1056 ObjCMethodDecl *Getter = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 1057 ObjCMethodDecl *Setter = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 1058 E->setImplicitProperty(Getter, Setter, MethodRefFlags); 1059 } else { 1060 E->setExplicitProperty(ReadDeclAs<ObjCPropertyDecl>(Record, Idx), 1061 MethodRefFlags); 1062 } 1063 E->setLocation(ReadSourceLocation(Record, Idx)); 1064 E->setReceiverLocation(ReadSourceLocation(Record, Idx)); 1065 switch (Record[Idx++]) { 1066 case 0: 1067 E->setBase(Reader.ReadSubExpr()); 1068 break; 1069 case 1: 1070 E->setSuperReceiver(Reader.readType(F, Record, Idx)); 1071 break; 1072 case 2: 1073 E->setClassReceiver(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx)); 1074 break; 1075 } 1076 } 1077 1078 void ASTStmtReader::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 1079 VisitExpr(E); 1080 E->setRBracket(ReadSourceLocation(Record, Idx)); 1081 E->setBaseExpr(Reader.ReadSubExpr()); 1082 E->setKeyExpr(Reader.ReadSubExpr()); 1083 E->GetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 1084 E->SetAtIndexMethodDecl = ReadDeclAs<ObjCMethodDecl>(Record, Idx); 1085 } 1086 1087 void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) { 1088 VisitExpr(E); 1089 assert(Record[Idx] == E->getNumArgs()); 1090 ++Idx; 1091 unsigned NumStoredSelLocs = Record[Idx++]; 1092 E->SelLocsKind = Record[Idx++]; 1093 E->setDelegateInitCall(Record[Idx++]); 1094 E->IsImplicit = Record[Idx++]; 1095 ObjCMessageExpr::ReceiverKind Kind 1096 = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]); 1097 switch (Kind) { 1098 case ObjCMessageExpr::Instance: 1099 E->setInstanceReceiver(Reader.ReadSubExpr()); 1100 break; 1101 1102 case ObjCMessageExpr::Class: 1103 E->setClassReceiver(GetTypeSourceInfo(Record, Idx)); 1104 break; 1105 1106 case ObjCMessageExpr::SuperClass: 1107 case ObjCMessageExpr::SuperInstance: { 1108 QualType T = Reader.readType(F, Record, Idx); 1109 SourceLocation SuperLoc = ReadSourceLocation(Record, Idx); 1110 E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance); 1111 break; 1112 } 1113 } 1114 1115 assert(Kind == E->getReceiverKind()); 1116 1117 if (Record[Idx++]) 1118 E->setMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx)); 1119 else 1120 E->setSelector(Reader.ReadSelector(F, Record, Idx)); 1121 1122 E->LBracLoc = ReadSourceLocation(Record, Idx); 1123 E->RBracLoc = ReadSourceLocation(Record, Idx); 1124 1125 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 1126 E->setArg(I, Reader.ReadSubExpr()); 1127 1128 SourceLocation *Locs = E->getStoredSelLocs(); 1129 for (unsigned I = 0; I != NumStoredSelLocs; ++I) 1130 Locs[I] = ReadSourceLocation(Record, Idx); 1131 } 1132 1133 void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) { 1134 VisitStmt(S); 1135 S->setElement(Reader.ReadSubStmt()); 1136 S->setCollection(Reader.ReadSubExpr()); 1137 S->setBody(Reader.ReadSubStmt()); 1138 S->setForLoc(ReadSourceLocation(Record, Idx)); 1139 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 1140 } 1141 1142 void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) { 1143 VisitStmt(S); 1144 S->setCatchBody(Reader.ReadSubStmt()); 1145 S->setCatchParamDecl(ReadDeclAs<VarDecl>(Record, Idx)); 1146 S->setAtCatchLoc(ReadSourceLocation(Record, Idx)); 1147 S->setRParenLoc(ReadSourceLocation(Record, Idx)); 1148 } 1149 1150 void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 1151 VisitStmt(S); 1152 S->setFinallyBody(Reader.ReadSubStmt()); 1153 S->setAtFinallyLoc(ReadSourceLocation(Record, Idx)); 1154 } 1155 1156 void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) { 1157 VisitStmt(S); 1158 S->setSubStmt(Reader.ReadSubStmt()); 1159 S->setAtLoc(ReadSourceLocation(Record, Idx)); 1160 } 1161 1162 void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) { 1163 VisitStmt(S); 1164 assert(Record[Idx] == S->getNumCatchStmts()); 1165 ++Idx; 1166 bool HasFinally = Record[Idx++]; 1167 S->setTryBody(Reader.ReadSubStmt()); 1168 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) 1169 S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt())); 1170 1171 if (HasFinally) 1172 S->setFinallyStmt(Reader.ReadSubStmt()); 1173 S->setAtTryLoc(ReadSourceLocation(Record, Idx)); 1174 } 1175 1176 void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) { 1177 VisitStmt(S); 1178 S->setSynchExpr(Reader.ReadSubStmt()); 1179 S->setSynchBody(Reader.ReadSubStmt()); 1180 S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx)); 1181 } 1182 1183 void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) { 1184 VisitStmt(S); 1185 S->setThrowExpr(Reader.ReadSubStmt()); 1186 S->setThrowLoc(ReadSourceLocation(Record, Idx)); 1187 } 1188 1189 void ASTStmtReader::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 1190 VisitExpr(E); 1191 E->setValue(Record[Idx++]); 1192 E->setLocation(ReadSourceLocation(Record, Idx)); 1193 } 1194 1195 void ASTStmtReader::VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr *E) { 1196 VisitExpr(E); 1197 SourceRange R = Reader.ReadSourceRange(F, Record, Idx); 1198 E->AtLoc = R.getBegin(); 1199 E->RParen = R.getEnd(); 1200 E->VersionToCheck = Reader.ReadVersionTuple(Record, Idx); 1201 } 1202 1203 //===----------------------------------------------------------------------===// 1204 // C++ Expressions and Statements 1205 //===----------------------------------------------------------------------===// 1206 1207 void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) { 1208 VisitStmt(S); 1209 S->CatchLoc = ReadSourceLocation(Record, Idx); 1210 S->ExceptionDecl = ReadDeclAs<VarDecl>(Record, Idx); 1211 S->HandlerBlock = Reader.ReadSubStmt(); 1212 } 1213 1214 void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) { 1215 VisitStmt(S); 1216 assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?"); 1217 ++Idx; 1218 S->TryLoc = ReadSourceLocation(Record, Idx); 1219 S->getStmts()[0] = Reader.ReadSubStmt(); 1220 for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i) 1221 S->getStmts()[i + 1] = Reader.ReadSubStmt(); 1222 } 1223 1224 void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) { 1225 VisitStmt(S); 1226 S->ForLoc = ReadSourceLocation(Record, Idx); 1227 S->CoawaitLoc = ReadSourceLocation(Record, Idx); 1228 S->ColonLoc = ReadSourceLocation(Record, Idx); 1229 S->RParenLoc = ReadSourceLocation(Record, Idx); 1230 S->setRangeStmt(Reader.ReadSubStmt()); 1231 S->setBeginStmt(Reader.ReadSubStmt()); 1232 S->setEndStmt(Reader.ReadSubStmt()); 1233 S->setCond(Reader.ReadSubExpr()); 1234 S->setInc(Reader.ReadSubExpr()); 1235 S->setLoopVarStmt(Reader.ReadSubStmt()); 1236 S->setBody(Reader.ReadSubStmt()); 1237 } 1238 1239 void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) { 1240 VisitStmt(S); 1241 S->KeywordLoc = ReadSourceLocation(Record, Idx); 1242 S->IsIfExists = Record[Idx++]; 1243 S->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1244 ReadDeclarationNameInfo(S->NameInfo, Record, Idx); 1245 S->SubStmt = Reader.ReadSubStmt(); 1246 } 1247 1248 void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 1249 VisitCallExpr(E); 1250 E->Operator = (OverloadedOperatorKind)Record[Idx++]; 1251 E->Range = Reader.ReadSourceRange(F, Record, Idx); 1252 E->setFPContractable((bool)Record[Idx++]); 1253 } 1254 1255 void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) { 1256 VisitExpr(E); 1257 E->NumArgs = Record[Idx++]; 1258 if (E->NumArgs) 1259 E->Args = new (Reader.getContext()) Stmt*[E->NumArgs]; 1260 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 1261 E->setArg(I, Reader.ReadSubExpr()); 1262 E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx)); 1263 E->setLocation(ReadSourceLocation(Record, Idx)); 1264 E->setElidable(Record[Idx++]); 1265 E->setHadMultipleCandidates(Record[Idx++]); 1266 E->setListInitialization(Record[Idx++]); 1267 E->setStdInitListInitialization(Record[Idx++]); 1268 E->setRequiresZeroInitialization(Record[Idx++]); 1269 E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]); 1270 E->ParenOrBraceRange = ReadSourceRange(Record, Idx); 1271 } 1272 1273 void ASTStmtReader::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) { 1274 VisitExpr(E); 1275 E->Constructor = ReadDeclAs<CXXConstructorDecl>(Record, Idx); 1276 E->Loc = ReadSourceLocation(Record, Idx); 1277 E->ConstructsVirtualBase = Record[Idx++]; 1278 E->InheritedFromVirtualBase = Record[Idx++]; 1279 } 1280 1281 void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) { 1282 VisitCXXConstructExpr(E); 1283 E->Type = GetTypeSourceInfo(Record, Idx); 1284 } 1285 1286 void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) { 1287 VisitExpr(E); 1288 unsigned NumCaptures = Record[Idx++]; 1289 assert(NumCaptures == E->NumCaptures);(void)NumCaptures; 1290 unsigned NumArrayIndexVars = Record[Idx++]; 1291 E->IntroducerRange = ReadSourceRange(Record, Idx); 1292 E->CaptureDefault = static_cast<LambdaCaptureDefault>(Record[Idx++]); 1293 E->CaptureDefaultLoc = ReadSourceLocation(Record, Idx); 1294 E->ExplicitParams = Record[Idx++]; 1295 E->ExplicitResultType = Record[Idx++]; 1296 E->ClosingBrace = ReadSourceLocation(Record, Idx); 1297 1298 // Read capture initializers. 1299 for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(), 1300 CEnd = E->capture_init_end(); 1301 C != CEnd; ++C) 1302 *C = Reader.ReadSubExpr(); 1303 1304 // Read array capture index variables. 1305 if (NumArrayIndexVars > 0) { 1306 unsigned *ArrayIndexStarts = E->getArrayIndexStarts(); 1307 for (unsigned I = 0; I != NumCaptures + 1; ++I) 1308 ArrayIndexStarts[I] = Record[Idx++]; 1309 1310 VarDecl **ArrayIndexVars = E->getArrayIndexVars(); 1311 for (unsigned I = 0; I != NumArrayIndexVars; ++I) 1312 ArrayIndexVars[I] = ReadDeclAs<VarDecl>(Record, Idx); 1313 } 1314 } 1315 1316 void 1317 ASTStmtReader::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) { 1318 VisitExpr(E); 1319 E->SubExpr = Reader.ReadSubExpr(); 1320 } 1321 1322 void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) { 1323 VisitExplicitCastExpr(E); 1324 SourceRange R = ReadSourceRange(Record, Idx); 1325 E->Loc = R.getBegin(); 1326 E->RParenLoc = R.getEnd(); 1327 R = ReadSourceRange(Record, Idx); 1328 E->AngleBrackets = R; 1329 } 1330 1331 void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) { 1332 return VisitCXXNamedCastExpr(E); 1333 } 1334 1335 void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 1336 return VisitCXXNamedCastExpr(E); 1337 } 1338 1339 void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) { 1340 return VisitCXXNamedCastExpr(E); 1341 } 1342 1343 void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) { 1344 return VisitCXXNamedCastExpr(E); 1345 } 1346 1347 void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) { 1348 VisitExplicitCastExpr(E); 1349 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 1350 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1351 } 1352 1353 void ASTStmtReader::VisitUserDefinedLiteral(UserDefinedLiteral *E) { 1354 VisitCallExpr(E); 1355 E->UDSuffixLoc = ReadSourceLocation(Record, Idx); 1356 } 1357 1358 void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 1359 VisitExpr(E); 1360 E->setValue(Record[Idx++]); 1361 E->setLocation(ReadSourceLocation(Record, Idx)); 1362 } 1363 1364 void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) { 1365 VisitExpr(E); 1366 E->setLocation(ReadSourceLocation(Record, Idx)); 1367 } 1368 1369 void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) { 1370 VisitExpr(E); 1371 E->setSourceRange(ReadSourceRange(Record, Idx)); 1372 if (E->isTypeOperand()) { // typeid(int) 1373 E->setTypeOperandSourceInfo( 1374 GetTypeSourceInfo(Record, Idx)); 1375 return; 1376 } 1377 1378 // typeid(42+2) 1379 E->setExprOperand(Reader.ReadSubExpr()); 1380 } 1381 1382 void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) { 1383 VisitExpr(E); 1384 E->setLocation(ReadSourceLocation(Record, Idx)); 1385 E->setImplicit(Record[Idx++]); 1386 } 1387 1388 void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) { 1389 VisitExpr(E); 1390 E->ThrowLoc = ReadSourceLocation(Record, Idx); 1391 E->Op = Reader.ReadSubExpr(); 1392 E->IsThrownVariableInScope = Record[Idx++]; 1393 } 1394 1395 void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 1396 VisitExpr(E); 1397 E->Param = ReadDeclAs<ParmVarDecl>(Record, Idx); 1398 E->Loc = ReadSourceLocation(Record, Idx); 1399 } 1400 1401 void ASTStmtReader::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 1402 VisitExpr(E); 1403 E->Field = ReadDeclAs<FieldDecl>(Record, Idx); 1404 E->Loc = ReadSourceLocation(Record, Idx); 1405 } 1406 1407 void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 1408 VisitExpr(E); 1409 E->setTemporary(Reader.ReadCXXTemporary(F, Record, Idx)); 1410 E->setSubExpr(Reader.ReadSubExpr()); 1411 } 1412 1413 void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) { 1414 VisitExpr(E); 1415 E->TypeInfo = GetTypeSourceInfo(Record, Idx); 1416 E->RParenLoc = ReadSourceLocation(Record, Idx); 1417 } 1418 1419 void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) { 1420 VisitExpr(E); 1421 E->GlobalNew = Record[Idx++]; 1422 bool isArray = Record[Idx++]; 1423 E->PassAlignment = Record[Idx++]; 1424 E->UsualArrayDeleteWantsSize = Record[Idx++]; 1425 unsigned NumPlacementArgs = Record[Idx++]; 1426 E->StoredInitializationStyle = Record[Idx++]; 1427 E->setOperatorNew(ReadDeclAs<FunctionDecl>(Record, Idx)); 1428 E->setOperatorDelete(ReadDeclAs<FunctionDecl>(Record, Idx)); 1429 E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx); 1430 E->TypeIdParens = ReadSourceRange(Record, Idx); 1431 E->Range = ReadSourceRange(Record, Idx); 1432 E->DirectInitRange = ReadSourceRange(Record, Idx); 1433 1434 E->AllocateArgsArray(Reader.getContext(), isArray, NumPlacementArgs, 1435 E->StoredInitializationStyle != 0); 1436 1437 // Install all the subexpressions. 1438 for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end(); 1439 I != e; ++I) 1440 *I = Reader.ReadSubStmt(); 1441 } 1442 1443 void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 1444 VisitExpr(E); 1445 E->GlobalDelete = Record[Idx++]; 1446 E->ArrayForm = Record[Idx++]; 1447 E->ArrayFormAsWritten = Record[Idx++]; 1448 E->UsualArrayDeleteWantsSize = Record[Idx++]; 1449 E->OperatorDelete = ReadDeclAs<FunctionDecl>(Record, Idx); 1450 E->Argument = Reader.ReadSubExpr(); 1451 E->Loc = ReadSourceLocation(Record, Idx); 1452 } 1453 1454 void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 1455 VisitExpr(E); 1456 1457 E->Base = Reader.ReadSubExpr(); 1458 E->IsArrow = Record[Idx++]; 1459 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1460 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1461 E->ScopeType = GetTypeSourceInfo(Record, Idx); 1462 E->ColonColonLoc = ReadSourceLocation(Record, Idx); 1463 E->TildeLoc = ReadSourceLocation(Record, Idx); 1464 1465 IdentifierInfo *II = Reader.GetIdentifierInfo(F, Record, Idx); 1466 if (II) 1467 E->setDestroyedType(II, ReadSourceLocation(Record, Idx)); 1468 else 1469 E->setDestroyedType(GetTypeSourceInfo(Record, Idx)); 1470 } 1471 1472 void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) { 1473 VisitExpr(E); 1474 1475 unsigned NumObjects = Record[Idx++]; 1476 assert(NumObjects == E->getNumObjects()); 1477 for (unsigned i = 0; i != NumObjects; ++i) 1478 E->getTrailingObjects<BlockDecl *>()[i] = 1479 ReadDeclAs<BlockDecl>(Record, Idx); 1480 1481 E->ExprWithCleanupsBits.CleanupsHaveSideEffects = Record[Idx++]; 1482 E->SubExpr = Reader.ReadSubExpr(); 1483 } 1484 1485 void 1486 ASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){ 1487 VisitExpr(E); 1488 1489 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 1490 ReadTemplateKWAndArgsInfo( 1491 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), 1492 E->getTrailingObjects<TemplateArgumentLoc>(), 1493 /*NumTemplateArgs=*/Record[Idx++]); 1494 1495 E->Base = Reader.ReadSubExpr(); 1496 E->BaseType = Reader.readType(F, Record, Idx); 1497 E->IsArrow = Record[Idx++]; 1498 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1499 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1500 E->FirstQualifierFoundInScope = ReadDeclAs<NamedDecl>(Record, Idx); 1501 ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx); 1502 } 1503 1504 void 1505 ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { 1506 VisitExpr(E); 1507 1508 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 1509 ReadTemplateKWAndArgsInfo( 1510 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), 1511 E->getTrailingObjects<TemplateArgumentLoc>(), 1512 /*NumTemplateArgs=*/Record[Idx++]); 1513 1514 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1515 ReadDeclarationNameInfo(E->NameInfo, Record, Idx); 1516 } 1517 1518 void 1519 ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) { 1520 VisitExpr(E); 1521 assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?"); 1522 ++Idx; // NumArgs; 1523 for (unsigned I = 0, N = E->arg_size(); I != N; ++I) 1524 E->setArg(I, Reader.ReadSubExpr()); 1525 E->Type = GetTypeSourceInfo(Record, Idx); 1526 E->setLParenLoc(ReadSourceLocation(Record, Idx)); 1527 E->setRParenLoc(ReadSourceLocation(Record, Idx)); 1528 } 1529 1530 void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) { 1531 VisitExpr(E); 1532 1533 if (Record[Idx++]) // HasTemplateKWAndArgsInfo 1534 ReadTemplateKWAndArgsInfo(*E->getTrailingASTTemplateKWAndArgsInfo(), 1535 E->getTrailingTemplateArgumentLoc(), 1536 /*NumTemplateArgs=*/Record[Idx++]); 1537 1538 unsigned NumDecls = Record[Idx++]; 1539 UnresolvedSet<8> Decls; 1540 for (unsigned i = 0; i != NumDecls; ++i) { 1541 NamedDecl *D = ReadDeclAs<NamedDecl>(Record, Idx); 1542 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 1543 Decls.addDecl(D, AS); 1544 } 1545 E->initializeResults(Reader.getContext(), Decls.begin(), Decls.end()); 1546 1547 ReadDeclarationNameInfo(E->NameInfo, Record, Idx); 1548 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1549 } 1550 1551 void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) { 1552 VisitOverloadExpr(E); 1553 E->IsArrow = Record[Idx++]; 1554 E->HasUnresolvedUsing = Record[Idx++]; 1555 E->Base = Reader.ReadSubExpr(); 1556 E->BaseType = Reader.readType(F, Record, Idx); 1557 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1558 } 1559 1560 void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) { 1561 VisitOverloadExpr(E); 1562 E->RequiresADL = Record[Idx++]; 1563 E->Overloaded = Record[Idx++]; 1564 E->NamingClass = ReadDeclAs<CXXRecordDecl>(Record, Idx); 1565 } 1566 1567 void ASTStmtReader::VisitTypeTraitExpr(TypeTraitExpr *E) { 1568 VisitExpr(E); 1569 E->TypeTraitExprBits.NumArgs = Record[Idx++]; 1570 E->TypeTraitExprBits.Kind = Record[Idx++]; 1571 E->TypeTraitExprBits.Value = Record[Idx++]; 1572 SourceRange Range = ReadSourceRange(Record, Idx); 1573 E->Loc = Range.getBegin(); 1574 E->RParenLoc = Range.getEnd(); 1575 1576 TypeSourceInfo **Args = E->getTrailingObjects<TypeSourceInfo *>(); 1577 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) 1578 Args[I] = GetTypeSourceInfo(Record, Idx); 1579 } 1580 1581 void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 1582 VisitExpr(E); 1583 E->ATT = (ArrayTypeTrait)Record[Idx++]; 1584 E->Value = (unsigned int)Record[Idx++]; 1585 SourceRange Range = ReadSourceRange(Record, Idx); 1586 E->Loc = Range.getBegin(); 1587 E->RParen = Range.getEnd(); 1588 E->QueriedType = GetTypeSourceInfo(Record, Idx); 1589 E->Dimension = Reader.ReadSubExpr(); 1590 } 1591 1592 void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 1593 VisitExpr(E); 1594 E->ET = (ExpressionTrait)Record[Idx++]; 1595 E->Value = (bool)Record[Idx++]; 1596 SourceRange Range = ReadSourceRange(Record, Idx); 1597 E->QueriedExpression = Reader.ReadSubExpr(); 1598 E->Loc = Range.getBegin(); 1599 E->RParen = Range.getEnd(); 1600 } 1601 1602 void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 1603 VisitExpr(E); 1604 E->Value = (bool)Record[Idx++]; 1605 E->Range = ReadSourceRange(Record, Idx); 1606 E->Operand = Reader.ReadSubExpr(); 1607 } 1608 1609 void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) { 1610 VisitExpr(E); 1611 E->EllipsisLoc = ReadSourceLocation(Record, Idx); 1612 E->NumExpansions = Record[Idx++]; 1613 E->Pattern = Reader.ReadSubExpr(); 1614 } 1615 1616 void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) { 1617 VisitExpr(E); 1618 unsigned NumPartialArgs = Record[Idx++]; 1619 E->OperatorLoc = ReadSourceLocation(Record, Idx); 1620 E->PackLoc = ReadSourceLocation(Record, Idx); 1621 E->RParenLoc = ReadSourceLocation(Record, Idx); 1622 E->Pack = Reader.ReadDeclAs<NamedDecl>(F, Record, Idx); 1623 if (E->isPartiallySubstituted()) { 1624 assert(E->Length == NumPartialArgs); 1625 for (auto *I = E->getTrailingObjects<TemplateArgument>(), 1626 *E = I + NumPartialArgs; 1627 I != E; ++I) 1628 new (I) TemplateArgument(Reader.ReadTemplateArgument(F, Record, Idx)); 1629 } else if (!E->isValueDependent()) { 1630 E->Length = Record[Idx++]; 1631 } 1632 } 1633 1634 void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr( 1635 SubstNonTypeTemplateParmExpr *E) { 1636 VisitExpr(E); 1637 E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx); 1638 E->NameLoc = ReadSourceLocation(Record, Idx); 1639 E->Replacement = Reader.ReadSubExpr(); 1640 } 1641 1642 void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr( 1643 SubstNonTypeTemplateParmPackExpr *E) { 1644 VisitExpr(E); 1645 E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx); 1646 TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx); 1647 if (ArgPack.getKind() != TemplateArgument::Pack) 1648 return; 1649 1650 E->Arguments = ArgPack.pack_begin(); 1651 E->NumArguments = ArgPack.pack_size(); 1652 E->NameLoc = ReadSourceLocation(Record, Idx); 1653 } 1654 1655 void ASTStmtReader::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) { 1656 VisitExpr(E); 1657 E->NumParameters = Record[Idx++]; 1658 E->ParamPack = ReadDeclAs<ParmVarDecl>(Record, Idx); 1659 E->NameLoc = ReadSourceLocation(Record, Idx); 1660 ParmVarDecl **Parms = E->getTrailingObjects<ParmVarDecl *>(); 1661 for (unsigned i = 0, n = E->NumParameters; i != n; ++i) 1662 Parms[i] = ReadDeclAs<ParmVarDecl>(Record, Idx); 1663 } 1664 1665 void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) { 1666 VisitExpr(E); 1667 E->State = Reader.ReadSubExpr(); 1668 auto VD = ReadDeclAs<ValueDecl>(Record, Idx); 1669 unsigned ManglingNumber = Record[Idx++]; 1670 E->setExtendingDecl(VD, ManglingNumber); 1671 } 1672 1673 void ASTStmtReader::VisitCXXFoldExpr(CXXFoldExpr *E) { 1674 VisitExpr(E); 1675 E->LParenLoc = ReadSourceLocation(Record, Idx); 1676 E->EllipsisLoc = ReadSourceLocation(Record, Idx); 1677 E->RParenLoc = ReadSourceLocation(Record, Idx); 1678 E->SubExprs[0] = Reader.ReadSubExpr(); 1679 E->SubExprs[1] = Reader.ReadSubExpr(); 1680 E->Opcode = (BinaryOperatorKind)Record[Idx++]; 1681 } 1682 1683 void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) { 1684 VisitExpr(E); 1685 E->SourceExpr = Reader.ReadSubExpr(); 1686 E->Loc = ReadSourceLocation(Record, Idx); 1687 } 1688 1689 void ASTStmtReader::VisitTypoExpr(TypoExpr *E) { 1690 llvm_unreachable("Cannot read TypoExpr nodes"); 1691 } 1692 1693 //===----------------------------------------------------------------------===// 1694 // Microsoft Expressions and Statements 1695 //===----------------------------------------------------------------------===// 1696 void ASTStmtReader::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) { 1697 VisitExpr(E); 1698 E->IsArrow = (Record[Idx++] != 0); 1699 E->BaseExpr = Reader.ReadSubExpr(); 1700 E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx); 1701 E->MemberLoc = ReadSourceLocation(Record, Idx); 1702 E->TheDecl = ReadDeclAs<MSPropertyDecl>(Record, Idx); 1703 } 1704 1705 void ASTStmtReader::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) { 1706 VisitExpr(E); 1707 E->setBase(Reader.ReadSubExpr()); 1708 E->setIdx(Reader.ReadSubExpr()); 1709 E->setRBracketLoc(ReadSourceLocation(Record, Idx)); 1710 } 1711 1712 void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) { 1713 VisitExpr(E); 1714 E->setSourceRange(ReadSourceRange(Record, Idx)); 1715 std::string UuidStr = ReadString(Record, Idx); 1716 E->setUuidStr(StringRef(UuidStr).copy(Reader.getContext())); 1717 if (E->isTypeOperand()) { // __uuidof(ComType) 1718 E->setTypeOperandSourceInfo( 1719 GetTypeSourceInfo(Record, Idx)); 1720 return; 1721 } 1722 1723 // __uuidof(expr) 1724 E->setExprOperand(Reader.ReadSubExpr()); 1725 } 1726 1727 void ASTStmtReader::VisitSEHLeaveStmt(SEHLeaveStmt *S) { 1728 VisitStmt(S); 1729 S->setLeaveLoc(ReadSourceLocation(Record, Idx)); 1730 } 1731 1732 void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) { 1733 VisitStmt(S); 1734 S->Loc = ReadSourceLocation(Record, Idx); 1735 S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt(); 1736 S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt(); 1737 } 1738 1739 void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) { 1740 VisitStmt(S); 1741 S->Loc = ReadSourceLocation(Record, Idx); 1742 S->Block = Reader.ReadSubStmt(); 1743 } 1744 1745 void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) { 1746 VisitStmt(S); 1747 S->IsCXXTry = Record[Idx++]; 1748 S->TryLoc = ReadSourceLocation(Record, Idx); 1749 S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt(); 1750 S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt(); 1751 } 1752 1753 //===----------------------------------------------------------------------===// 1754 // CUDA Expressions and Statements 1755 //===----------------------------------------------------------------------===// 1756 1757 void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 1758 VisitCallExpr(E); 1759 E->setConfig(cast<CallExpr>(Reader.ReadSubExpr())); 1760 } 1761 1762 //===----------------------------------------------------------------------===// 1763 // OpenCL Expressions and Statements. 1764 //===----------------------------------------------------------------------===// 1765 void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) { 1766 VisitExpr(E); 1767 E->BuiltinLoc = ReadSourceLocation(Record, Idx); 1768 E->RParenLoc = ReadSourceLocation(Record, Idx); 1769 E->SrcExpr = Reader.ReadSubExpr(); 1770 } 1771 1772 //===----------------------------------------------------------------------===// 1773 // OpenMP Clauses. 1774 //===----------------------------------------------------------------------===// 1775 1776 namespace clang { 1777 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 1778 ASTStmtReader *Reader; 1779 ASTContext &Context; 1780 const ASTReader::RecordData &Record; 1781 unsigned &Idx; 1782 public: 1783 OMPClauseReader(ASTStmtReader *R, ASTContext &C, 1784 const ASTReader::RecordData &Record, unsigned &Idx) 1785 : Reader(R), Context(C), Record(Record), Idx(Idx) { } 1786 #define OPENMP_CLAUSE(Name, Class) void Visit##Class(Class *C); 1787 #include "clang/Basic/OpenMPKinds.def" 1788 OMPClause *readClause(); 1789 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 1790 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 1791 }; 1792 } 1793 1794 OMPClause *OMPClauseReader::readClause() { 1795 OMPClause *C; 1796 switch (Record[Idx++]) { 1797 case OMPC_if: 1798 C = new (Context) OMPIfClause(); 1799 break; 1800 case OMPC_final: 1801 C = new (Context) OMPFinalClause(); 1802 break; 1803 case OMPC_num_threads: 1804 C = new (Context) OMPNumThreadsClause(); 1805 break; 1806 case OMPC_safelen: 1807 C = new (Context) OMPSafelenClause(); 1808 break; 1809 case OMPC_simdlen: 1810 C = new (Context) OMPSimdlenClause(); 1811 break; 1812 case OMPC_collapse: 1813 C = new (Context) OMPCollapseClause(); 1814 break; 1815 case OMPC_default: 1816 C = new (Context) OMPDefaultClause(); 1817 break; 1818 case OMPC_proc_bind: 1819 C = new (Context) OMPProcBindClause(); 1820 break; 1821 case OMPC_schedule: 1822 C = new (Context) OMPScheduleClause(); 1823 break; 1824 case OMPC_ordered: 1825 C = new (Context) OMPOrderedClause(); 1826 break; 1827 case OMPC_nowait: 1828 C = new (Context) OMPNowaitClause(); 1829 break; 1830 case OMPC_untied: 1831 C = new (Context) OMPUntiedClause(); 1832 break; 1833 case OMPC_mergeable: 1834 C = new (Context) OMPMergeableClause(); 1835 break; 1836 case OMPC_read: 1837 C = new (Context) OMPReadClause(); 1838 break; 1839 case OMPC_write: 1840 C = new (Context) OMPWriteClause(); 1841 break; 1842 case OMPC_update: 1843 C = new (Context) OMPUpdateClause(); 1844 break; 1845 case OMPC_capture: 1846 C = new (Context) OMPCaptureClause(); 1847 break; 1848 case OMPC_seq_cst: 1849 C = new (Context) OMPSeqCstClause(); 1850 break; 1851 case OMPC_threads: 1852 C = new (Context) OMPThreadsClause(); 1853 break; 1854 case OMPC_simd: 1855 C = new (Context) OMPSIMDClause(); 1856 break; 1857 case OMPC_nogroup: 1858 C = new (Context) OMPNogroupClause(); 1859 break; 1860 case OMPC_private: 1861 C = OMPPrivateClause::CreateEmpty(Context, Record[Idx++]); 1862 break; 1863 case OMPC_firstprivate: 1864 C = OMPFirstprivateClause::CreateEmpty(Context, Record[Idx++]); 1865 break; 1866 case OMPC_lastprivate: 1867 C = OMPLastprivateClause::CreateEmpty(Context, Record[Idx++]); 1868 break; 1869 case OMPC_shared: 1870 C = OMPSharedClause::CreateEmpty(Context, Record[Idx++]); 1871 break; 1872 case OMPC_reduction: 1873 C = OMPReductionClause::CreateEmpty(Context, Record[Idx++]); 1874 break; 1875 case OMPC_linear: 1876 C = OMPLinearClause::CreateEmpty(Context, Record[Idx++]); 1877 break; 1878 case OMPC_aligned: 1879 C = OMPAlignedClause::CreateEmpty(Context, Record[Idx++]); 1880 break; 1881 case OMPC_copyin: 1882 C = OMPCopyinClause::CreateEmpty(Context, Record[Idx++]); 1883 break; 1884 case OMPC_copyprivate: 1885 C = OMPCopyprivateClause::CreateEmpty(Context, Record[Idx++]); 1886 break; 1887 case OMPC_flush: 1888 C = OMPFlushClause::CreateEmpty(Context, Record[Idx++]); 1889 break; 1890 case OMPC_depend: 1891 C = OMPDependClause::CreateEmpty(Context, Record[Idx++]); 1892 break; 1893 case OMPC_device: 1894 C = new (Context) OMPDeviceClause(); 1895 break; 1896 case OMPC_map: { 1897 unsigned NumVars = Record[Idx++]; 1898 unsigned NumDeclarations = Record[Idx++]; 1899 unsigned NumLists = Record[Idx++]; 1900 unsigned NumComponents = Record[Idx++]; 1901 C = OMPMapClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists, 1902 NumComponents); 1903 break; 1904 } 1905 case OMPC_num_teams: 1906 C = new (Context) OMPNumTeamsClause(); 1907 break; 1908 case OMPC_thread_limit: 1909 C = new (Context) OMPThreadLimitClause(); 1910 break; 1911 case OMPC_priority: 1912 C = new (Context) OMPPriorityClause(); 1913 break; 1914 case OMPC_grainsize: 1915 C = new (Context) OMPGrainsizeClause(); 1916 break; 1917 case OMPC_num_tasks: 1918 C = new (Context) OMPNumTasksClause(); 1919 break; 1920 case OMPC_hint: 1921 C = new (Context) OMPHintClause(); 1922 break; 1923 case OMPC_dist_schedule: 1924 C = new (Context) OMPDistScheduleClause(); 1925 break; 1926 case OMPC_defaultmap: 1927 C = new (Context) OMPDefaultmapClause(); 1928 break; 1929 case OMPC_to: { 1930 unsigned NumVars = Record[Idx++]; 1931 unsigned NumDeclarations = Record[Idx++]; 1932 unsigned NumLists = Record[Idx++]; 1933 unsigned NumComponents = Record[Idx++]; 1934 C = OMPToClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists, 1935 NumComponents); 1936 break; 1937 } 1938 case OMPC_from: { 1939 unsigned NumVars = Record[Idx++]; 1940 unsigned NumDeclarations = Record[Idx++]; 1941 unsigned NumLists = Record[Idx++]; 1942 unsigned NumComponents = Record[Idx++]; 1943 C = OMPFromClause::CreateEmpty(Context, NumVars, NumDeclarations, NumLists, 1944 NumComponents); 1945 break; 1946 } 1947 case OMPC_use_device_ptr: { 1948 unsigned NumVars = Record[Idx++]; 1949 unsigned NumDeclarations = Record[Idx++]; 1950 unsigned NumLists = Record[Idx++]; 1951 unsigned NumComponents = Record[Idx++]; 1952 C = OMPUseDevicePtrClause::CreateEmpty(Context, NumVars, NumDeclarations, 1953 NumLists, NumComponents); 1954 break; 1955 } 1956 case OMPC_is_device_ptr: { 1957 unsigned NumVars = Record[Idx++]; 1958 unsigned NumDeclarations = Record[Idx++]; 1959 unsigned NumLists = Record[Idx++]; 1960 unsigned NumComponents = Record[Idx++]; 1961 C = OMPIsDevicePtrClause::CreateEmpty(Context, NumVars, NumDeclarations, 1962 NumLists, NumComponents); 1963 break; 1964 } 1965 } 1966 Visit(C); 1967 C->setLocStart(Reader->ReadSourceLocation(Record, Idx)); 1968 C->setLocEnd(Reader->ReadSourceLocation(Record, Idx)); 1969 1970 return C; 1971 } 1972 1973 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 1974 C->setPreInitStmt(Reader->Reader.ReadSubStmt()); 1975 } 1976 1977 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 1978 VisitOMPClauseWithPreInit(C); 1979 C->setPostUpdateExpr(Reader->Reader.ReadSubExpr()); 1980 } 1981 1982 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 1983 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record[Idx++])); 1984 C->setNameModifierLoc(Reader->ReadSourceLocation(Record, Idx)); 1985 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 1986 C->setCondition(Reader->Reader.ReadSubExpr()); 1987 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 1988 } 1989 1990 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 1991 C->setCondition(Reader->Reader.ReadSubExpr()); 1992 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 1993 } 1994 1995 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 1996 C->setNumThreads(Reader->Reader.ReadSubExpr()); 1997 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 1998 } 1999 2000 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 2001 C->setSafelen(Reader->Reader.ReadSubExpr()); 2002 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2003 } 2004 2005 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 2006 C->setSimdlen(Reader->Reader.ReadSubExpr()); 2007 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2008 } 2009 2010 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 2011 C->setNumForLoops(Reader->Reader.ReadSubExpr()); 2012 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2013 } 2014 2015 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 2016 C->setDefaultKind( 2017 static_cast<OpenMPDefaultClauseKind>(Record[Idx++])); 2018 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2019 C->setDefaultKindKwLoc(Reader->ReadSourceLocation(Record, Idx)); 2020 } 2021 2022 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 2023 C->setProcBindKind( 2024 static_cast<OpenMPProcBindClauseKind>(Record[Idx++])); 2025 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2026 C->setProcBindKindKwLoc(Reader->ReadSourceLocation(Record, Idx)); 2027 } 2028 2029 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 2030 VisitOMPClauseWithPreInit(C); 2031 C->setScheduleKind( 2032 static_cast<OpenMPScheduleClauseKind>(Record[Idx++])); 2033 C->setFirstScheduleModifier( 2034 static_cast<OpenMPScheduleClauseModifier>(Record[Idx++])); 2035 C->setSecondScheduleModifier( 2036 static_cast<OpenMPScheduleClauseModifier>(Record[Idx++])); 2037 C->setChunkSize(Reader->Reader.ReadSubExpr()); 2038 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2039 C->setFirstScheduleModifierLoc(Reader->ReadSourceLocation(Record, Idx)); 2040 C->setSecondScheduleModifierLoc(Reader->ReadSourceLocation(Record, Idx)); 2041 C->setScheduleKindLoc(Reader->ReadSourceLocation(Record, Idx)); 2042 C->setCommaLoc(Reader->ReadSourceLocation(Record, Idx)); 2043 } 2044 2045 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 2046 C->setNumForLoops(Reader->Reader.ReadSubExpr()); 2047 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2048 } 2049 2050 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 2051 2052 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 2053 2054 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 2055 2056 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 2057 2058 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 2059 2060 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {} 2061 2062 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 2063 2064 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 2065 2066 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 2067 2068 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 2069 2070 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 2071 2072 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 2073 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2074 unsigned NumVars = C->varlist_size(); 2075 SmallVector<Expr *, 16> Vars; 2076 Vars.reserve(NumVars); 2077 for (unsigned i = 0; i != NumVars; ++i) 2078 Vars.push_back(Reader->Reader.ReadSubExpr()); 2079 C->setVarRefs(Vars); 2080 Vars.clear(); 2081 for (unsigned i = 0; i != NumVars; ++i) 2082 Vars.push_back(Reader->Reader.ReadSubExpr()); 2083 C->setPrivateCopies(Vars); 2084 } 2085 2086 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 2087 VisitOMPClauseWithPreInit(C); 2088 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2089 unsigned NumVars = C->varlist_size(); 2090 SmallVector<Expr *, 16> Vars; 2091 Vars.reserve(NumVars); 2092 for (unsigned i = 0; i != NumVars; ++i) 2093 Vars.push_back(Reader->Reader.ReadSubExpr()); 2094 C->setVarRefs(Vars); 2095 Vars.clear(); 2096 for (unsigned i = 0; i != NumVars; ++i) 2097 Vars.push_back(Reader->Reader.ReadSubExpr()); 2098 C->setPrivateCopies(Vars); 2099 Vars.clear(); 2100 for (unsigned i = 0; i != NumVars; ++i) 2101 Vars.push_back(Reader->Reader.ReadSubExpr()); 2102 C->setInits(Vars); 2103 } 2104 2105 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 2106 VisitOMPClauseWithPostUpdate(C); 2107 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2108 unsigned NumVars = C->varlist_size(); 2109 SmallVector<Expr *, 16> Vars; 2110 Vars.reserve(NumVars); 2111 for (unsigned i = 0; i != NumVars; ++i) 2112 Vars.push_back(Reader->Reader.ReadSubExpr()); 2113 C->setVarRefs(Vars); 2114 Vars.clear(); 2115 for (unsigned i = 0; i != NumVars; ++i) 2116 Vars.push_back(Reader->Reader.ReadSubExpr()); 2117 C->setPrivateCopies(Vars); 2118 Vars.clear(); 2119 for (unsigned i = 0; i != NumVars; ++i) 2120 Vars.push_back(Reader->Reader.ReadSubExpr()); 2121 C->setSourceExprs(Vars); 2122 Vars.clear(); 2123 for (unsigned i = 0; i != NumVars; ++i) 2124 Vars.push_back(Reader->Reader.ReadSubExpr()); 2125 C->setDestinationExprs(Vars); 2126 Vars.clear(); 2127 for (unsigned i = 0; i != NumVars; ++i) 2128 Vars.push_back(Reader->Reader.ReadSubExpr()); 2129 C->setAssignmentOps(Vars); 2130 } 2131 2132 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 2133 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2134 unsigned NumVars = C->varlist_size(); 2135 SmallVector<Expr *, 16> Vars; 2136 Vars.reserve(NumVars); 2137 for (unsigned i = 0; i != NumVars; ++i) 2138 Vars.push_back(Reader->Reader.ReadSubExpr()); 2139 C->setVarRefs(Vars); 2140 } 2141 2142 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 2143 VisitOMPClauseWithPostUpdate(C); 2144 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2145 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 2146 NestedNameSpecifierLoc NNSL = 2147 Reader->Reader.ReadNestedNameSpecifierLoc(Reader->F, Record, Idx); 2148 DeclarationNameInfo DNI; 2149 Reader->ReadDeclarationNameInfo(DNI, Record, Idx); 2150 C->setQualifierLoc(NNSL); 2151 C->setNameInfo(DNI); 2152 2153 unsigned NumVars = C->varlist_size(); 2154 SmallVector<Expr *, 16> Vars; 2155 Vars.reserve(NumVars); 2156 for (unsigned i = 0; i != NumVars; ++i) 2157 Vars.push_back(Reader->Reader.ReadSubExpr()); 2158 C->setVarRefs(Vars); 2159 Vars.clear(); 2160 for (unsigned i = 0; i != NumVars; ++i) 2161 Vars.push_back(Reader->Reader.ReadSubExpr()); 2162 C->setPrivates(Vars); 2163 Vars.clear(); 2164 for (unsigned i = 0; i != NumVars; ++i) 2165 Vars.push_back(Reader->Reader.ReadSubExpr()); 2166 C->setLHSExprs(Vars); 2167 Vars.clear(); 2168 for (unsigned i = 0; i != NumVars; ++i) 2169 Vars.push_back(Reader->Reader.ReadSubExpr()); 2170 C->setRHSExprs(Vars); 2171 Vars.clear(); 2172 for (unsigned i = 0; i != NumVars; ++i) 2173 Vars.push_back(Reader->Reader.ReadSubExpr()); 2174 C->setReductionOps(Vars); 2175 } 2176 2177 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 2178 VisitOMPClauseWithPostUpdate(C); 2179 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2180 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 2181 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record[Idx++])); 2182 C->setModifierLoc(Reader->ReadSourceLocation(Record, Idx)); 2183 unsigned NumVars = C->varlist_size(); 2184 SmallVector<Expr *, 16> Vars; 2185 Vars.reserve(NumVars); 2186 for (unsigned i = 0; i != NumVars; ++i) 2187 Vars.push_back(Reader->Reader.ReadSubExpr()); 2188 C->setVarRefs(Vars); 2189 Vars.clear(); 2190 for (unsigned i = 0; i != NumVars; ++i) 2191 Vars.push_back(Reader->Reader.ReadSubExpr()); 2192 C->setPrivates(Vars); 2193 Vars.clear(); 2194 for (unsigned i = 0; i != NumVars; ++i) 2195 Vars.push_back(Reader->Reader.ReadSubExpr()); 2196 C->setInits(Vars); 2197 Vars.clear(); 2198 for (unsigned i = 0; i != NumVars; ++i) 2199 Vars.push_back(Reader->Reader.ReadSubExpr()); 2200 C->setUpdates(Vars); 2201 Vars.clear(); 2202 for (unsigned i = 0; i != NumVars; ++i) 2203 Vars.push_back(Reader->Reader.ReadSubExpr()); 2204 C->setFinals(Vars); 2205 C->setStep(Reader->Reader.ReadSubExpr()); 2206 C->setCalcStep(Reader->Reader.ReadSubExpr()); 2207 } 2208 2209 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 2210 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2211 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 2212 unsigned NumVars = C->varlist_size(); 2213 SmallVector<Expr *, 16> Vars; 2214 Vars.reserve(NumVars); 2215 for (unsigned i = 0; i != NumVars; ++i) 2216 Vars.push_back(Reader->Reader.ReadSubExpr()); 2217 C->setVarRefs(Vars); 2218 C->setAlignment(Reader->Reader.ReadSubExpr()); 2219 } 2220 2221 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 2222 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2223 unsigned NumVars = C->varlist_size(); 2224 SmallVector<Expr *, 16> Exprs; 2225 Exprs.reserve(NumVars); 2226 for (unsigned i = 0; i != NumVars; ++i) 2227 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2228 C->setVarRefs(Exprs); 2229 Exprs.clear(); 2230 for (unsigned i = 0; i != NumVars; ++i) 2231 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2232 C->setSourceExprs(Exprs); 2233 Exprs.clear(); 2234 for (unsigned i = 0; i != NumVars; ++i) 2235 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2236 C->setDestinationExprs(Exprs); 2237 Exprs.clear(); 2238 for (unsigned i = 0; i != NumVars; ++i) 2239 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2240 C->setAssignmentOps(Exprs); 2241 } 2242 2243 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 2244 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2245 unsigned NumVars = C->varlist_size(); 2246 SmallVector<Expr *, 16> Exprs; 2247 Exprs.reserve(NumVars); 2248 for (unsigned i = 0; i != NumVars; ++i) 2249 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2250 C->setVarRefs(Exprs); 2251 Exprs.clear(); 2252 for (unsigned i = 0; i != NumVars; ++i) 2253 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2254 C->setSourceExprs(Exprs); 2255 Exprs.clear(); 2256 for (unsigned i = 0; i != NumVars; ++i) 2257 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2258 C->setDestinationExprs(Exprs); 2259 Exprs.clear(); 2260 for (unsigned i = 0; i != NumVars; ++i) 2261 Exprs.push_back(Reader->Reader.ReadSubExpr()); 2262 C->setAssignmentOps(Exprs); 2263 } 2264 2265 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 2266 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2267 unsigned NumVars = C->varlist_size(); 2268 SmallVector<Expr *, 16> Vars; 2269 Vars.reserve(NumVars); 2270 for (unsigned i = 0; i != NumVars; ++i) 2271 Vars.push_back(Reader->Reader.ReadSubExpr()); 2272 C->setVarRefs(Vars); 2273 } 2274 2275 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 2276 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2277 C->setDependencyKind(static_cast<OpenMPDependClauseKind>(Record[Idx++])); 2278 C->setDependencyLoc(Reader->ReadSourceLocation(Record, Idx)); 2279 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 2280 unsigned NumVars = C->varlist_size(); 2281 SmallVector<Expr *, 16> Vars; 2282 Vars.reserve(NumVars); 2283 for (unsigned i = 0; i != NumVars; ++i) 2284 Vars.push_back(Reader->Reader.ReadSubExpr()); 2285 C->setVarRefs(Vars); 2286 C->setCounterValue(Reader->Reader.ReadSubExpr()); 2287 } 2288 2289 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 2290 C->setDevice(Reader->Reader.ReadSubExpr()); 2291 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2292 } 2293 2294 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 2295 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2296 C->setMapTypeModifier( 2297 static_cast<OpenMPMapClauseKind>(Record[Idx++])); 2298 C->setMapType( 2299 static_cast<OpenMPMapClauseKind>(Record[Idx++])); 2300 C->setMapLoc(Reader->ReadSourceLocation(Record, Idx)); 2301 C->setColonLoc(Reader->ReadSourceLocation(Record, Idx)); 2302 auto NumVars = C->varlist_size(); 2303 auto UniqueDecls = C->getUniqueDeclarationsNum(); 2304 auto TotalLists = C->getTotalComponentListNum(); 2305 auto TotalComponents = C->getTotalComponentsNum(); 2306 2307 SmallVector<Expr *, 16> Vars; 2308 Vars.reserve(NumVars); 2309 for (unsigned i = 0; i != NumVars; ++i) 2310 Vars.push_back(Reader->Reader.ReadSubExpr()); 2311 C->setVarRefs(Vars); 2312 2313 SmallVector<ValueDecl *, 16> Decls; 2314 Decls.reserve(UniqueDecls); 2315 for (unsigned i = 0; i < UniqueDecls; ++i) 2316 Decls.push_back( 2317 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx)); 2318 C->setUniqueDecls(Decls); 2319 2320 SmallVector<unsigned, 16> ListsPerDecl; 2321 ListsPerDecl.reserve(UniqueDecls); 2322 for (unsigned i = 0; i < UniqueDecls; ++i) 2323 ListsPerDecl.push_back(Record[Idx++]); 2324 C->setDeclNumLists(ListsPerDecl); 2325 2326 SmallVector<unsigned, 32> ListSizes; 2327 ListSizes.reserve(TotalLists); 2328 for (unsigned i = 0; i < TotalLists; ++i) 2329 ListSizes.push_back(Record[Idx++]); 2330 C->setComponentListSizes(ListSizes); 2331 2332 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 2333 Components.reserve(TotalComponents); 2334 for (unsigned i = 0; i < TotalComponents; ++i) { 2335 Expr *AssociatedExpr = Reader->Reader.ReadSubExpr(); 2336 ValueDecl *AssociatedDecl = 2337 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx); 2338 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 2339 AssociatedExpr, AssociatedDecl)); 2340 } 2341 C->setComponents(Components, ListSizes); 2342 } 2343 2344 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 2345 C->setNumTeams(Reader->Reader.ReadSubExpr()); 2346 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2347 } 2348 2349 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 2350 C->setThreadLimit(Reader->Reader.ReadSubExpr()); 2351 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2352 } 2353 2354 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 2355 C->setPriority(Reader->Reader.ReadSubExpr()); 2356 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2357 } 2358 2359 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 2360 C->setGrainsize(Reader->Reader.ReadSubExpr()); 2361 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2362 } 2363 2364 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 2365 C->setNumTasks(Reader->Reader.ReadSubExpr()); 2366 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2367 } 2368 2369 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 2370 C->setHint(Reader->Reader.ReadSubExpr()); 2371 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2372 } 2373 2374 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 2375 VisitOMPClauseWithPreInit(C); 2376 C->setDistScheduleKind( 2377 static_cast<OpenMPDistScheduleClauseKind>(Record[Idx++])); 2378 C->setChunkSize(Reader->Reader.ReadSubExpr()); 2379 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2380 C->setDistScheduleKindLoc(Reader->ReadSourceLocation(Record, Idx)); 2381 C->setCommaLoc(Reader->ReadSourceLocation(Record, Idx)); 2382 } 2383 2384 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 2385 C->setDefaultmapKind( 2386 static_cast<OpenMPDefaultmapClauseKind>(Record[Idx++])); 2387 C->setDefaultmapModifier( 2388 static_cast<OpenMPDefaultmapClauseModifier>(Record[Idx++])); 2389 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2390 C->setDefaultmapModifierLoc(Reader->ReadSourceLocation(Record, Idx)); 2391 C->setDefaultmapKindLoc(Reader->ReadSourceLocation(Record, Idx)); 2392 } 2393 2394 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 2395 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2396 auto NumVars = C->varlist_size(); 2397 auto UniqueDecls = C->getUniqueDeclarationsNum(); 2398 auto TotalLists = C->getTotalComponentListNum(); 2399 auto TotalComponents = C->getTotalComponentsNum(); 2400 2401 SmallVector<Expr *, 16> Vars; 2402 Vars.reserve(NumVars); 2403 for (unsigned i = 0; i != NumVars; ++i) 2404 Vars.push_back(Reader->Reader.ReadSubExpr()); 2405 C->setVarRefs(Vars); 2406 2407 SmallVector<ValueDecl *, 16> Decls; 2408 Decls.reserve(UniqueDecls); 2409 for (unsigned i = 0; i < UniqueDecls; ++i) 2410 Decls.push_back( 2411 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx)); 2412 C->setUniqueDecls(Decls); 2413 2414 SmallVector<unsigned, 16> ListsPerDecl; 2415 ListsPerDecl.reserve(UniqueDecls); 2416 for (unsigned i = 0; i < UniqueDecls; ++i) 2417 ListsPerDecl.push_back(Record[Idx++]); 2418 C->setDeclNumLists(ListsPerDecl); 2419 2420 SmallVector<unsigned, 32> ListSizes; 2421 ListSizes.reserve(TotalLists); 2422 for (unsigned i = 0; i < TotalLists; ++i) 2423 ListSizes.push_back(Record[Idx++]); 2424 C->setComponentListSizes(ListSizes); 2425 2426 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 2427 Components.reserve(TotalComponents); 2428 for (unsigned i = 0; i < TotalComponents; ++i) { 2429 Expr *AssociatedExpr = Reader->Reader.ReadSubExpr(); 2430 ValueDecl *AssociatedDecl = 2431 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx); 2432 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 2433 AssociatedExpr, AssociatedDecl)); 2434 } 2435 C->setComponents(Components, ListSizes); 2436 } 2437 2438 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 2439 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2440 auto NumVars = C->varlist_size(); 2441 auto UniqueDecls = C->getUniqueDeclarationsNum(); 2442 auto TotalLists = C->getTotalComponentListNum(); 2443 auto TotalComponents = C->getTotalComponentsNum(); 2444 2445 SmallVector<Expr *, 16> Vars; 2446 Vars.reserve(NumVars); 2447 for (unsigned i = 0; i != NumVars; ++i) 2448 Vars.push_back(Reader->Reader.ReadSubExpr()); 2449 C->setVarRefs(Vars); 2450 2451 SmallVector<ValueDecl *, 16> Decls; 2452 Decls.reserve(UniqueDecls); 2453 for (unsigned i = 0; i < UniqueDecls; ++i) 2454 Decls.push_back( 2455 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx)); 2456 C->setUniqueDecls(Decls); 2457 2458 SmallVector<unsigned, 16> ListsPerDecl; 2459 ListsPerDecl.reserve(UniqueDecls); 2460 for (unsigned i = 0; i < UniqueDecls; ++i) 2461 ListsPerDecl.push_back(Record[Idx++]); 2462 C->setDeclNumLists(ListsPerDecl); 2463 2464 SmallVector<unsigned, 32> ListSizes; 2465 ListSizes.reserve(TotalLists); 2466 for (unsigned i = 0; i < TotalLists; ++i) 2467 ListSizes.push_back(Record[Idx++]); 2468 C->setComponentListSizes(ListSizes); 2469 2470 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 2471 Components.reserve(TotalComponents); 2472 for (unsigned i = 0; i < TotalComponents; ++i) { 2473 Expr *AssociatedExpr = Reader->Reader.ReadSubExpr(); 2474 ValueDecl *AssociatedDecl = 2475 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx); 2476 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 2477 AssociatedExpr, AssociatedDecl)); 2478 } 2479 C->setComponents(Components, ListSizes); 2480 } 2481 2482 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 2483 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2484 auto NumVars = C->varlist_size(); 2485 auto UniqueDecls = C->getUniqueDeclarationsNum(); 2486 auto TotalLists = C->getTotalComponentListNum(); 2487 auto TotalComponents = C->getTotalComponentsNum(); 2488 2489 SmallVector<Expr *, 16> Vars; 2490 Vars.reserve(NumVars); 2491 for (unsigned i = 0; i != NumVars; ++i) 2492 Vars.push_back(Reader->Reader.ReadSubExpr()); 2493 C->setVarRefs(Vars); 2494 Vars.clear(); 2495 for (unsigned i = 0; i != NumVars; ++i) 2496 Vars.push_back(Reader->Reader.ReadSubExpr()); 2497 C->setPrivateCopies(Vars); 2498 Vars.clear(); 2499 for (unsigned i = 0; i != NumVars; ++i) 2500 Vars.push_back(Reader->Reader.ReadSubExpr()); 2501 C->setInits(Vars); 2502 2503 SmallVector<ValueDecl *, 16> Decls; 2504 Decls.reserve(UniqueDecls); 2505 for (unsigned i = 0; i < UniqueDecls; ++i) 2506 Decls.push_back( 2507 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx)); 2508 C->setUniqueDecls(Decls); 2509 2510 SmallVector<unsigned, 16> ListsPerDecl; 2511 ListsPerDecl.reserve(UniqueDecls); 2512 for (unsigned i = 0; i < UniqueDecls; ++i) 2513 ListsPerDecl.push_back(Record[Idx++]); 2514 C->setDeclNumLists(ListsPerDecl); 2515 2516 SmallVector<unsigned, 32> ListSizes; 2517 ListSizes.reserve(TotalLists); 2518 for (unsigned i = 0; i < TotalLists; ++i) 2519 ListSizes.push_back(Record[Idx++]); 2520 C->setComponentListSizes(ListSizes); 2521 2522 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 2523 Components.reserve(TotalComponents); 2524 for (unsigned i = 0; i < TotalComponents; ++i) { 2525 Expr *AssociatedExpr = Reader->Reader.ReadSubExpr(); 2526 ValueDecl *AssociatedDecl = 2527 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx); 2528 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 2529 AssociatedExpr, AssociatedDecl)); 2530 } 2531 C->setComponents(Components, ListSizes); 2532 } 2533 2534 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 2535 C->setLParenLoc(Reader->ReadSourceLocation(Record, Idx)); 2536 auto NumVars = C->varlist_size(); 2537 auto UniqueDecls = C->getUniqueDeclarationsNum(); 2538 auto TotalLists = C->getTotalComponentListNum(); 2539 auto TotalComponents = C->getTotalComponentsNum(); 2540 2541 SmallVector<Expr *, 16> Vars; 2542 Vars.reserve(NumVars); 2543 for (unsigned i = 0; i != NumVars; ++i) 2544 Vars.push_back(Reader->Reader.ReadSubExpr()); 2545 C->setVarRefs(Vars); 2546 Vars.clear(); 2547 2548 SmallVector<ValueDecl *, 16> Decls; 2549 Decls.reserve(UniqueDecls); 2550 for (unsigned i = 0; i < UniqueDecls; ++i) 2551 Decls.push_back( 2552 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx)); 2553 C->setUniqueDecls(Decls); 2554 2555 SmallVector<unsigned, 16> ListsPerDecl; 2556 ListsPerDecl.reserve(UniqueDecls); 2557 for (unsigned i = 0; i < UniqueDecls; ++i) 2558 ListsPerDecl.push_back(Record[Idx++]); 2559 C->setDeclNumLists(ListsPerDecl); 2560 2561 SmallVector<unsigned, 32> ListSizes; 2562 ListSizes.reserve(TotalLists); 2563 for (unsigned i = 0; i < TotalLists; ++i) 2564 ListSizes.push_back(Record[Idx++]); 2565 C->setComponentListSizes(ListSizes); 2566 2567 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 2568 Components.reserve(TotalComponents); 2569 for (unsigned i = 0; i < TotalComponents; ++i) { 2570 Expr *AssociatedExpr = Reader->Reader.ReadSubExpr(); 2571 ValueDecl *AssociatedDecl = 2572 Reader->Reader.ReadDeclAs<ValueDecl>(Reader->F, Record, Idx); 2573 Components.push_back(OMPClauseMappableExprCommon::MappableComponent( 2574 AssociatedExpr, AssociatedDecl)); 2575 } 2576 C->setComponents(Components, ListSizes); 2577 } 2578 2579 //===----------------------------------------------------------------------===// 2580 // OpenMP Directives. 2581 //===----------------------------------------------------------------------===// 2582 void ASTStmtReader::VisitOMPExecutableDirective(OMPExecutableDirective *E) { 2583 E->setLocStart(ReadSourceLocation(Record, Idx)); 2584 E->setLocEnd(ReadSourceLocation(Record, Idx)); 2585 OMPClauseReader ClauseReader(this, Reader.getContext(), Record, Idx); 2586 SmallVector<OMPClause *, 5> Clauses; 2587 for (unsigned i = 0; i < E->getNumClauses(); ++i) 2588 Clauses.push_back(ClauseReader.readClause()); 2589 E->setClauses(Clauses); 2590 if (E->hasAssociatedStmt()) 2591 E->setAssociatedStmt(Reader.ReadSubStmt()); 2592 } 2593 2594 void ASTStmtReader::VisitOMPLoopDirective(OMPLoopDirective *D) { 2595 VisitStmt(D); 2596 // Two fields (NumClauses and CollapsedNum) were read in ReadStmtFromStream. 2597 Idx += 2; 2598 VisitOMPExecutableDirective(D); 2599 D->setIterationVariable(Reader.ReadSubExpr()); 2600 D->setLastIteration(Reader.ReadSubExpr()); 2601 D->setCalcLastIteration(Reader.ReadSubExpr()); 2602 D->setPreCond(Reader.ReadSubExpr()); 2603 D->setCond(Reader.ReadSubExpr()); 2604 D->setInit(Reader.ReadSubExpr()); 2605 D->setInc(Reader.ReadSubExpr()); 2606 D->setPreInits(Reader.ReadSubStmt()); 2607 if (isOpenMPWorksharingDirective(D->getDirectiveKind()) || 2608 isOpenMPTaskLoopDirective(D->getDirectiveKind()) || 2609 isOpenMPDistributeDirective(D->getDirectiveKind())) { 2610 D->setIsLastIterVariable(Reader.ReadSubExpr()); 2611 D->setLowerBoundVariable(Reader.ReadSubExpr()); 2612 D->setUpperBoundVariable(Reader.ReadSubExpr()); 2613 D->setStrideVariable(Reader.ReadSubExpr()); 2614 D->setEnsureUpperBound(Reader.ReadSubExpr()); 2615 D->setNextLowerBound(Reader.ReadSubExpr()); 2616 D->setNextUpperBound(Reader.ReadSubExpr()); 2617 D->setNumIterations(Reader.ReadSubExpr()); 2618 } 2619 if (isOpenMPLoopBoundSharingDirective(D->getDirectiveKind())) { 2620 D->setPrevLowerBoundVariable(Reader.ReadSubExpr()); 2621 D->setPrevUpperBoundVariable(Reader.ReadSubExpr()); 2622 } 2623 SmallVector<Expr *, 4> Sub; 2624 unsigned CollapsedNum = D->getCollapsedNumber(); 2625 Sub.reserve(CollapsedNum); 2626 for (unsigned i = 0; i < CollapsedNum; ++i) 2627 Sub.push_back(Reader.ReadSubExpr()); 2628 D->setCounters(Sub); 2629 Sub.clear(); 2630 for (unsigned i = 0; i < CollapsedNum; ++i) 2631 Sub.push_back(Reader.ReadSubExpr()); 2632 D->setPrivateCounters(Sub); 2633 Sub.clear(); 2634 for (unsigned i = 0; i < CollapsedNum; ++i) 2635 Sub.push_back(Reader.ReadSubExpr()); 2636 D->setInits(Sub); 2637 Sub.clear(); 2638 for (unsigned i = 0; i < CollapsedNum; ++i) 2639 Sub.push_back(Reader.ReadSubExpr()); 2640 D->setUpdates(Sub); 2641 Sub.clear(); 2642 for (unsigned i = 0; i < CollapsedNum; ++i) 2643 Sub.push_back(Reader.ReadSubExpr()); 2644 D->setFinals(Sub); 2645 } 2646 2647 void ASTStmtReader::VisitOMPParallelDirective(OMPParallelDirective *D) { 2648 VisitStmt(D); 2649 // The NumClauses field was read in ReadStmtFromStream. 2650 ++Idx; 2651 VisitOMPExecutableDirective(D); 2652 D->setHasCancel(Record[Idx++]); 2653 } 2654 2655 void ASTStmtReader::VisitOMPSimdDirective(OMPSimdDirective *D) { 2656 VisitOMPLoopDirective(D); 2657 } 2658 2659 void ASTStmtReader::VisitOMPForDirective(OMPForDirective *D) { 2660 VisitOMPLoopDirective(D); 2661 D->setHasCancel(Record[Idx++]); 2662 } 2663 2664 void ASTStmtReader::VisitOMPForSimdDirective(OMPForSimdDirective *D) { 2665 VisitOMPLoopDirective(D); 2666 } 2667 2668 void ASTStmtReader::VisitOMPSectionsDirective(OMPSectionsDirective *D) { 2669 VisitStmt(D); 2670 // The NumClauses field was read in ReadStmtFromStream. 2671 ++Idx; 2672 VisitOMPExecutableDirective(D); 2673 D->setHasCancel(Record[Idx++]); 2674 } 2675 2676 void ASTStmtReader::VisitOMPSectionDirective(OMPSectionDirective *D) { 2677 VisitStmt(D); 2678 VisitOMPExecutableDirective(D); 2679 D->setHasCancel(Record[Idx++]); 2680 } 2681 2682 void ASTStmtReader::VisitOMPSingleDirective(OMPSingleDirective *D) { 2683 VisitStmt(D); 2684 // The NumClauses field was read in ReadStmtFromStream. 2685 ++Idx; 2686 VisitOMPExecutableDirective(D); 2687 } 2688 2689 void ASTStmtReader::VisitOMPMasterDirective(OMPMasterDirective *D) { 2690 VisitStmt(D); 2691 VisitOMPExecutableDirective(D); 2692 } 2693 2694 void ASTStmtReader::VisitOMPCriticalDirective(OMPCriticalDirective *D) { 2695 VisitStmt(D); 2696 // The NumClauses field was read in ReadStmtFromStream. 2697 ++Idx; 2698 VisitOMPExecutableDirective(D); 2699 ReadDeclarationNameInfo(D->DirName, Record, Idx); 2700 } 2701 2702 void ASTStmtReader::VisitOMPParallelForDirective(OMPParallelForDirective *D) { 2703 VisitOMPLoopDirective(D); 2704 D->setHasCancel(Record[Idx++]); 2705 } 2706 2707 void ASTStmtReader::VisitOMPParallelForSimdDirective( 2708 OMPParallelForSimdDirective *D) { 2709 VisitOMPLoopDirective(D); 2710 } 2711 2712 void ASTStmtReader::VisitOMPParallelSectionsDirective( 2713 OMPParallelSectionsDirective *D) { 2714 VisitStmt(D); 2715 // The NumClauses field was read in ReadStmtFromStream. 2716 ++Idx; 2717 VisitOMPExecutableDirective(D); 2718 D->setHasCancel(Record[Idx++]); 2719 } 2720 2721 void ASTStmtReader::VisitOMPTaskDirective(OMPTaskDirective *D) { 2722 VisitStmt(D); 2723 // The NumClauses field was read in ReadStmtFromStream. 2724 ++Idx; 2725 VisitOMPExecutableDirective(D); 2726 D->setHasCancel(Record[Idx++]); 2727 } 2728 2729 void ASTStmtReader::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) { 2730 VisitStmt(D); 2731 VisitOMPExecutableDirective(D); 2732 } 2733 2734 void ASTStmtReader::VisitOMPBarrierDirective(OMPBarrierDirective *D) { 2735 VisitStmt(D); 2736 VisitOMPExecutableDirective(D); 2737 } 2738 2739 void ASTStmtReader::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 2740 VisitStmt(D); 2741 VisitOMPExecutableDirective(D); 2742 } 2743 2744 void ASTStmtReader::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) { 2745 VisitStmt(D); 2746 VisitOMPExecutableDirective(D); 2747 } 2748 2749 void ASTStmtReader::VisitOMPFlushDirective(OMPFlushDirective *D) { 2750 VisitStmt(D); 2751 // The NumClauses field was read in ReadStmtFromStream. 2752 ++Idx; 2753 VisitOMPExecutableDirective(D); 2754 } 2755 2756 void ASTStmtReader::VisitOMPOrderedDirective(OMPOrderedDirective *D) { 2757 VisitStmt(D); 2758 // The NumClauses field was read in ReadStmtFromStream. 2759 ++Idx; 2760 VisitOMPExecutableDirective(D); 2761 } 2762 2763 void ASTStmtReader::VisitOMPAtomicDirective(OMPAtomicDirective *D) { 2764 VisitStmt(D); 2765 // The NumClauses field was read in ReadStmtFromStream. 2766 ++Idx; 2767 VisitOMPExecutableDirective(D); 2768 D->setX(Reader.ReadSubExpr()); 2769 D->setV(Reader.ReadSubExpr()); 2770 D->setExpr(Reader.ReadSubExpr()); 2771 D->setUpdateExpr(Reader.ReadSubExpr()); 2772 D->IsXLHSInRHSPart = Record[Idx++] != 0; 2773 D->IsPostfixUpdate = Record[Idx++] != 0; 2774 } 2775 2776 void ASTStmtReader::VisitOMPTargetDirective(OMPTargetDirective *D) { 2777 VisitStmt(D); 2778 // The NumClauses field was read in ReadStmtFromStream. 2779 ++Idx; 2780 VisitOMPExecutableDirective(D); 2781 } 2782 2783 void ASTStmtReader::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) { 2784 VisitStmt(D); 2785 ++Idx; 2786 VisitOMPExecutableDirective(D); 2787 } 2788 2789 void ASTStmtReader::VisitOMPTargetEnterDataDirective( 2790 OMPTargetEnterDataDirective *D) { 2791 VisitStmt(D); 2792 ++Idx; 2793 VisitOMPExecutableDirective(D); 2794 } 2795 2796 void ASTStmtReader::VisitOMPTargetExitDataDirective( 2797 OMPTargetExitDataDirective *D) { 2798 VisitStmt(D); 2799 ++Idx; 2800 VisitOMPExecutableDirective(D); 2801 } 2802 2803 void ASTStmtReader::VisitOMPTargetParallelDirective( 2804 OMPTargetParallelDirective *D) { 2805 VisitStmt(D); 2806 ++Idx; 2807 VisitOMPExecutableDirective(D); 2808 } 2809 2810 void ASTStmtReader::VisitOMPTargetParallelForDirective( 2811 OMPTargetParallelForDirective *D) { 2812 VisitOMPLoopDirective(D); 2813 D->setHasCancel(Record[Idx++]); 2814 } 2815 2816 void ASTStmtReader::VisitOMPTeamsDirective(OMPTeamsDirective *D) { 2817 VisitStmt(D); 2818 // The NumClauses field was read in ReadStmtFromStream. 2819 ++Idx; 2820 VisitOMPExecutableDirective(D); 2821 } 2822 2823 void ASTStmtReader::VisitOMPCancellationPointDirective( 2824 OMPCancellationPointDirective *D) { 2825 VisitStmt(D); 2826 VisitOMPExecutableDirective(D); 2827 D->setCancelRegion(static_cast<OpenMPDirectiveKind>(Record[Idx++])); 2828 } 2829 2830 void ASTStmtReader::VisitOMPCancelDirective(OMPCancelDirective *D) { 2831 VisitStmt(D); 2832 // The NumClauses field was read in ReadStmtFromStream. 2833 ++Idx; 2834 VisitOMPExecutableDirective(D); 2835 D->setCancelRegion(static_cast<OpenMPDirectiveKind>(Record[Idx++])); 2836 } 2837 2838 void ASTStmtReader::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 2839 VisitOMPLoopDirective(D); 2840 } 2841 2842 void ASTStmtReader::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) { 2843 VisitOMPLoopDirective(D); 2844 } 2845 2846 void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective *D) { 2847 VisitOMPLoopDirective(D); 2848 } 2849 2850 void ASTStmtReader::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) { 2851 VisitStmt(D); 2852 ++Idx; 2853 VisitOMPExecutableDirective(D); 2854 } 2855 void ASTStmtReader::VisitOMPDistributeParallelForDirective( 2856 OMPDistributeParallelForDirective *D) { 2857 VisitOMPLoopDirective(D); 2858 } 2859 2860 void ASTStmtReader::VisitOMPDistributeParallelForSimdDirective( 2861 OMPDistributeParallelForSimdDirective *D) { 2862 VisitOMPLoopDirective(D); 2863 } 2864 2865 void ASTStmtReader::VisitOMPDistributeSimdDirective( 2866 OMPDistributeSimdDirective *D) { 2867 VisitOMPLoopDirective(D); 2868 } 2869 2870 void ASTStmtReader::VisitOMPTargetParallelForSimdDirective( 2871 OMPTargetParallelForSimdDirective *D) { 2872 VisitOMPLoopDirective(D); 2873 } 2874 2875 void ASTStmtReader::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *D) { 2876 VisitOMPLoopDirective(D); 2877 } 2878 2879 void ASTStmtReader::VisitOMPTeamsDistributeDirective( 2880 OMPTeamsDistributeDirective *D) { 2881 VisitOMPLoopDirective(D); 2882 } 2883 2884 void ASTStmtReader::VisitOMPTeamsDistributeSimdDirective( 2885 OMPTeamsDistributeSimdDirective *D) { 2886 VisitOMPLoopDirective(D); 2887 } 2888 2889 void ASTStmtReader::VisitOMPTeamsDistributeParallelForSimdDirective( 2890 OMPTeamsDistributeParallelForSimdDirective *D) { 2891 VisitOMPLoopDirective(D); 2892 } 2893 2894 void ASTStmtReader::VisitOMPTeamsDistributeParallelForDirective( 2895 OMPTeamsDistributeParallelForDirective *D) { 2896 VisitOMPLoopDirective(D); 2897 } 2898 2899 //===----------------------------------------------------------------------===// 2900 // ASTReader Implementation 2901 //===----------------------------------------------------------------------===// 2902 2903 Stmt *ASTReader::ReadStmt(ModuleFile &F) { 2904 switch (ReadingKind) { 2905 case Read_None: 2906 llvm_unreachable("should not call this when not reading anything"); 2907 case Read_Decl: 2908 case Read_Type: 2909 return ReadStmtFromStream(F); 2910 case Read_Stmt: 2911 return ReadSubStmt(); 2912 } 2913 2914 llvm_unreachable("ReadingKind not set ?"); 2915 } 2916 2917 Expr *ASTReader::ReadExpr(ModuleFile &F) { 2918 return cast_or_null<Expr>(ReadStmt(F)); 2919 } 2920 2921 Expr *ASTReader::ReadSubExpr() { 2922 return cast_or_null<Expr>(ReadSubStmt()); 2923 } 2924 2925 // Within the bitstream, expressions are stored in Reverse Polish 2926 // Notation, with each of the subexpressions preceding the 2927 // expression they are stored in. Subexpressions are stored from last to first. 2928 // To evaluate expressions, we continue reading expressions and placing them on 2929 // the stack, with expressions having operands removing those operands from the 2930 // stack. Evaluation terminates when we see a STMT_STOP record, and 2931 // the single remaining expression on the stack is our result. 2932 Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) { 2933 2934 ReadingKindTracker ReadingKind(Read_Stmt, *this); 2935 llvm::BitstreamCursor &Cursor = F.DeclsCursor; 2936 2937 // Map of offset to previously deserialized stmt. The offset points 2938 /// just after the stmt record. 2939 llvm::DenseMap<uint64_t, Stmt *> StmtEntries; 2940 2941 #ifndef NDEBUG 2942 unsigned PrevNumStmts = StmtStack.size(); 2943 #endif 2944 2945 RecordData Record; 2946 unsigned Idx; 2947 ASTStmtReader Reader(*this, F, Cursor, Record, Idx); 2948 Stmt::EmptyShell Empty; 2949 2950 while (true) { 2951 llvm::BitstreamEntry Entry = Cursor.advanceSkippingSubblocks(); 2952 2953 switch (Entry.Kind) { 2954 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 2955 case llvm::BitstreamEntry::Error: 2956 Error("malformed block record in AST file"); 2957 return nullptr; 2958 case llvm::BitstreamEntry::EndBlock: 2959 goto Done; 2960 case llvm::BitstreamEntry::Record: 2961 // The interesting case. 2962 break; 2963 } 2964 2965 Stmt *S = nullptr; 2966 Idx = 0; 2967 Record.clear(); 2968 bool Finished = false; 2969 bool IsStmtReference = false; 2970 switch ((StmtCode)Cursor.readRecord(Entry.ID, Record)) { 2971 case STMT_STOP: 2972 Finished = true; 2973 break; 2974 2975 case STMT_REF_PTR: 2976 IsStmtReference = true; 2977 assert(StmtEntries.find(Record[0]) != StmtEntries.end() && 2978 "No stmt was recorded for this offset reference!"); 2979 S = StmtEntries[Record[Idx++]]; 2980 break; 2981 2982 case STMT_NULL_PTR: 2983 S = nullptr; 2984 break; 2985 2986 case STMT_NULL: 2987 S = new (Context) NullStmt(Empty); 2988 break; 2989 2990 case STMT_COMPOUND: 2991 S = new (Context) CompoundStmt(Empty); 2992 break; 2993 2994 case STMT_CASE: 2995 S = new (Context) CaseStmt(Empty); 2996 break; 2997 2998 case STMT_DEFAULT: 2999 S = new (Context) DefaultStmt(Empty); 3000 break; 3001 3002 case STMT_LABEL: 3003 S = new (Context) LabelStmt(Empty); 3004 break; 3005 3006 case STMT_ATTRIBUTED: 3007 S = AttributedStmt::CreateEmpty( 3008 Context, 3009 /*NumAttrs*/Record[ASTStmtReader::NumStmtFields]); 3010 break; 3011 3012 case STMT_IF: 3013 S = new (Context) IfStmt(Empty); 3014 break; 3015 3016 case STMT_SWITCH: 3017 S = new (Context) SwitchStmt(Empty); 3018 break; 3019 3020 case STMT_WHILE: 3021 S = new (Context) WhileStmt(Empty); 3022 break; 3023 3024 case STMT_DO: 3025 S = new (Context) DoStmt(Empty); 3026 break; 3027 3028 case STMT_FOR: 3029 S = new (Context) ForStmt(Empty); 3030 break; 3031 3032 case STMT_GOTO: 3033 S = new (Context) GotoStmt(Empty); 3034 break; 3035 3036 case STMT_INDIRECT_GOTO: 3037 S = new (Context) IndirectGotoStmt(Empty); 3038 break; 3039 3040 case STMT_CONTINUE: 3041 S = new (Context) ContinueStmt(Empty); 3042 break; 3043 3044 case STMT_BREAK: 3045 S = new (Context) BreakStmt(Empty); 3046 break; 3047 3048 case STMT_RETURN: 3049 S = new (Context) ReturnStmt(Empty); 3050 break; 3051 3052 case STMT_DECL: 3053 S = new (Context) DeclStmt(Empty); 3054 break; 3055 3056 case STMT_GCCASM: 3057 S = new (Context) GCCAsmStmt(Empty); 3058 break; 3059 3060 case STMT_MSASM: 3061 S = new (Context) MSAsmStmt(Empty); 3062 break; 3063 3064 case STMT_CAPTURED: 3065 S = CapturedStmt::CreateDeserialized(Context, 3066 Record[ASTStmtReader::NumStmtFields]); 3067 break; 3068 3069 case EXPR_PREDEFINED: 3070 S = new (Context) PredefinedExpr(Empty); 3071 break; 3072 3073 case EXPR_DECL_REF: 3074 S = DeclRefExpr::CreateEmpty( 3075 Context, 3076 /*HasQualifier=*/Record[ASTStmtReader::NumExprFields], 3077 /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1], 3078 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 2], 3079 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ? 3080 Record[ASTStmtReader::NumExprFields + 5] : 0); 3081 break; 3082 3083 case EXPR_INTEGER_LITERAL: 3084 S = IntegerLiteral::Create(Context, Empty); 3085 break; 3086 3087 case EXPR_FLOATING_LITERAL: 3088 S = FloatingLiteral::Create(Context, Empty); 3089 break; 3090 3091 case EXPR_IMAGINARY_LITERAL: 3092 S = new (Context) ImaginaryLiteral(Empty); 3093 break; 3094 3095 case EXPR_STRING_LITERAL: 3096 S = StringLiteral::CreateEmpty(Context, 3097 Record[ASTStmtReader::NumExprFields + 1]); 3098 break; 3099 3100 case EXPR_CHARACTER_LITERAL: 3101 S = new (Context) CharacterLiteral(Empty); 3102 break; 3103 3104 case EXPR_PAREN: 3105 S = new (Context) ParenExpr(Empty); 3106 break; 3107 3108 case EXPR_PAREN_LIST: 3109 S = new (Context) ParenListExpr(Empty); 3110 break; 3111 3112 case EXPR_UNARY_OPERATOR: 3113 S = new (Context) UnaryOperator(Empty); 3114 break; 3115 3116 case EXPR_OFFSETOF: 3117 S = OffsetOfExpr::CreateEmpty(Context, 3118 Record[ASTStmtReader::NumExprFields], 3119 Record[ASTStmtReader::NumExprFields + 1]); 3120 break; 3121 3122 case EXPR_SIZEOF_ALIGN_OF: 3123 S = new (Context) UnaryExprOrTypeTraitExpr(Empty); 3124 break; 3125 3126 case EXPR_ARRAY_SUBSCRIPT: 3127 S = new (Context) ArraySubscriptExpr(Empty); 3128 break; 3129 3130 case EXPR_OMP_ARRAY_SECTION: 3131 S = new (Context) OMPArraySectionExpr(Empty); 3132 break; 3133 3134 case EXPR_CALL: 3135 S = new (Context) CallExpr(Context, Stmt::CallExprClass, Empty); 3136 break; 3137 3138 case EXPR_MEMBER: { 3139 // We load everything here and fully initialize it at creation. 3140 // That way we can use MemberExpr::Create and don't have to duplicate its 3141 // logic with a MemberExpr::CreateEmpty. 3142 3143 assert(Idx == 0); 3144 NestedNameSpecifierLoc QualifierLoc; 3145 if (Record[Idx++]) { // HasQualifier. 3146 QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx); 3147 } 3148 3149 SourceLocation TemplateKWLoc; 3150 TemplateArgumentListInfo ArgInfo; 3151 bool HasTemplateKWAndArgsInfo = Record[Idx++]; 3152 if (HasTemplateKWAndArgsInfo) { 3153 TemplateKWLoc = ReadSourceLocation(F, Record, Idx); 3154 unsigned NumTemplateArgs = Record[Idx++]; 3155 ArgInfo.setLAngleLoc(ReadSourceLocation(F, Record, Idx)); 3156 ArgInfo.setRAngleLoc(ReadSourceLocation(F, Record, Idx)); 3157 for (unsigned i = 0; i != NumTemplateArgs; ++i) 3158 ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx)); 3159 } 3160 3161 bool HadMultipleCandidates = Record[Idx++]; 3162 3163 NamedDecl *FoundD = ReadDeclAs<NamedDecl>(F, Record, Idx); 3164 AccessSpecifier AS = (AccessSpecifier)Record[Idx++]; 3165 DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS); 3166 3167 QualType T = readType(F, Record, Idx); 3168 ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]); 3169 ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]); 3170 Expr *Base = ReadSubExpr(); 3171 ValueDecl *MemberD = ReadDeclAs<ValueDecl>(F, Record, Idx); 3172 SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx); 3173 DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc); 3174 bool IsArrow = Record[Idx++]; 3175 SourceLocation OperatorLoc = ReadSourceLocation(F, Record, Idx); 3176 3177 S = MemberExpr::Create(Context, Base, IsArrow, OperatorLoc, QualifierLoc, 3178 TemplateKWLoc, MemberD, FoundDecl, MemberNameInfo, 3179 HasTemplateKWAndArgsInfo ? &ArgInfo : nullptr, T, 3180 VK, OK); 3181 ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc, 3182 MemberD->getDeclName(), Record, Idx); 3183 if (HadMultipleCandidates) 3184 cast<MemberExpr>(S)->setHadMultipleCandidates(true); 3185 break; 3186 } 3187 3188 case EXPR_BINARY_OPERATOR: 3189 S = new (Context) BinaryOperator(Empty); 3190 break; 3191 3192 case EXPR_COMPOUND_ASSIGN_OPERATOR: 3193 S = new (Context) CompoundAssignOperator(Empty); 3194 break; 3195 3196 case EXPR_CONDITIONAL_OPERATOR: 3197 S = new (Context) ConditionalOperator(Empty); 3198 break; 3199 3200 case EXPR_BINARY_CONDITIONAL_OPERATOR: 3201 S = new (Context) BinaryConditionalOperator(Empty); 3202 break; 3203 3204 case EXPR_IMPLICIT_CAST: 3205 S = ImplicitCastExpr::CreateEmpty(Context, 3206 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3207 break; 3208 3209 case EXPR_CSTYLE_CAST: 3210 S = CStyleCastExpr::CreateEmpty(Context, 3211 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3212 break; 3213 3214 case EXPR_COMPOUND_LITERAL: 3215 S = new (Context) CompoundLiteralExpr(Empty); 3216 break; 3217 3218 case EXPR_EXT_VECTOR_ELEMENT: 3219 S = new (Context) ExtVectorElementExpr(Empty); 3220 break; 3221 3222 case EXPR_INIT_LIST: 3223 S = new (Context) InitListExpr(Empty); 3224 break; 3225 3226 case EXPR_DESIGNATED_INIT: 3227 S = DesignatedInitExpr::CreateEmpty(Context, 3228 Record[ASTStmtReader::NumExprFields] - 1); 3229 3230 break; 3231 3232 case EXPR_DESIGNATED_INIT_UPDATE: 3233 S = new (Context) DesignatedInitUpdateExpr(Empty); 3234 break; 3235 3236 case EXPR_IMPLICIT_VALUE_INIT: 3237 S = new (Context) ImplicitValueInitExpr(Empty); 3238 break; 3239 3240 case EXPR_NO_INIT: 3241 S = new (Context) NoInitExpr(Empty); 3242 break; 3243 3244 case EXPR_ARRAY_INIT_LOOP: 3245 S = new (Context) ArrayInitLoopExpr(Empty); 3246 break; 3247 3248 case EXPR_ARRAY_INIT_INDEX: 3249 S = new (Context) ArrayInitIndexExpr(Empty); 3250 break; 3251 3252 case EXPR_VA_ARG: 3253 S = new (Context) VAArgExpr(Empty); 3254 break; 3255 3256 case EXPR_ADDR_LABEL: 3257 S = new (Context) AddrLabelExpr(Empty); 3258 break; 3259 3260 case EXPR_STMT: 3261 S = new (Context) StmtExpr(Empty); 3262 break; 3263 3264 case EXPR_CHOOSE: 3265 S = new (Context) ChooseExpr(Empty); 3266 break; 3267 3268 case EXPR_GNU_NULL: 3269 S = new (Context) GNUNullExpr(Empty); 3270 break; 3271 3272 case EXPR_SHUFFLE_VECTOR: 3273 S = new (Context) ShuffleVectorExpr(Empty); 3274 break; 3275 3276 case EXPR_CONVERT_VECTOR: 3277 S = new (Context) ConvertVectorExpr(Empty); 3278 break; 3279 3280 case EXPR_BLOCK: 3281 S = new (Context) BlockExpr(Empty); 3282 break; 3283 3284 case EXPR_GENERIC_SELECTION: 3285 S = new (Context) GenericSelectionExpr(Empty); 3286 break; 3287 3288 case EXPR_OBJC_STRING_LITERAL: 3289 S = new (Context) ObjCStringLiteral(Empty); 3290 break; 3291 case EXPR_OBJC_BOXED_EXPRESSION: 3292 S = new (Context) ObjCBoxedExpr(Empty); 3293 break; 3294 case EXPR_OBJC_ARRAY_LITERAL: 3295 S = ObjCArrayLiteral::CreateEmpty(Context, 3296 Record[ASTStmtReader::NumExprFields]); 3297 break; 3298 case EXPR_OBJC_DICTIONARY_LITERAL: 3299 S = ObjCDictionaryLiteral::CreateEmpty(Context, 3300 Record[ASTStmtReader::NumExprFields], 3301 Record[ASTStmtReader::NumExprFields + 1]); 3302 break; 3303 case EXPR_OBJC_ENCODE: 3304 S = new (Context) ObjCEncodeExpr(Empty); 3305 break; 3306 case EXPR_OBJC_SELECTOR_EXPR: 3307 S = new (Context) ObjCSelectorExpr(Empty); 3308 break; 3309 case EXPR_OBJC_PROTOCOL_EXPR: 3310 S = new (Context) ObjCProtocolExpr(Empty); 3311 break; 3312 case EXPR_OBJC_IVAR_REF_EXPR: 3313 S = new (Context) ObjCIvarRefExpr(Empty); 3314 break; 3315 case EXPR_OBJC_PROPERTY_REF_EXPR: 3316 S = new (Context) ObjCPropertyRefExpr(Empty); 3317 break; 3318 case EXPR_OBJC_SUBSCRIPT_REF_EXPR: 3319 S = new (Context) ObjCSubscriptRefExpr(Empty); 3320 break; 3321 case EXPR_OBJC_KVC_REF_EXPR: 3322 llvm_unreachable("mismatching AST file"); 3323 case EXPR_OBJC_MESSAGE_EXPR: 3324 S = ObjCMessageExpr::CreateEmpty(Context, 3325 Record[ASTStmtReader::NumExprFields], 3326 Record[ASTStmtReader::NumExprFields + 1]); 3327 break; 3328 case EXPR_OBJC_ISA: 3329 S = new (Context) ObjCIsaExpr(Empty); 3330 break; 3331 case EXPR_OBJC_INDIRECT_COPY_RESTORE: 3332 S = new (Context) ObjCIndirectCopyRestoreExpr(Empty); 3333 break; 3334 case EXPR_OBJC_BRIDGED_CAST: 3335 S = new (Context) ObjCBridgedCastExpr(Empty); 3336 break; 3337 case STMT_OBJC_FOR_COLLECTION: 3338 S = new (Context) ObjCForCollectionStmt(Empty); 3339 break; 3340 case STMT_OBJC_CATCH: 3341 S = new (Context) ObjCAtCatchStmt(Empty); 3342 break; 3343 case STMT_OBJC_FINALLY: 3344 S = new (Context) ObjCAtFinallyStmt(Empty); 3345 break; 3346 case STMT_OBJC_AT_TRY: 3347 S = ObjCAtTryStmt::CreateEmpty(Context, 3348 Record[ASTStmtReader::NumStmtFields], 3349 Record[ASTStmtReader::NumStmtFields + 1]); 3350 break; 3351 case STMT_OBJC_AT_SYNCHRONIZED: 3352 S = new (Context) ObjCAtSynchronizedStmt(Empty); 3353 break; 3354 case STMT_OBJC_AT_THROW: 3355 S = new (Context) ObjCAtThrowStmt(Empty); 3356 break; 3357 case STMT_OBJC_AUTORELEASE_POOL: 3358 S = new (Context) ObjCAutoreleasePoolStmt(Empty); 3359 break; 3360 case EXPR_OBJC_BOOL_LITERAL: 3361 S = new (Context) ObjCBoolLiteralExpr(Empty); 3362 break; 3363 case EXPR_OBJC_AVAILABILITY_CHECK: 3364 S = new (Context) ObjCAvailabilityCheckExpr(Empty); 3365 break; 3366 case STMT_SEH_LEAVE: 3367 S = new (Context) SEHLeaveStmt(Empty); 3368 break; 3369 case STMT_SEH_EXCEPT: 3370 S = new (Context) SEHExceptStmt(Empty); 3371 break; 3372 case STMT_SEH_FINALLY: 3373 S = new (Context) SEHFinallyStmt(Empty); 3374 break; 3375 case STMT_SEH_TRY: 3376 S = new (Context) SEHTryStmt(Empty); 3377 break; 3378 case STMT_CXX_CATCH: 3379 S = new (Context) CXXCatchStmt(Empty); 3380 break; 3381 3382 case STMT_CXX_TRY: 3383 S = CXXTryStmt::Create(Context, Empty, 3384 /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]); 3385 break; 3386 3387 case STMT_CXX_FOR_RANGE: 3388 S = new (Context) CXXForRangeStmt(Empty); 3389 break; 3390 3391 case STMT_MS_DEPENDENT_EXISTS: 3392 S = new (Context) MSDependentExistsStmt(SourceLocation(), true, 3393 NestedNameSpecifierLoc(), 3394 DeclarationNameInfo(), 3395 nullptr); 3396 break; 3397 3398 case STMT_OMP_PARALLEL_DIRECTIVE: 3399 S = 3400 OMPParallelDirective::CreateEmpty(Context, 3401 Record[ASTStmtReader::NumStmtFields], 3402 Empty); 3403 break; 3404 3405 case STMT_OMP_SIMD_DIRECTIVE: { 3406 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3407 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3408 S = OMPSimdDirective::CreateEmpty(Context, NumClauses, 3409 CollapsedNum, Empty); 3410 break; 3411 } 3412 3413 case STMT_OMP_FOR_DIRECTIVE: { 3414 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3415 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3416 S = OMPForDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3417 Empty); 3418 break; 3419 } 3420 3421 case STMT_OMP_FOR_SIMD_DIRECTIVE: { 3422 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3423 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3424 S = OMPForSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3425 Empty); 3426 break; 3427 } 3428 3429 case STMT_OMP_SECTIONS_DIRECTIVE: 3430 S = OMPSectionsDirective::CreateEmpty( 3431 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3432 break; 3433 3434 case STMT_OMP_SECTION_DIRECTIVE: 3435 S = OMPSectionDirective::CreateEmpty(Context, Empty); 3436 break; 3437 3438 case STMT_OMP_SINGLE_DIRECTIVE: 3439 S = OMPSingleDirective::CreateEmpty( 3440 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3441 break; 3442 3443 case STMT_OMP_MASTER_DIRECTIVE: 3444 S = OMPMasterDirective::CreateEmpty(Context, Empty); 3445 break; 3446 3447 case STMT_OMP_CRITICAL_DIRECTIVE: 3448 S = OMPCriticalDirective::CreateEmpty( 3449 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3450 break; 3451 3452 case STMT_OMP_PARALLEL_FOR_DIRECTIVE: { 3453 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3454 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3455 S = OMPParallelForDirective::CreateEmpty(Context, NumClauses, 3456 CollapsedNum, Empty); 3457 break; 3458 } 3459 3460 case STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE: { 3461 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3462 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3463 S = OMPParallelForSimdDirective::CreateEmpty(Context, NumClauses, 3464 CollapsedNum, Empty); 3465 break; 3466 } 3467 3468 case STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE: 3469 S = OMPParallelSectionsDirective::CreateEmpty( 3470 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3471 break; 3472 3473 case STMT_OMP_TASK_DIRECTIVE: 3474 S = OMPTaskDirective::CreateEmpty( 3475 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3476 break; 3477 3478 case STMT_OMP_TASKYIELD_DIRECTIVE: 3479 S = OMPTaskyieldDirective::CreateEmpty(Context, Empty); 3480 break; 3481 3482 case STMT_OMP_BARRIER_DIRECTIVE: 3483 S = OMPBarrierDirective::CreateEmpty(Context, Empty); 3484 break; 3485 3486 case STMT_OMP_TASKWAIT_DIRECTIVE: 3487 S = OMPTaskwaitDirective::CreateEmpty(Context, Empty); 3488 break; 3489 3490 case STMT_OMP_TASKGROUP_DIRECTIVE: 3491 S = OMPTaskgroupDirective::CreateEmpty(Context, Empty); 3492 break; 3493 3494 case STMT_OMP_FLUSH_DIRECTIVE: 3495 S = OMPFlushDirective::CreateEmpty( 3496 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3497 break; 3498 3499 case STMT_OMP_ORDERED_DIRECTIVE: 3500 S = OMPOrderedDirective::CreateEmpty( 3501 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3502 break; 3503 3504 case STMT_OMP_ATOMIC_DIRECTIVE: 3505 S = OMPAtomicDirective::CreateEmpty( 3506 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3507 break; 3508 3509 case STMT_OMP_TARGET_DIRECTIVE: 3510 S = OMPTargetDirective::CreateEmpty( 3511 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3512 break; 3513 3514 case STMT_OMP_TARGET_DATA_DIRECTIVE: 3515 S = OMPTargetDataDirective::CreateEmpty( 3516 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3517 break; 3518 3519 case STMT_OMP_TARGET_ENTER_DATA_DIRECTIVE: 3520 S = OMPTargetEnterDataDirective::CreateEmpty( 3521 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3522 break; 3523 3524 case STMT_OMP_TARGET_EXIT_DATA_DIRECTIVE: 3525 S = OMPTargetExitDataDirective::CreateEmpty( 3526 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3527 break; 3528 3529 case STMT_OMP_TARGET_PARALLEL_DIRECTIVE: 3530 S = OMPTargetParallelDirective::CreateEmpty( 3531 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3532 break; 3533 3534 case STMT_OMP_TARGET_PARALLEL_FOR_DIRECTIVE: { 3535 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3536 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3537 S = OMPTargetParallelForDirective::CreateEmpty(Context, NumClauses, 3538 CollapsedNum, Empty); 3539 break; 3540 } 3541 3542 case STMT_OMP_TARGET_UPDATE_DIRECTIVE: 3543 S = OMPTargetUpdateDirective::CreateEmpty( 3544 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3545 break; 3546 3547 case STMT_OMP_TEAMS_DIRECTIVE: 3548 S = OMPTeamsDirective::CreateEmpty( 3549 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3550 break; 3551 3552 case STMT_OMP_CANCELLATION_POINT_DIRECTIVE: 3553 S = OMPCancellationPointDirective::CreateEmpty(Context, Empty); 3554 break; 3555 3556 case STMT_OMP_CANCEL_DIRECTIVE: 3557 S = OMPCancelDirective::CreateEmpty( 3558 Context, Record[ASTStmtReader::NumStmtFields], Empty); 3559 break; 3560 3561 case STMT_OMP_TASKLOOP_DIRECTIVE: { 3562 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3563 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3564 S = OMPTaskLoopDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3565 Empty); 3566 break; 3567 } 3568 3569 case STMT_OMP_TASKLOOP_SIMD_DIRECTIVE: { 3570 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3571 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3572 S = OMPTaskLoopSimdDirective::CreateEmpty(Context, NumClauses, 3573 CollapsedNum, Empty); 3574 break; 3575 } 3576 3577 case STMT_OMP_DISTRIBUTE_DIRECTIVE: { 3578 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3579 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3580 S = OMPDistributeDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3581 Empty); 3582 break; 3583 } 3584 3585 case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: { 3586 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3587 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3588 S = OMPDistributeParallelForDirective::CreateEmpty(Context, NumClauses, 3589 CollapsedNum, Empty); 3590 break; 3591 } 3592 3593 case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: { 3594 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3595 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3596 S = OMPDistributeParallelForSimdDirective::CreateEmpty(Context, NumClauses, 3597 CollapsedNum, 3598 Empty); 3599 break; 3600 } 3601 3602 case STMT_OMP_DISTRIBUTE_SIMD_DIRECTIVE: { 3603 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3604 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3605 S = OMPDistributeSimdDirective::CreateEmpty(Context, NumClauses, 3606 CollapsedNum, Empty); 3607 break; 3608 } 3609 3610 case STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE: { 3611 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3612 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3613 S = OMPTargetParallelForSimdDirective::CreateEmpty(Context, NumClauses, 3614 CollapsedNum, Empty); 3615 break; 3616 } 3617 3618 case STMT_OMP_TARGET_SIMD_DIRECTIVE: { 3619 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3620 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3621 S = OMPTargetSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum, 3622 Empty); 3623 break; 3624 } 3625 3626 case STMT_OMP_TEAMS_DISTRIBUTE_DIRECTIVE: { 3627 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3628 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3629 S = OMPTeamsDistributeDirective::CreateEmpty(Context, NumClauses, 3630 CollapsedNum, Empty); 3631 break; 3632 } 3633 3634 case STMT_OMP_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE: { 3635 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields]; 3636 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3637 S = OMPTeamsDistributeSimdDirective::CreateEmpty(Context, NumClauses, 3638 CollapsedNum, Empty); 3639 break; 3640 } 3641 3642 case STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: { 3643 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3644 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3645 S = OMPTeamsDistributeParallelForSimdDirective::CreateEmpty( 3646 Context, NumClauses, CollapsedNum, Empty); 3647 break; 3648 } 3649 3650 case STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: { 3651 auto NumClauses = Record[ASTStmtReader::NumStmtFields]; 3652 auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1]; 3653 S = OMPTeamsDistributeParallelForDirective::CreateEmpty( 3654 Context, NumClauses, CollapsedNum, Empty); 3655 break; 3656 } 3657 3658 case EXPR_CXX_OPERATOR_CALL: 3659 S = new (Context) CXXOperatorCallExpr(Context, Empty); 3660 break; 3661 3662 case EXPR_CXX_MEMBER_CALL: 3663 S = new (Context) CXXMemberCallExpr(Context, Empty); 3664 break; 3665 3666 case EXPR_CXX_CONSTRUCT: 3667 S = new (Context) CXXConstructExpr(Empty); 3668 break; 3669 3670 case EXPR_CXX_INHERITED_CTOR_INIT: 3671 S = new (Context) CXXInheritedCtorInitExpr(Empty); 3672 break; 3673 3674 case EXPR_CXX_TEMPORARY_OBJECT: 3675 S = new (Context) CXXTemporaryObjectExpr(Empty); 3676 break; 3677 3678 case EXPR_CXX_STATIC_CAST: 3679 S = CXXStaticCastExpr::CreateEmpty(Context, 3680 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3681 break; 3682 3683 case EXPR_CXX_DYNAMIC_CAST: 3684 S = CXXDynamicCastExpr::CreateEmpty(Context, 3685 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3686 break; 3687 3688 case EXPR_CXX_REINTERPRET_CAST: 3689 S = CXXReinterpretCastExpr::CreateEmpty(Context, 3690 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3691 break; 3692 3693 case EXPR_CXX_CONST_CAST: 3694 S = CXXConstCastExpr::CreateEmpty(Context); 3695 break; 3696 3697 case EXPR_CXX_FUNCTIONAL_CAST: 3698 S = CXXFunctionalCastExpr::CreateEmpty(Context, 3699 /*PathSize*/ Record[ASTStmtReader::NumExprFields]); 3700 break; 3701 3702 case EXPR_USER_DEFINED_LITERAL: 3703 S = new (Context) UserDefinedLiteral(Context, Empty); 3704 break; 3705 3706 case EXPR_CXX_STD_INITIALIZER_LIST: 3707 S = new (Context) CXXStdInitializerListExpr(Empty); 3708 break; 3709 3710 case EXPR_CXX_BOOL_LITERAL: 3711 S = new (Context) CXXBoolLiteralExpr(Empty); 3712 break; 3713 3714 case EXPR_CXX_NULL_PTR_LITERAL: 3715 S = new (Context) CXXNullPtrLiteralExpr(Empty); 3716 break; 3717 case EXPR_CXX_TYPEID_EXPR: 3718 S = new (Context) CXXTypeidExpr(Empty, true); 3719 break; 3720 case EXPR_CXX_TYPEID_TYPE: 3721 S = new (Context) CXXTypeidExpr(Empty, false); 3722 break; 3723 case EXPR_CXX_UUIDOF_EXPR: 3724 S = new (Context) CXXUuidofExpr(Empty, true); 3725 break; 3726 case EXPR_CXX_PROPERTY_REF_EXPR: 3727 S = new (Context) MSPropertyRefExpr(Empty); 3728 break; 3729 case EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR: 3730 S = new (Context) MSPropertySubscriptExpr(Empty); 3731 break; 3732 case EXPR_CXX_UUIDOF_TYPE: 3733 S = new (Context) CXXUuidofExpr(Empty, false); 3734 break; 3735 case EXPR_CXX_THIS: 3736 S = new (Context) CXXThisExpr(Empty); 3737 break; 3738 case EXPR_CXX_THROW: 3739 S = new (Context) CXXThrowExpr(Empty); 3740 break; 3741 case EXPR_CXX_DEFAULT_ARG: 3742 S = new (Context) CXXDefaultArgExpr(Empty); 3743 break; 3744 case EXPR_CXX_DEFAULT_INIT: 3745 S = new (Context) CXXDefaultInitExpr(Empty); 3746 break; 3747 case EXPR_CXX_BIND_TEMPORARY: 3748 S = new (Context) CXXBindTemporaryExpr(Empty); 3749 break; 3750 3751 case EXPR_CXX_SCALAR_VALUE_INIT: 3752 S = new (Context) CXXScalarValueInitExpr(Empty); 3753 break; 3754 case EXPR_CXX_NEW: 3755 S = new (Context) CXXNewExpr(Empty); 3756 break; 3757 case EXPR_CXX_DELETE: 3758 S = new (Context) CXXDeleteExpr(Empty); 3759 break; 3760 case EXPR_CXX_PSEUDO_DESTRUCTOR: 3761 S = new (Context) CXXPseudoDestructorExpr(Empty); 3762 break; 3763 3764 case EXPR_EXPR_WITH_CLEANUPS: 3765 S = ExprWithCleanups::Create(Context, Empty, 3766 Record[ASTStmtReader::NumExprFields]); 3767 break; 3768 3769 case EXPR_CXX_DEPENDENT_SCOPE_MEMBER: 3770 S = CXXDependentScopeMemberExpr::CreateEmpty(Context, 3771 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 3772 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 3773 ? Record[ASTStmtReader::NumExprFields + 1] 3774 : 0); 3775 break; 3776 3777 case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF: 3778 S = DependentScopeDeclRefExpr::CreateEmpty(Context, 3779 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 3780 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 3781 ? Record[ASTStmtReader::NumExprFields + 1] 3782 : 0); 3783 break; 3784 3785 case EXPR_CXX_UNRESOLVED_CONSTRUCT: 3786 S = CXXUnresolvedConstructExpr::CreateEmpty(Context, 3787 /*NumArgs=*/Record[ASTStmtReader::NumExprFields]); 3788 break; 3789 3790 case EXPR_CXX_UNRESOLVED_MEMBER: 3791 S = UnresolvedMemberExpr::CreateEmpty(Context, 3792 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 3793 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 3794 ? Record[ASTStmtReader::NumExprFields + 1] 3795 : 0); 3796 break; 3797 3798 case EXPR_CXX_UNRESOLVED_LOOKUP: 3799 S = UnresolvedLookupExpr::CreateEmpty(Context, 3800 /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields], 3801 /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields] 3802 ? Record[ASTStmtReader::NumExprFields + 1] 3803 : 0); 3804 break; 3805 3806 case EXPR_TYPE_TRAIT: 3807 S = TypeTraitExpr::CreateDeserialized(Context, 3808 Record[ASTStmtReader::NumExprFields]); 3809 break; 3810 3811 case EXPR_ARRAY_TYPE_TRAIT: 3812 S = new (Context) ArrayTypeTraitExpr(Empty); 3813 break; 3814 3815 case EXPR_CXX_EXPRESSION_TRAIT: 3816 S = new (Context) ExpressionTraitExpr(Empty); 3817 break; 3818 3819 case EXPR_CXX_NOEXCEPT: 3820 S = new (Context) CXXNoexceptExpr(Empty); 3821 break; 3822 3823 case EXPR_PACK_EXPANSION: 3824 S = new (Context) PackExpansionExpr(Empty); 3825 break; 3826 3827 case EXPR_SIZEOF_PACK: 3828 S = SizeOfPackExpr::CreateDeserialized( 3829 Context, 3830 /*NumPartialArgs=*/Record[ASTStmtReader::NumExprFields]); 3831 break; 3832 3833 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM: 3834 S = new (Context) SubstNonTypeTemplateParmExpr(Empty); 3835 break; 3836 3837 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK: 3838 S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty); 3839 break; 3840 3841 case EXPR_FUNCTION_PARM_PACK: 3842 S = FunctionParmPackExpr::CreateEmpty(Context, 3843 Record[ASTStmtReader::NumExprFields]); 3844 break; 3845 3846 case EXPR_MATERIALIZE_TEMPORARY: 3847 S = new (Context) MaterializeTemporaryExpr(Empty); 3848 break; 3849 3850 case EXPR_CXX_FOLD: 3851 S = new (Context) CXXFoldExpr(Empty); 3852 break; 3853 3854 case EXPR_OPAQUE_VALUE: 3855 S = new (Context) OpaqueValueExpr(Empty); 3856 break; 3857 3858 case EXPR_CUDA_KERNEL_CALL: 3859 S = new (Context) CUDAKernelCallExpr(Context, Empty); 3860 break; 3861 3862 case EXPR_ASTYPE: 3863 S = new (Context) AsTypeExpr(Empty); 3864 break; 3865 3866 case EXPR_PSEUDO_OBJECT: { 3867 unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields]; 3868 S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs); 3869 break; 3870 } 3871 3872 case EXPR_ATOMIC: 3873 S = new (Context) AtomicExpr(Empty); 3874 break; 3875 3876 case EXPR_LAMBDA: { 3877 unsigned NumCaptures = Record[ASTStmtReader::NumExprFields]; 3878 unsigned NumArrayIndexVars = Record[ASTStmtReader::NumExprFields + 1]; 3879 S = LambdaExpr::CreateDeserialized(Context, NumCaptures, 3880 NumArrayIndexVars); 3881 break; 3882 } 3883 } 3884 3885 // We hit a STMT_STOP, so we're done with this expression. 3886 if (Finished) 3887 break; 3888 3889 ++NumStatementsRead; 3890 3891 if (S && !IsStmtReference) { 3892 Reader.Visit(S); 3893 StmtEntries[Cursor.GetCurrentBitNo()] = S; 3894 } 3895 3896 3897 assert(Idx == Record.size() && "Invalid deserialization of statement"); 3898 StmtStack.push_back(S); 3899 } 3900 Done: 3901 assert(StmtStack.size() > PrevNumStmts && "Read too many sub-stmts!"); 3902 assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!"); 3903 return StmtStack.pop_back_val(); 3904 } 3905