4549 lines · cpp
1//===- ASTReaderStmt.cpp - Stmt/Expr Deserialization ----------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Statement/expression deserialization. This implements the10// ASTReader::ReadStmt method.11//12//===----------------------------------------------------------------------===//13 14#include "clang/AST/ASTConcept.h"15#include "clang/AST/ASTContext.h"16#include "clang/AST/AttrIterator.h"17#include "clang/AST/Decl.h"18#include "clang/AST/DeclAccessPair.h"19#include "clang/AST/DeclCXX.h"20#include "clang/AST/DeclGroup.h"21#include "clang/AST/DeclObjC.h"22#include "clang/AST/DeclTemplate.h"23#include "clang/AST/DeclarationName.h"24#include "clang/AST/DependenceFlags.h"25#include "clang/AST/Expr.h"26#include "clang/AST/ExprCXX.h"27#include "clang/AST/ExprObjC.h"28#include "clang/AST/ExprOpenMP.h"29#include "clang/AST/NestedNameSpecifier.h"30#include "clang/AST/OpenMPClause.h"31#include "clang/AST/OperationKinds.h"32#include "clang/AST/Stmt.h"33#include "clang/AST/StmtCXX.h"34#include "clang/AST/StmtObjC.h"35#include "clang/AST/StmtOpenMP.h"36#include "clang/AST/StmtSYCL.h"37#include "clang/AST/StmtVisitor.h"38#include "clang/AST/TemplateBase.h"39#include "clang/AST/Type.h"40#include "clang/AST/UnresolvedSet.h"41#include "clang/Basic/CapturedStmt.h"42#include "clang/Basic/ExpressionTraits.h"43#include "clang/Basic/LLVM.h"44#include "clang/Basic/LangOptions.h"45#include "clang/Basic/OpenMPKinds.h"46#include "clang/Basic/SourceLocation.h"47#include "clang/Basic/Specifiers.h"48#include "clang/Basic/TypeTraits.h"49#include "clang/Lex/Token.h"50#include "clang/Serialization/ASTBitCodes.h"51#include "clang/Serialization/ASTRecordReader.h"52#include "llvm/ADT/DenseMap.h"53#include "llvm/ADT/SmallVector.h"54#include "llvm/ADT/StringRef.h"55#include "llvm/Bitstream/BitstreamReader.h"56#include "llvm/Support/ErrorHandling.h"57#include <algorithm>58#include <cassert>59#include <cstdint>60#include <optional>61#include <string>62 63using namespace clang;64using namespace serialization;65 66namespace clang {67 68 class ASTStmtReader : public StmtVisitor<ASTStmtReader> {69 ASTRecordReader &Record;70 llvm::BitstreamCursor &DeclsCursor;71 72 std::optional<BitsUnpacker> CurrentUnpackingBits;73 74 SourceLocation readSourceLocation() {75 return Record.readSourceLocation();76 }77 78 SourceRange readSourceRange() {79 return Record.readSourceRange();80 }81 82 std::string readString() {83 return Record.readString();84 }85 86 TypeSourceInfo *readTypeSourceInfo() {87 return Record.readTypeSourceInfo();88 }89 90 Decl *readDecl() {91 return Record.readDecl();92 }93 94 template<typename T>95 T *readDeclAs() {96 return Record.readDeclAs<T>();97 }98 99 public:100 ASTStmtReader(ASTRecordReader &Record, llvm::BitstreamCursor &Cursor)101 : Record(Record), DeclsCursor(Cursor) {}102 103 /// The number of record fields required for the Stmt class104 /// itself.105 static const unsigned NumStmtFields = 0;106 107 /// The number of record fields required for the Expr class108 /// itself.109 static const unsigned NumExprFields = NumStmtFields + 2;110 111 /// The number of bits required for the packing bits for the Expr class.112 static const unsigned NumExprBits = 10;113 114 /// Read and initialize a ExplicitTemplateArgumentList structure.115 void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,116 TemplateArgumentLoc *ArgsLocArray,117 unsigned NumTemplateArgs);118 119 void VisitStmt(Stmt *S);120#define STMT(Type, Base) \121 void Visit##Type(Type *);122#include "clang/AST/StmtNodes.inc"123 };124 125} // namespace clang126 127void ASTStmtReader::ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,128 TemplateArgumentLoc *ArgsLocArray,129 unsigned NumTemplateArgs) {130 SourceLocation TemplateKWLoc = readSourceLocation();131 TemplateArgumentListInfo ArgInfo;132 ArgInfo.setLAngleLoc(readSourceLocation());133 ArgInfo.setRAngleLoc(readSourceLocation());134 for (unsigned i = 0; i != NumTemplateArgs; ++i)135 ArgInfo.addArgument(Record.readTemplateArgumentLoc());136 Args.initializeFrom(TemplateKWLoc, ArgInfo, ArgsLocArray);137}138 139void ASTStmtReader::VisitStmt(Stmt *S) {140 assert(Record.getIdx() == NumStmtFields && "Incorrect statement field count");141}142 143void ASTStmtReader::VisitNullStmt(NullStmt *S) {144 VisitStmt(S);145 S->setSemiLoc(readSourceLocation());146 S->NullStmtBits.HasLeadingEmptyMacro = Record.readInt();147}148 149void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) {150 VisitStmt(S);151 SmallVector<Stmt *, 16> Stmts;152 unsigned NumStmts = Record.readInt();153 unsigned HasFPFeatures = Record.readInt();154 assert(S->hasStoredFPFeatures() == HasFPFeatures);155 while (NumStmts--)156 Stmts.push_back(Record.readSubStmt());157 S->setStmts(Stmts);158 if (HasFPFeatures)159 S->setStoredFPFeatures(160 FPOptionsOverride::getFromOpaqueInt(Record.readInt()));161 S->LBraceLoc = readSourceLocation();162 S->RBraceLoc = readSourceLocation();163}164 165void ASTStmtReader::VisitSwitchCase(SwitchCase *S) {166 VisitStmt(S);167 Record.recordSwitchCaseID(S, Record.readInt());168 S->setKeywordLoc(readSourceLocation());169 S->setColonLoc(readSourceLocation());170}171 172void ASTStmtReader::VisitCaseStmt(CaseStmt *S) {173 VisitSwitchCase(S);174 bool CaseStmtIsGNURange = Record.readInt();175 S->setLHS(Record.readSubExpr());176 S->setSubStmt(Record.readSubStmt());177 if (CaseStmtIsGNURange) {178 S->setRHS(Record.readSubExpr());179 S->setEllipsisLoc(readSourceLocation());180 }181}182 183void ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) {184 VisitSwitchCase(S);185 S->setSubStmt(Record.readSubStmt());186}187 188void ASTStmtReader::VisitLabelStmt(LabelStmt *S) {189 VisitStmt(S);190 bool IsSideEntry = Record.readInt();191 auto *LD = readDeclAs<LabelDecl>();192 LD->setStmt(S);193 S->setDecl(LD);194 S->setSubStmt(Record.readSubStmt());195 S->setIdentLoc(readSourceLocation());196 S->setSideEntry(IsSideEntry);197}198 199void ASTStmtReader::VisitAttributedStmt(AttributedStmt *S) {200 VisitStmt(S);201 // NumAttrs in AttributedStmt is set when creating an empty202 // AttributedStmt in AttributedStmt::CreateEmpty, since it is needed203 // to allocate the right amount of space for the trailing Attr *.204 uint64_t NumAttrs = Record.readInt();205 AttrVec Attrs;206 Record.readAttributes(Attrs);207 (void)NumAttrs;208 assert(NumAttrs == S->AttributedStmtBits.NumAttrs);209 assert(NumAttrs == Attrs.size());210 std::copy(Attrs.begin(), Attrs.end(), S->getAttrArrayPtr());211 S->SubStmt = Record.readSubStmt();212 S->AttributedStmtBits.AttrLoc = readSourceLocation();213}214 215void ASTStmtReader::VisitIfStmt(IfStmt *S) {216 VisitStmt(S);217 218 CurrentUnpackingBits.emplace(Record.readInt());219 220 bool HasElse = CurrentUnpackingBits->getNextBit();221 bool HasVar = CurrentUnpackingBits->getNextBit();222 bool HasInit = CurrentUnpackingBits->getNextBit();223 224 S->setStatementKind(static_cast<IfStatementKind>(Record.readInt()));225 S->setCond(Record.readSubExpr());226 S->setThen(Record.readSubStmt());227 if (HasElse)228 S->setElse(Record.readSubStmt());229 if (HasVar)230 S->setConditionVariableDeclStmt(cast<DeclStmt>(Record.readSubStmt()));231 if (HasInit)232 S->setInit(Record.readSubStmt());233 234 S->setIfLoc(readSourceLocation());235 S->setLParenLoc(readSourceLocation());236 S->setRParenLoc(readSourceLocation());237 if (HasElse)238 S->setElseLoc(readSourceLocation());239}240 241void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) {242 VisitStmt(S);243 244 bool HasInit = Record.readInt();245 bool HasVar = Record.readInt();246 bool AllEnumCasesCovered = Record.readInt();247 if (AllEnumCasesCovered)248 S->setAllEnumCasesCovered();249 250 S->setCond(Record.readSubExpr());251 S->setBody(Record.readSubStmt());252 if (HasInit)253 S->setInit(Record.readSubStmt());254 if (HasVar)255 S->setConditionVariableDeclStmt(cast<DeclStmt>(Record.readSubStmt()));256 257 S->setSwitchLoc(readSourceLocation());258 S->setLParenLoc(readSourceLocation());259 S->setRParenLoc(readSourceLocation());260 261 SwitchCase *PrevSC = nullptr;262 for (auto E = Record.size(); Record.getIdx() != E; ) {263 SwitchCase *SC = Record.getSwitchCaseWithID(Record.readInt());264 if (PrevSC)265 PrevSC->setNextSwitchCase(SC);266 else267 S->setSwitchCaseList(SC);268 269 PrevSC = SC;270 }271}272 273void ASTStmtReader::VisitWhileStmt(WhileStmt *S) {274 VisitStmt(S);275 276 bool HasVar = Record.readInt();277 278 S->setCond(Record.readSubExpr());279 S->setBody(Record.readSubStmt());280 if (HasVar)281 S->setConditionVariableDeclStmt(cast<DeclStmt>(Record.readSubStmt()));282 283 S->setWhileLoc(readSourceLocation());284 S->setLParenLoc(readSourceLocation());285 S->setRParenLoc(readSourceLocation());286}287 288void ASTStmtReader::VisitDoStmt(DoStmt *S) {289 VisitStmt(S);290 S->setCond(Record.readSubExpr());291 S->setBody(Record.readSubStmt());292 S->setDoLoc(readSourceLocation());293 S->setWhileLoc(readSourceLocation());294 S->setRParenLoc(readSourceLocation());295}296 297void ASTStmtReader::VisitForStmt(ForStmt *S) {298 VisitStmt(S);299 S->setInit(Record.readSubStmt());300 S->setCond(Record.readSubExpr());301 S->setConditionVariableDeclStmt(cast_or_null<DeclStmt>(Record.readSubStmt()));302 S->setInc(Record.readSubExpr());303 S->setBody(Record.readSubStmt());304 S->setForLoc(readSourceLocation());305 S->setLParenLoc(readSourceLocation());306 S->setRParenLoc(readSourceLocation());307}308 309void ASTStmtReader::VisitGotoStmt(GotoStmt *S) {310 VisitStmt(S);311 S->setLabel(readDeclAs<LabelDecl>());312 S->setGotoLoc(readSourceLocation());313 S->setLabelLoc(readSourceLocation());314}315 316void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {317 VisitStmt(S);318 S->setGotoLoc(readSourceLocation());319 S->setStarLoc(readSourceLocation());320 S->setTarget(Record.readSubExpr());321}322 323void ASTStmtReader::VisitLoopControlStmt(LoopControlStmt *S) {324 VisitStmt(S);325 S->setKwLoc(readSourceLocation());326 if (Record.readBool()) {327 S->setLabelDecl(readDeclAs<LabelDecl>());328 S->setLabelLoc(readSourceLocation());329 }330}331 332void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {333 VisitLoopControlStmt(S);334}335 336void ASTStmtReader::VisitBreakStmt(BreakStmt *S) { VisitLoopControlStmt(S); }337 338void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) {339 VisitStmt(S);340 341 bool HasNRVOCandidate = Record.readInt();342 343 S->setRetValue(Record.readSubExpr());344 if (HasNRVOCandidate)345 S->setNRVOCandidate(readDeclAs<VarDecl>());346 347 S->setReturnLoc(readSourceLocation());348}349 350void ASTStmtReader::VisitDeclStmt(DeclStmt *S) {351 VisitStmt(S);352 S->setStartLoc(readSourceLocation());353 S->setEndLoc(readSourceLocation());354 355 if (Record.size() - Record.getIdx() == 1) {356 // Single declaration357 S->setDeclGroup(DeclGroupRef(readDecl()));358 } else {359 SmallVector<Decl *, 16> Decls;360 int N = Record.size() - Record.getIdx();361 Decls.reserve(N);362 for (int I = 0; I < N; ++I)363 Decls.push_back(readDecl());364 S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Record.getContext(),365 Decls.data(),366 Decls.size())));367 }368}369 370void ASTStmtReader::VisitAsmStmt(AsmStmt *S) {371 VisitStmt(S);372 S->NumOutputs = Record.readInt();373 S->NumInputs = Record.readInt();374 S->NumClobbers = Record.readInt();375 S->setAsmLoc(readSourceLocation());376 S->setVolatile(Record.readInt());377 S->setSimple(Record.readInt());378}379 380void ASTStmtReader::VisitGCCAsmStmt(GCCAsmStmt *S) {381 VisitAsmStmt(S);382 S->NumLabels = Record.readInt();383 S->setRParenLoc(readSourceLocation());384 S->setAsmStringExpr(cast_or_null<Expr>(Record.readSubStmt()));385 386 unsigned NumOutputs = S->getNumOutputs();387 unsigned NumInputs = S->getNumInputs();388 unsigned NumClobbers = S->getNumClobbers();389 unsigned NumLabels = S->getNumLabels();390 391 // Outputs and inputs392 SmallVector<IdentifierInfo *, 16> Names;393 SmallVector<Expr *, 16> Constraints;394 SmallVector<Stmt*, 16> Exprs;395 for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {396 Names.push_back(Record.readIdentifier());397 Constraints.push_back(cast_or_null<Expr>(Record.readSubStmt()));398 Exprs.push_back(Record.readSubStmt());399 }400 401 // Constraints402 SmallVector<Expr *, 16> Clobbers;403 for (unsigned I = 0; I != NumClobbers; ++I)404 Clobbers.push_back(cast_or_null<Expr>(Record.readSubStmt()));405 406 // Labels407 for (unsigned I = 0, N = NumLabels; I != N; ++I) {408 Names.push_back(Record.readIdentifier());409 Exprs.push_back(Record.readSubStmt());410 }411 412 S->setOutputsAndInputsAndClobbers(Record.getContext(),413 Names.data(), Constraints.data(),414 Exprs.data(), NumOutputs, NumInputs,415 NumLabels,416 Clobbers.data(), NumClobbers);417}418 419void ASTStmtReader::VisitMSAsmStmt(MSAsmStmt *S) {420 VisitAsmStmt(S);421 S->LBraceLoc = readSourceLocation();422 S->EndLoc = readSourceLocation();423 S->NumAsmToks = Record.readInt();424 std::string AsmStr = readString();425 426 // Read the tokens.427 SmallVector<Token, 16> AsmToks;428 AsmToks.reserve(S->NumAsmToks);429 for (unsigned i = 0, e = S->NumAsmToks; i != e; ++i) {430 AsmToks.push_back(Record.readToken());431 }432 433 // The calls to reserve() for the FooData vectors are mandatory to434 // prevent dead StringRefs in the Foo vectors.435 436 // Read the clobbers.437 SmallVector<std::string, 16> ClobbersData;438 SmallVector<StringRef, 16> Clobbers;439 ClobbersData.reserve(S->NumClobbers);440 Clobbers.reserve(S->NumClobbers);441 for (unsigned i = 0, e = S->NumClobbers; i != e; ++i) {442 ClobbersData.push_back(readString());443 Clobbers.push_back(ClobbersData.back());444 }445 446 // Read the operands.447 unsigned NumOperands = S->NumOutputs + S->NumInputs;448 SmallVector<Expr*, 16> Exprs;449 SmallVector<std::string, 16> ConstraintsData;450 SmallVector<StringRef, 16> Constraints;451 Exprs.reserve(NumOperands);452 ConstraintsData.reserve(NumOperands);453 Constraints.reserve(NumOperands);454 for (unsigned i = 0; i != NumOperands; ++i) {455 Exprs.push_back(cast<Expr>(Record.readSubStmt()));456 ConstraintsData.push_back(readString());457 Constraints.push_back(ConstraintsData.back());458 }459 460 S->initialize(Record.getContext(), AsmStr, AsmToks,461 Constraints, Exprs, Clobbers);462}463 464void ASTStmtReader::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {465 VisitStmt(S);466 assert(Record.peekInt() == S->NumParams);467 Record.skipInts(1);468 auto *StoredStmts = S->getStoredStmts();469 for (unsigned i = 0;470 i < CoroutineBodyStmt::SubStmt::FirstParamMove + S->NumParams; ++i)471 StoredStmts[i] = Record.readSubStmt();472}473 474void ASTStmtReader::VisitCoreturnStmt(CoreturnStmt *S) {475 VisitStmt(S);476 S->CoreturnLoc = Record.readSourceLocation();477 for (auto &SubStmt: S->SubStmts)478 SubStmt = Record.readSubStmt();479 S->IsImplicit = Record.readInt() != 0;480}481 482void ASTStmtReader::VisitCoawaitExpr(CoawaitExpr *E) {483 VisitExpr(E);484 E->KeywordLoc = readSourceLocation();485 for (auto &SubExpr: E->SubExprs)486 SubExpr = Record.readSubStmt();487 E->OpaqueValue = cast_or_null<OpaqueValueExpr>(Record.readSubStmt());488 E->setIsImplicit(Record.readInt() != 0);489}490 491void ASTStmtReader::VisitCoyieldExpr(CoyieldExpr *E) {492 VisitExpr(E);493 E->KeywordLoc = readSourceLocation();494 for (auto &SubExpr: E->SubExprs)495 SubExpr = Record.readSubStmt();496 E->OpaqueValue = cast_or_null<OpaqueValueExpr>(Record.readSubStmt());497}498 499void ASTStmtReader::VisitDependentCoawaitExpr(DependentCoawaitExpr *E) {500 VisitExpr(E);501 E->KeywordLoc = readSourceLocation();502 for (auto &SubExpr: E->SubExprs)503 SubExpr = Record.readSubStmt();504}505 506void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) {507 VisitStmt(S);508 Record.skipInts(1);509 S->setCapturedDecl(readDeclAs<CapturedDecl>());510 S->setCapturedRegionKind(static_cast<CapturedRegionKind>(Record.readInt()));511 S->setCapturedRecordDecl(readDeclAs<RecordDecl>());512 513 // Capture inits514 for (CapturedStmt::capture_init_iterator I = S->capture_init_begin(),515 E = S->capture_init_end();516 I != E; ++I)517 *I = Record.readSubExpr();518 519 // Body520 S->setCapturedStmt(Record.readSubStmt());521 S->getCapturedDecl()->setBody(S->getCapturedStmt());522 523 // Captures524 for (auto &I : S->captures()) {525 I.VarAndKind.setPointer(readDeclAs<VarDecl>());526 I.VarAndKind.setInt(527 static_cast<CapturedStmt::VariableCaptureKind>(Record.readInt()));528 I.Loc = readSourceLocation();529 }530}531 532void ASTStmtReader::VisitSYCLKernelCallStmt(SYCLKernelCallStmt *S) {533 VisitStmt(S);534 S->setOriginalStmt(cast<CompoundStmt>(Record.readSubStmt()));535 S->setOutlinedFunctionDecl(readDeclAs<OutlinedFunctionDecl>());536}537 538void ASTStmtReader::VisitExpr(Expr *E) {539 VisitStmt(E);540 CurrentUnpackingBits.emplace(Record.readInt());541 E->setDependence(static_cast<ExprDependence>(542 CurrentUnpackingBits->getNextBits(/*Width=*/5)));543 E->setValueKind(static_cast<ExprValueKind>(544 CurrentUnpackingBits->getNextBits(/*Width=*/2)));545 E->setObjectKind(static_cast<ExprObjectKind>(546 CurrentUnpackingBits->getNextBits(/*Width=*/3)));547 548 E->setType(Record.readType());549 assert(Record.getIdx() == NumExprFields &&550 "Incorrect expression field count");551}552 553void ASTStmtReader::VisitConstantExpr(ConstantExpr *E) {554 VisitExpr(E);555 556 auto StorageKind = static_cast<ConstantResultStorageKind>(Record.readInt());557 assert(E->getResultStorageKind() == StorageKind && "Wrong ResultKind!");558 559 E->ConstantExprBits.APValueKind = Record.readInt();560 E->ConstantExprBits.IsUnsigned = Record.readInt();561 E->ConstantExprBits.BitWidth = Record.readInt();562 E->ConstantExprBits.HasCleanup = false; // Not serialized, see below.563 E->ConstantExprBits.IsImmediateInvocation = Record.readInt();564 565 switch (StorageKind) {566 case ConstantResultStorageKind::None:567 break;568 569 case ConstantResultStorageKind::Int64:570 E->Int64Result() = Record.readInt();571 break;572 573 case ConstantResultStorageKind::APValue:574 E->APValueResult() = Record.readAPValue();575 if (E->APValueResult().needsCleanup()) {576 E->ConstantExprBits.HasCleanup = true;577 Record.getContext().addDestruction(&E->APValueResult());578 }579 break;580 }581 582 E->setSubExpr(Record.readSubExpr());583}584 585void ASTStmtReader::VisitOpenACCAsteriskSizeExpr(OpenACCAsteriskSizeExpr *E) {586 VisitExpr(E);587 E->setAsteriskLocation(readSourceLocation());588}589 590void ASTStmtReader::VisitSYCLUniqueStableNameExpr(SYCLUniqueStableNameExpr *E) {591 VisitExpr(E);592 593 E->setLocation(readSourceLocation());594 E->setLParenLocation(readSourceLocation());595 E->setRParenLocation(readSourceLocation());596 597 E->setTypeSourceInfo(Record.readTypeSourceInfo());598}599 600void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {601 VisitExpr(E);602 bool HasFunctionName = Record.readInt();603 E->PredefinedExprBits.HasFunctionName = HasFunctionName;604 E->PredefinedExprBits.Kind = Record.readInt();605 E->PredefinedExprBits.IsTransparent = Record.readInt();606 E->setLocation(readSourceLocation());607 if (HasFunctionName)608 E->setFunctionName(cast<StringLiteral>(Record.readSubExpr()));609}610 611void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {612 VisitExpr(E);613 614 CurrentUnpackingBits.emplace(Record.readInt());615 E->DeclRefExprBits.HadMultipleCandidates = CurrentUnpackingBits->getNextBit();616 E->DeclRefExprBits.RefersToEnclosingVariableOrCapture =617 CurrentUnpackingBits->getNextBit();618 E->DeclRefExprBits.NonOdrUseReason =619 CurrentUnpackingBits->getNextBits(/*Width=*/2);620 E->DeclRefExprBits.IsImmediateEscalating = CurrentUnpackingBits->getNextBit();621 E->DeclRefExprBits.HasFoundDecl = CurrentUnpackingBits->getNextBit();622 E->DeclRefExprBits.HasQualifier = CurrentUnpackingBits->getNextBit();623 E->DeclRefExprBits.HasTemplateKWAndArgsInfo =624 CurrentUnpackingBits->getNextBit();625 E->DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = false;626 unsigned NumTemplateArgs = 0;627 if (E->hasTemplateKWAndArgsInfo())628 NumTemplateArgs = Record.readInt();629 630 if (E->hasQualifier())631 new (E->getTrailingObjects<NestedNameSpecifierLoc>())632 NestedNameSpecifierLoc(Record.readNestedNameSpecifierLoc());633 634 if (E->hasFoundDecl())635 *E->getTrailingObjects<NamedDecl *>() = readDeclAs<NamedDecl>();636 637 if (E->hasTemplateKWAndArgsInfo())638 ReadTemplateKWAndArgsInfo(639 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),640 E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs);641 642 E->D = readDeclAs<ValueDecl>();643 E->setLocation(readSourceLocation());644 E->DNLoc = Record.readDeclarationNameLoc(E->getDecl()->getDeclName());645}646 647void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {648 VisitExpr(E);649 E->setLocation(readSourceLocation());650 E->setValue(Record.getContext(), Record.readAPInt());651}652 653void ASTStmtReader::VisitFixedPointLiteral(FixedPointLiteral *E) {654 VisitExpr(E);655 E->setLocation(readSourceLocation());656 E->setScale(Record.readInt());657 E->setValue(Record.getContext(), Record.readAPInt());658}659 660void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {661 VisitExpr(E);662 E->setRawSemantics(663 static_cast<llvm::APFloatBase::Semantics>(Record.readInt()));664 E->setExact(Record.readInt());665 E->setValue(Record.getContext(), Record.readAPFloat(E->getSemantics()));666 E->setLocation(readSourceLocation());667}668 669void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {670 VisitExpr(E);671 E->setSubExpr(Record.readSubExpr());672}673 674void ASTStmtReader::VisitStringLiteral(StringLiteral *E) {675 VisitExpr(E);676 677 // NumConcatenated, Length and CharByteWidth are set by the empty678 // ctor since they are needed to allocate storage for the trailing objects.679 unsigned NumConcatenated = Record.readInt();680 unsigned Length = Record.readInt();681 unsigned CharByteWidth = Record.readInt();682 assert((NumConcatenated == E->getNumConcatenated()) &&683 "Wrong number of concatenated tokens!");684 assert((Length == E->getLength()) && "Wrong Length!");685 assert((CharByteWidth == E->getCharByteWidth()) && "Wrong character width!");686 E->StringLiteralBits.Kind = Record.readInt();687 E->StringLiteralBits.IsPascal = Record.readInt();688 689 // The character width is originally computed via mapCharByteWidth.690 // Check that the deserialized character width is consistant with the result691 // of calling mapCharByteWidth.692 assert((CharByteWidth ==693 StringLiteral::mapCharByteWidth(Record.getContext().getTargetInfo(),694 E->getKind())) &&695 "Wrong character width!");696 697 // Deserialize the trailing array of SourceLocation.698 for (unsigned I = 0; I < NumConcatenated; ++I)699 E->setStrTokenLoc(I, readSourceLocation());700 701 // Deserialize the trailing array of char holding the string data.702 char *StrData = E->getStrDataAsChar();703 for (unsigned I = 0; I < Length * CharByteWidth; ++I)704 StrData[I] = Record.readInt();705}706 707void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {708 VisitExpr(E);709 E->setValue(Record.readInt());710 E->setLocation(readSourceLocation());711 E->setKind(static_cast<CharacterLiteralKind>(Record.readInt()));712}713 714void ASTStmtReader::VisitParenExpr(ParenExpr *E) {715 VisitExpr(E);716 E->setIsProducedByFoldExpansion(Record.readInt());717 E->setLParen(readSourceLocation());718 E->setRParen(readSourceLocation());719 E->setSubExpr(Record.readSubExpr());720}721 722void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {723 VisitExpr(E);724 unsigned NumExprs = Record.readInt();725 assert((NumExprs == E->getNumExprs()) && "Wrong NumExprs!");726 for (unsigned I = 0; I != NumExprs; ++I)727 E->getTrailingObjects()[I] = Record.readSubStmt();728 E->LParenLoc = readSourceLocation();729 E->RParenLoc = readSourceLocation();730}731 732void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {733 VisitExpr(E);734 bool hasFP_Features = CurrentUnpackingBits->getNextBit();735 assert(hasFP_Features == E->hasStoredFPFeatures());736 E->setSubExpr(Record.readSubExpr());737 E->setOpcode(738 (UnaryOperator::Opcode)CurrentUnpackingBits->getNextBits(/*Width=*/5));739 E->setOperatorLoc(readSourceLocation());740 E->setCanOverflow(CurrentUnpackingBits->getNextBit());741 if (hasFP_Features)742 E->setStoredFPFeatures(743 FPOptionsOverride::getFromOpaqueInt(Record.readInt()));744}745 746void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {747 VisitExpr(E);748 assert(E->getNumComponents() == Record.peekInt());749 Record.skipInts(1);750 assert(E->getNumExpressions() == Record.peekInt());751 Record.skipInts(1);752 E->setOperatorLoc(readSourceLocation());753 E->setRParenLoc(readSourceLocation());754 E->setTypeSourceInfo(readTypeSourceInfo());755 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {756 auto Kind = static_cast<OffsetOfNode::Kind>(Record.readInt());757 SourceLocation Start = readSourceLocation();758 SourceLocation End = readSourceLocation();759 switch (Kind) {760 case OffsetOfNode::Array:761 E->setComponent(I, OffsetOfNode(Start, Record.readInt(), End));762 break;763 764 case OffsetOfNode::Field:765 E->setComponent(766 I, OffsetOfNode(Start, readDeclAs<FieldDecl>(), End));767 break;768 769 case OffsetOfNode::Identifier:770 E->setComponent(771 I,772 OffsetOfNode(Start, Record.readIdentifier(), End));773 break;774 775 case OffsetOfNode::Base: {776 auto *Base = new (Record.getContext()) CXXBaseSpecifier();777 *Base = Record.readCXXBaseSpecifier();778 E->setComponent(I, OffsetOfNode(Base));779 break;780 }781 }782 }783 784 for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)785 E->setIndexExpr(I, Record.readSubExpr());786}787 788void ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {789 VisitExpr(E);790 E->setKind(static_cast<UnaryExprOrTypeTrait>(Record.readInt()));791 if (Record.peekInt() == 0) {792 E->setArgument(Record.readSubExpr());793 Record.skipInts(1);794 } else {795 E->setArgument(readTypeSourceInfo());796 }797 E->setOperatorLoc(readSourceLocation());798 E->setRParenLoc(readSourceLocation());799}800 801static ConstraintSatisfaction802readConstraintSatisfaction(ASTRecordReader &Record) {803 ConstraintSatisfaction Satisfaction;804 Satisfaction.IsSatisfied = Record.readInt();805 Satisfaction.ContainsErrors = Record.readInt();806 const ASTContext &C = Record.getContext();807 if (!Satisfaction.IsSatisfied) {808 unsigned NumDetailRecords = Record.readInt();809 for (unsigned i = 0; i != NumDetailRecords; ++i) {810 auto Kind = Record.readInt();811 if (Kind == 0) {812 SourceLocation DiagLocation = Record.readSourceLocation();813 StringRef DiagMessage = C.backupStr(Record.readString());814 815 Satisfaction.Details.emplace_back(new (816 C) ConstraintSubstitutionDiagnostic(DiagLocation, DiagMessage));817 } else if (Kind == 1) {818 Satisfaction.Details.emplace_back(Record.readExpr());819 } else {820 assert(Kind == 2);821 Satisfaction.Details.emplace_back(Record.readConceptReference());822 }823 }824 }825 return Satisfaction;826}827 828void ASTStmtReader::VisitConceptSpecializationExpr(829 ConceptSpecializationExpr *E) {830 VisitExpr(E);831 E->SpecDecl = Record.readDeclAs<ImplicitConceptSpecializationDecl>();832 if (Record.readBool())833 E->ConceptRef = Record.readConceptReference();834 E->Satisfaction = E->isValueDependent() ? nullptr :835 ASTConstraintSatisfaction::Create(Record.getContext(),836 readConstraintSatisfaction(Record));837}838 839static concepts::Requirement::SubstitutionDiagnostic *840readSubstitutionDiagnostic(ASTRecordReader &Record) {841 const ASTContext &C = Record.getContext();842 StringRef SubstitutedEntity = C.backupStr(Record.readString());843 SourceLocation DiagLoc = Record.readSourceLocation();844 StringRef DiagMessage = C.backupStr(Record.readString());845 846 return new (Record.getContext())847 concepts::Requirement::SubstitutionDiagnostic{SubstitutedEntity, DiagLoc,848 DiagMessage};849}850 851void ASTStmtReader::VisitRequiresExpr(RequiresExpr *E) {852 VisitExpr(E);853 unsigned NumLocalParameters = Record.readInt();854 unsigned NumRequirements = Record.readInt();855 E->RequiresExprBits.RequiresKWLoc = Record.readSourceLocation();856 E->RequiresExprBits.IsSatisfied = Record.readInt();857 E->Body = Record.readDeclAs<RequiresExprBodyDecl>();858 llvm::SmallVector<ParmVarDecl *, 4> LocalParameters;859 for (unsigned i = 0; i < NumLocalParameters; ++i)860 LocalParameters.push_back(cast<ParmVarDecl>(Record.readDecl()));861 std::copy(LocalParameters.begin(), LocalParameters.end(),862 E->getTrailingObjects<ParmVarDecl *>());863 llvm::SmallVector<concepts::Requirement *, 4> Requirements;864 for (unsigned i = 0; i < NumRequirements; ++i) {865 auto RK =866 static_cast<concepts::Requirement::RequirementKind>(Record.readInt());867 concepts::Requirement *R = nullptr;868 switch (RK) {869 case concepts::Requirement::RK_Type: {870 auto Status =871 static_cast<concepts::TypeRequirement::SatisfactionStatus>(872 Record.readInt());873 if (Status == concepts::TypeRequirement::SS_SubstitutionFailure)874 R = new (Record.getContext())875 concepts::TypeRequirement(readSubstitutionDiagnostic(Record));876 else877 R = new (Record.getContext())878 concepts::TypeRequirement(Record.readTypeSourceInfo());879 } break;880 case concepts::Requirement::RK_Simple:881 case concepts::Requirement::RK_Compound: {882 auto Status =883 static_cast<concepts::ExprRequirement::SatisfactionStatus>(884 Record.readInt());885 llvm::PointerUnion<concepts::Requirement::SubstitutionDiagnostic *,886 Expr *> E;887 if (Status == concepts::ExprRequirement::SS_ExprSubstitutionFailure) {888 E = readSubstitutionDiagnostic(Record);889 } else890 E = Record.readExpr();891 892 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> Req;893 ConceptSpecializationExpr *SubstitutedConstraintExpr = nullptr;894 SourceLocation NoexceptLoc;895 if (RK == concepts::Requirement::RK_Simple) {896 Req.emplace();897 } else {898 NoexceptLoc = Record.readSourceLocation();899 switch (/* returnTypeRequirementKind */Record.readInt()) {900 case 0:901 // No return type requirement.902 Req.emplace();903 break;904 case 1: {905 // type-constraint906 TemplateParameterList *TPL = Record.readTemplateParameterList();907 if (Status >=908 concepts::ExprRequirement::SS_ConstraintsNotSatisfied)909 SubstitutedConstraintExpr =910 cast<ConceptSpecializationExpr>(Record.readExpr());911 Req.emplace(TPL);912 } break;913 case 2:914 // Substitution failure915 Req.emplace(readSubstitutionDiagnostic(Record));916 break;917 }918 }919 if (Expr *Ex = E.dyn_cast<Expr *>())920 R = new (Record.getContext()) concepts::ExprRequirement(921 Ex, RK == concepts::Requirement::RK_Simple, NoexceptLoc,922 std::move(*Req), Status, SubstitutedConstraintExpr);923 else924 R = new (Record.getContext()) concepts::ExprRequirement(925 cast<concepts::Requirement::SubstitutionDiagnostic *>(E),926 RK == concepts::Requirement::RK_Simple, NoexceptLoc,927 std::move(*Req));928 } break;929 case concepts::Requirement::RK_Nested: {930 ASTContext &C = Record.getContext();931 bool HasInvalidConstraint = Record.readInt();932 if (HasInvalidConstraint) {933 StringRef InvalidConstraint = C.backupStr(Record.readString());934 R = new (C) concepts::NestedRequirement(935 Record.getContext(), InvalidConstraint,936 readConstraintSatisfaction(Record));937 break;938 }939 Expr *E = Record.readExpr();940 if (E->isInstantiationDependent())941 R = new (C) concepts::NestedRequirement(E);942 else943 R = new (C) concepts::NestedRequirement(944 C, E, readConstraintSatisfaction(Record));945 } break;946 }947 if (!R)948 continue;949 Requirements.push_back(R);950 }951 std::copy(Requirements.begin(), Requirements.end(),952 E->getTrailingObjects<concepts::Requirement *>());953 E->LParenLoc = Record.readSourceLocation();954 E->RParenLoc = Record.readSourceLocation();955 E->RBraceLoc = Record.readSourceLocation();956}957 958void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {959 VisitExpr(E);960 E->setLHS(Record.readSubExpr());961 E->setRHS(Record.readSubExpr());962 E->setRBracketLoc(readSourceLocation());963}964 965void ASTStmtReader::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *E) {966 VisitExpr(E);967 E->setBase(Record.readSubExpr());968 E->setRowIdx(Record.readSubExpr());969 E->setColumnIdx(Record.readSubExpr());970 E->setRBracketLoc(readSourceLocation());971}972 973void ASTStmtReader::VisitArraySectionExpr(ArraySectionExpr *E) {974 VisitExpr(E);975 E->ASType = Record.readEnum<ArraySectionExpr::ArraySectionType>();976 977 E->setBase(Record.readSubExpr());978 E->setLowerBound(Record.readSubExpr());979 E->setLength(Record.readSubExpr());980 981 if (E->isOMPArraySection())982 E->setStride(Record.readSubExpr());983 984 E->setColonLocFirst(readSourceLocation());985 986 if (E->isOMPArraySection())987 E->setColonLocSecond(readSourceLocation());988 989 E->setRBracketLoc(readSourceLocation());990}991 992void ASTStmtReader::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *E) {993 VisitExpr(E);994 unsigned NumDims = Record.readInt();995 E->setBase(Record.readSubExpr());996 SmallVector<Expr *, 4> Dims(NumDims);997 for (unsigned I = 0; I < NumDims; ++I)998 Dims[I] = Record.readSubExpr();999 E->setDimensions(Dims);1000 SmallVector<SourceRange, 4> SRs(NumDims);1001 for (unsigned I = 0; I < NumDims; ++I)1002 SRs[I] = readSourceRange();1003 E->setBracketsRanges(SRs);1004 E->setLParenLoc(readSourceLocation());1005 E->setRParenLoc(readSourceLocation());1006}1007 1008void ASTStmtReader::VisitOMPIteratorExpr(OMPIteratorExpr *E) {1009 VisitExpr(E);1010 unsigned NumIters = Record.readInt();1011 E->setIteratorKwLoc(readSourceLocation());1012 E->setLParenLoc(readSourceLocation());1013 E->setRParenLoc(readSourceLocation());1014 for (unsigned I = 0; I < NumIters; ++I) {1015 E->setIteratorDeclaration(I, Record.readDeclRef());1016 E->setAssignmentLoc(I, readSourceLocation());1017 Expr *Begin = Record.readSubExpr();1018 Expr *End = Record.readSubExpr();1019 Expr *Step = Record.readSubExpr();1020 SourceLocation ColonLoc = readSourceLocation();1021 SourceLocation SecColonLoc;1022 if (Step)1023 SecColonLoc = readSourceLocation();1024 E->setIteratorRange(I, Begin, ColonLoc, End, SecColonLoc, Step);1025 // Deserialize helpers1026 OMPIteratorHelperData HD;1027 HD.CounterVD = cast_or_null<VarDecl>(Record.readDeclRef());1028 HD.Upper = Record.readSubExpr();1029 HD.Update = Record.readSubExpr();1030 HD.CounterUpdate = Record.readSubExpr();1031 E->setHelper(I, HD);1032 }1033}1034 1035void ASTStmtReader::VisitCallExpr(CallExpr *E) {1036 VisitExpr(E);1037 1038 unsigned NumArgs = Record.readInt();1039 CurrentUnpackingBits.emplace(Record.readInt());1040 E->setADLCallKind(1041 static_cast<CallExpr::ADLCallKind>(CurrentUnpackingBits->getNextBit()));1042 bool HasFPFeatures = CurrentUnpackingBits->getNextBit();1043 E->setCoroElideSafe(CurrentUnpackingBits->getNextBit());1044 E->setUsesMemberSyntax(CurrentUnpackingBits->getNextBit());1045 assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!");1046 E->setRParenLoc(readSourceLocation());1047 E->setCallee(Record.readSubExpr());1048 for (unsigned I = 0; I != NumArgs; ++I)1049 E->setArg(I, Record.readSubExpr());1050 1051 if (HasFPFeatures)1052 E->setStoredFPFeatures(1053 FPOptionsOverride::getFromOpaqueInt(Record.readInt()));1054 1055 if (E->getStmtClass() == Stmt::CallExprClass)1056 E->updateTrailingSourceLoc();1057}1058 1059void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {1060 VisitCallExpr(E);1061}1062 1063void ASTStmtReader::VisitMemberExpr(MemberExpr *E) {1064 VisitExpr(E);1065 1066 CurrentUnpackingBits.emplace(Record.readInt());1067 bool HasQualifier = CurrentUnpackingBits->getNextBit();1068 bool HasFoundDecl = CurrentUnpackingBits->getNextBit();1069 bool HasTemplateInfo = CurrentUnpackingBits->getNextBit();1070 unsigned NumTemplateArgs = Record.readInt();1071 1072 E->Base = Record.readSubExpr();1073 E->MemberDecl = Record.readDeclAs<ValueDecl>();1074 E->MemberDNLoc = Record.readDeclarationNameLoc(E->MemberDecl->getDeclName());1075 E->MemberLoc = Record.readSourceLocation();1076 E->MemberExprBits.IsArrow = CurrentUnpackingBits->getNextBit();1077 E->MemberExprBits.HasQualifier = HasQualifier;1078 E->MemberExprBits.HasFoundDecl = HasFoundDecl;1079 E->MemberExprBits.HasTemplateKWAndArgsInfo = HasTemplateInfo;1080 E->MemberExprBits.HadMultipleCandidates = CurrentUnpackingBits->getNextBit();1081 E->MemberExprBits.NonOdrUseReason =1082 CurrentUnpackingBits->getNextBits(/*Width=*/2);1083 E->MemberExprBits.OperatorLoc = Record.readSourceLocation();1084 1085 if (HasQualifier)1086 new (E->getTrailingObjects<NestedNameSpecifierLoc>())1087 NestedNameSpecifierLoc(Record.readNestedNameSpecifierLoc());1088 1089 if (HasFoundDecl) {1090 auto *FoundD = Record.readDeclAs<NamedDecl>();1091 auto AS = (AccessSpecifier)CurrentUnpackingBits->getNextBits(/*Width=*/2);1092 *E->getTrailingObjects<DeclAccessPair>() = DeclAccessPair::make(FoundD, AS);1093 }1094 1095 if (HasTemplateInfo)1096 ReadTemplateKWAndArgsInfo(1097 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),1098 E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs);1099}1100 1101void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {1102 VisitExpr(E);1103 E->setBase(Record.readSubExpr());1104 E->setIsaMemberLoc(readSourceLocation());1105 E->setOpLoc(readSourceLocation());1106 E->setArrow(Record.readInt());1107}1108 1109void ASTStmtReader::1110VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {1111 VisitExpr(E);1112 E->Operand = Record.readSubExpr();1113 E->setShouldCopy(Record.readInt());1114}1115 1116void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {1117 VisitExplicitCastExpr(E);1118 E->LParenLoc = readSourceLocation();1119 E->BridgeKeywordLoc = readSourceLocation();1120 E->Kind = Record.readInt();1121}1122 1123void ASTStmtReader::VisitCastExpr(CastExpr *E) {1124 VisitExpr(E);1125 unsigned NumBaseSpecs = Record.readInt();1126 assert(NumBaseSpecs == E->path_size());1127 1128 CurrentUnpackingBits.emplace(Record.readInt());1129 E->setCastKind((CastKind)CurrentUnpackingBits->getNextBits(/*Width=*/7));1130 unsigned HasFPFeatures = CurrentUnpackingBits->getNextBit();1131 assert(E->hasStoredFPFeatures() == HasFPFeatures);1132 1133 E->setSubExpr(Record.readSubExpr());1134 1135 CastExpr::path_iterator BaseI = E->path_begin();1136 while (NumBaseSpecs--) {1137 auto *BaseSpec = new (Record.getContext()) CXXBaseSpecifier;1138 *BaseSpec = Record.readCXXBaseSpecifier();1139 *BaseI++ = BaseSpec;1140 }1141 if (HasFPFeatures)1142 *E->getTrailingFPFeatures() =1143 FPOptionsOverride::getFromOpaqueInt(Record.readInt());1144}1145 1146void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {1147 VisitExpr(E);1148 CurrentUnpackingBits.emplace(Record.readInt());1149 E->setOpcode(1150 (BinaryOperator::Opcode)CurrentUnpackingBits->getNextBits(/*Width=*/6));1151 bool hasFP_Features = CurrentUnpackingBits->getNextBit();1152 E->setHasStoredFPFeatures(hasFP_Features);1153 E->setExcludedOverflowPattern(CurrentUnpackingBits->getNextBit());1154 E->setLHS(Record.readSubExpr());1155 E->setRHS(Record.readSubExpr());1156 E->setOperatorLoc(readSourceLocation());1157 if (hasFP_Features)1158 E->setStoredFPFeatures(1159 FPOptionsOverride::getFromOpaqueInt(Record.readInt()));1160}1161 1162void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {1163 VisitBinaryOperator(E);1164 E->setComputationLHSType(Record.readType());1165 E->setComputationResultType(Record.readType());1166}1167 1168void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {1169 VisitExpr(E);1170 E->SubExprs[ConditionalOperator::COND] = Record.readSubExpr();1171 E->SubExprs[ConditionalOperator::LHS] = Record.readSubExpr();1172 E->SubExprs[ConditionalOperator::RHS] = Record.readSubExpr();1173 E->QuestionLoc = readSourceLocation();1174 E->ColonLoc = readSourceLocation();1175}1176 1177void1178ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {1179 VisitExpr(E);1180 E->OpaqueValue = cast<OpaqueValueExpr>(Record.readSubExpr());1181 E->SubExprs[BinaryConditionalOperator::COMMON] = Record.readSubExpr();1182 E->SubExprs[BinaryConditionalOperator::COND] = Record.readSubExpr();1183 E->SubExprs[BinaryConditionalOperator::LHS] = Record.readSubExpr();1184 E->SubExprs[BinaryConditionalOperator::RHS] = Record.readSubExpr();1185 E->QuestionLoc = readSourceLocation();1186 E->ColonLoc = readSourceLocation();1187}1188 1189void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {1190 VisitCastExpr(E);1191 E->setIsPartOfExplicitCast(CurrentUnpackingBits->getNextBit());1192}1193 1194void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {1195 VisitCastExpr(E);1196 E->setTypeInfoAsWritten(readTypeSourceInfo());1197}1198 1199void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {1200 VisitExplicitCastExpr(E);1201 E->setLParenLoc(readSourceLocation());1202 E->setRParenLoc(readSourceLocation());1203}1204 1205void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {1206 VisitExpr(E);1207 E->setLParenLoc(readSourceLocation());1208 E->setTypeSourceInfo(readTypeSourceInfo());1209 E->setInitializer(Record.readSubExpr());1210 E->setFileScope(Record.readInt());1211}1212 1213void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {1214 VisitExpr(E);1215 E->setBase(Record.readSubExpr());1216 E->setAccessor(Record.readIdentifier());1217 E->setAccessorLoc(readSourceLocation());1218}1219 1220void ASTStmtReader::VisitInitListExpr(InitListExpr *E) {1221 VisitExpr(E);1222 if (auto *SyntForm = cast_or_null<InitListExpr>(Record.readSubStmt()))1223 E->setSyntacticForm(SyntForm);1224 E->setLBraceLoc(readSourceLocation());1225 E->setRBraceLoc(readSourceLocation());1226 bool isArrayFiller = Record.readInt();1227 Expr *filler = nullptr;1228 if (isArrayFiller) {1229 filler = Record.readSubExpr();1230 E->ArrayFillerOrUnionFieldInit = filler;1231 } else1232 E->ArrayFillerOrUnionFieldInit = readDeclAs<FieldDecl>();1233 E->sawArrayRangeDesignator(Record.readInt());1234 unsigned NumInits = Record.readInt();1235 E->reserveInits(Record.getContext(), NumInits);1236 if (isArrayFiller) {1237 for (unsigned I = 0; I != NumInits; ++I) {1238 Expr *init = Record.readSubExpr();1239 E->updateInit(Record.getContext(), I, init ? init : filler);1240 }1241 } else {1242 for (unsigned I = 0; I != NumInits; ++I)1243 E->updateInit(Record.getContext(), I, Record.readSubExpr());1244 }1245}1246 1247void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {1248 using Designator = DesignatedInitExpr::Designator;1249 1250 VisitExpr(E);1251 unsigned NumSubExprs = Record.readInt();1252 assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");1253 for (unsigned I = 0; I != NumSubExprs; ++I)1254 E->setSubExpr(I, Record.readSubExpr());1255 E->setEqualOrColonLoc(readSourceLocation());1256 E->setGNUSyntax(Record.readInt());1257 1258 SmallVector<Designator, 4> Designators;1259 while (Record.getIdx() < Record.size()) {1260 switch ((DesignatorTypes)Record.readInt()) {1261 case DESIG_FIELD_DECL: {1262 auto *Field = readDeclAs<FieldDecl>();1263 SourceLocation DotLoc = readSourceLocation();1264 SourceLocation FieldLoc = readSourceLocation();1265 Designators.push_back(Designator::CreateFieldDesignator(1266 Field->getIdentifier(), DotLoc, FieldLoc));1267 Designators.back().setFieldDecl(Field);1268 break;1269 }1270 1271 case DESIG_FIELD_NAME: {1272 const IdentifierInfo *Name = Record.readIdentifier();1273 SourceLocation DotLoc = readSourceLocation();1274 SourceLocation FieldLoc = readSourceLocation();1275 Designators.push_back(Designator::CreateFieldDesignator(Name, DotLoc,1276 FieldLoc));1277 break;1278 }1279 1280 case DESIG_ARRAY: {1281 unsigned Index = Record.readInt();1282 SourceLocation LBracketLoc = readSourceLocation();1283 SourceLocation RBracketLoc = readSourceLocation();1284 Designators.push_back(Designator::CreateArrayDesignator(Index,1285 LBracketLoc,1286 RBracketLoc));1287 break;1288 }1289 1290 case DESIG_ARRAY_RANGE: {1291 unsigned Index = Record.readInt();1292 SourceLocation LBracketLoc = readSourceLocation();1293 SourceLocation EllipsisLoc = readSourceLocation();1294 SourceLocation RBracketLoc = readSourceLocation();1295 Designators.push_back(Designator::CreateArrayRangeDesignator(1296 Index, LBracketLoc, EllipsisLoc, RBracketLoc));1297 break;1298 }1299 }1300 }1301 E->setDesignators(Record.getContext(),1302 Designators.data(), Designators.size());1303}1304 1305void ASTStmtReader::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {1306 VisitExpr(E);1307 E->setBase(Record.readSubExpr());1308 E->setUpdater(Record.readSubExpr());1309}1310 1311void ASTStmtReader::VisitNoInitExpr(NoInitExpr *E) {1312 VisitExpr(E);1313}1314 1315void ASTStmtReader::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {1316 VisitExpr(E);1317 E->SubExprs[0] = Record.readSubExpr();1318 E->SubExprs[1] = Record.readSubExpr();1319}1320 1321void ASTStmtReader::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {1322 VisitExpr(E);1323}1324 1325void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {1326 VisitExpr(E);1327}1328 1329void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {1330 VisitExpr(E);1331 E->setSubExpr(Record.readSubExpr());1332 E->setWrittenTypeInfo(readTypeSourceInfo());1333 E->setBuiltinLoc(readSourceLocation());1334 E->setRParenLoc(readSourceLocation());1335 E->setIsMicrosoftABI(Record.readInt());1336}1337 1338void ASTStmtReader::VisitSourceLocExpr(SourceLocExpr *E) {1339 VisitExpr(E);1340 E->ParentContext = readDeclAs<DeclContext>();1341 E->BuiltinLoc = readSourceLocation();1342 E->RParenLoc = readSourceLocation();1343 E->SourceLocExprBits.Kind = Record.readInt();1344}1345 1346void ASTStmtReader::VisitEmbedExpr(EmbedExpr *E) {1347 VisitExpr(E);1348 E->EmbedKeywordLoc = readSourceLocation();1349 EmbedDataStorage *Data = new (Record.getContext()) EmbedDataStorage;1350 Data->BinaryData = cast<StringLiteral>(Record.readSubStmt());1351 E->Data = Data;1352 E->Begin = Record.readInt();1353 E->NumOfElements = Record.readInt();1354}1355 1356void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {1357 VisitExpr(E);1358 E->setAmpAmpLoc(readSourceLocation());1359 E->setLabelLoc(readSourceLocation());1360 E->setLabel(readDeclAs<LabelDecl>());1361}1362 1363void ASTStmtReader::VisitStmtExpr(StmtExpr *E) {1364 VisitExpr(E);1365 E->setLParenLoc(readSourceLocation());1366 E->setRParenLoc(readSourceLocation());1367 E->setSubStmt(cast_or_null<CompoundStmt>(Record.readSubStmt()));1368 E->StmtExprBits.TemplateDepth = Record.readInt();1369}1370 1371void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {1372 VisitExpr(E);1373 E->setCond(Record.readSubExpr());1374 E->setLHS(Record.readSubExpr());1375 E->setRHS(Record.readSubExpr());1376 E->setBuiltinLoc(readSourceLocation());1377 E->setRParenLoc(readSourceLocation());1378 E->setIsConditionTrue(Record.readInt());1379}1380 1381void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {1382 VisitExpr(E);1383 E->setTokenLocation(readSourceLocation());1384}1385 1386void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {1387 VisitExpr(E);1388 SmallVector<Expr *, 16> Exprs;1389 unsigned NumExprs = Record.readInt();1390 while (NumExprs--)1391 Exprs.push_back(Record.readSubExpr());1392 E->setExprs(Record.getContext(), Exprs);1393 E->setBuiltinLoc(readSourceLocation());1394 E->setRParenLoc(readSourceLocation());1395}1396 1397void ASTStmtReader::VisitConvertVectorExpr(ConvertVectorExpr *E) {1398 VisitExpr(E);1399 bool HasFPFeatures = CurrentUnpackingBits->getNextBit();1400 assert(HasFPFeatures == E->hasStoredFPFeatures());1401 E->BuiltinLoc = readSourceLocation();1402 E->RParenLoc = readSourceLocation();1403 E->TInfo = readTypeSourceInfo();1404 E->SrcExpr = Record.readSubExpr();1405 if (HasFPFeatures)1406 E->setStoredFPFeatures(1407 FPOptionsOverride::getFromOpaqueInt(Record.readInt()));1408}1409 1410void ASTStmtReader::VisitBlockExpr(BlockExpr *E) {1411 VisitExpr(E);1412 E->setBlockDecl(readDeclAs<BlockDecl>());1413}1414 1415void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) {1416 VisitExpr(E);1417 1418 unsigned NumAssocs = Record.readInt();1419 assert(NumAssocs == E->getNumAssocs() && "Wrong NumAssocs!");1420 E->IsExprPredicate = Record.readInt();1421 E->ResultIndex = Record.readInt();1422 E->GenericSelectionExprBits.GenericLoc = readSourceLocation();1423 E->DefaultLoc = readSourceLocation();1424 E->RParenLoc = readSourceLocation();1425 1426 Stmt **Stmts = E->getTrailingObjects<Stmt *>();1427 // Add 1 to account for the controlling expression which is the first1428 // expression in the trailing array of Stmt *. This is not needed for1429 // the trailing array of TypeSourceInfo *.1430 for (unsigned I = 0, N = NumAssocs + 1; I < N; ++I)1431 Stmts[I] = Record.readSubExpr();1432 1433 TypeSourceInfo **TSIs = E->getTrailingObjects<TypeSourceInfo *>();1434 for (unsigned I = 0, N = NumAssocs; I < N; ++I)1435 TSIs[I] = readTypeSourceInfo();1436}1437 1438void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) {1439 VisitExpr(E);1440 unsigned numSemanticExprs = Record.readInt();1441 assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs);1442 E->PseudoObjectExprBits.ResultIndex = Record.readInt();1443 1444 // Read the syntactic expression.1445 E->getTrailingObjects()[0] = Record.readSubExpr();1446 1447 // Read all the semantic expressions.1448 for (unsigned i = 0; i != numSemanticExprs; ++i) {1449 Expr *subExpr = Record.readSubExpr();1450 E->getTrailingObjects()[i + 1] = subExpr;1451 }1452}1453 1454void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) {1455 VisitExpr(E);1456 E->Op = AtomicExpr::AtomicOp(Record.readInt());1457 E->NumSubExprs = AtomicExpr::getNumSubExprs(E->Op);1458 for (unsigned I = 0; I != E->NumSubExprs; ++I)1459 E->SubExprs[I] = Record.readSubExpr();1460 E->BuiltinLoc = readSourceLocation();1461 E->RParenLoc = readSourceLocation();1462}1463 1464//===----------------------------------------------------------------------===//1465// Objective-C Expressions and Statements1466 1467void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {1468 VisitExpr(E);1469 E->setString(cast<StringLiteral>(Record.readSubStmt()));1470 E->setAtLoc(readSourceLocation());1471}1472 1473void ASTStmtReader::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {1474 VisitExpr(E);1475 // could be one of several IntegerLiteral, FloatLiteral, etc.1476 E->SubExpr = Record.readSubStmt();1477 E->BoxingMethod = readDeclAs<ObjCMethodDecl>();1478 E->Range = readSourceRange();1479}1480 1481void ASTStmtReader::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {1482 VisitExpr(E);1483 unsigned NumElements = Record.readInt();1484 assert(NumElements == E->getNumElements() && "Wrong number of elements");1485 Expr **Elements = E->getElements();1486 for (unsigned I = 0, N = NumElements; I != N; ++I)1487 Elements[I] = Record.readSubExpr();1488 E->ArrayWithObjectsMethod = readDeclAs<ObjCMethodDecl>();1489 E->Range = readSourceRange();1490}1491 1492void ASTStmtReader::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {1493 VisitExpr(E);1494 unsigned NumElements = Record.readInt();1495 assert(NumElements == E->getNumElements() && "Wrong number of elements");1496 bool HasPackExpansions = Record.readInt();1497 assert(HasPackExpansions == E->HasPackExpansions &&"Pack expansion mismatch");1498 auto *KeyValues =1499 E->getTrailingObjects<ObjCDictionaryLiteral::KeyValuePair>();1500 auto *Expansions =1501 E->getTrailingObjects<ObjCDictionaryLiteral::ExpansionData>();1502 for (unsigned I = 0; I != NumElements; ++I) {1503 KeyValues[I].Key = Record.readSubExpr();1504 KeyValues[I].Value = Record.readSubExpr();1505 if (HasPackExpansions) {1506 Expansions[I].EllipsisLoc = readSourceLocation();1507 Expansions[I].NumExpansionsPlusOne = Record.readInt();1508 }1509 }1510 E->DictWithObjectsMethod = readDeclAs<ObjCMethodDecl>();1511 E->Range = readSourceRange();1512}1513 1514void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {1515 VisitExpr(E);1516 E->setEncodedTypeSourceInfo(readTypeSourceInfo());1517 E->setAtLoc(readSourceLocation());1518 E->setRParenLoc(readSourceLocation());1519}1520 1521void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {1522 VisitExpr(E);1523 E->setSelector(Record.readSelector());1524 E->setAtLoc(readSourceLocation());1525 E->setRParenLoc(readSourceLocation());1526}1527 1528void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {1529 VisitExpr(E);1530 E->setProtocol(readDeclAs<ObjCProtocolDecl>());1531 E->setAtLoc(readSourceLocation());1532 E->ProtoLoc = readSourceLocation();1533 E->setRParenLoc(readSourceLocation());1534}1535 1536void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {1537 VisitExpr(E);1538 E->setDecl(readDeclAs<ObjCIvarDecl>());1539 E->setLocation(readSourceLocation());1540 E->setOpLoc(readSourceLocation());1541 E->setBase(Record.readSubExpr());1542 E->setIsArrow(Record.readInt());1543 E->setIsFreeIvar(Record.readInt());1544}1545 1546void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {1547 VisitExpr(E);1548 unsigned MethodRefFlags = Record.readInt();1549 bool Implicit = Record.readInt() != 0;1550 if (Implicit) {1551 auto *Getter = readDeclAs<ObjCMethodDecl>();1552 auto *Setter = readDeclAs<ObjCMethodDecl>();1553 E->setImplicitProperty(Getter, Setter, MethodRefFlags);1554 } else {1555 E->setExplicitProperty(readDeclAs<ObjCPropertyDecl>(), MethodRefFlags);1556 }1557 E->setLocation(readSourceLocation());1558 E->setReceiverLocation(readSourceLocation());1559 switch (Record.readInt()) {1560 case 0:1561 E->setBase(Record.readSubExpr());1562 break;1563 case 1:1564 E->setSuperReceiver(Record.readType());1565 break;1566 case 2:1567 E->setClassReceiver(readDeclAs<ObjCInterfaceDecl>());1568 break;1569 }1570}1571 1572void ASTStmtReader::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {1573 VisitExpr(E);1574 E->setRBracket(readSourceLocation());1575 E->setBaseExpr(Record.readSubExpr());1576 E->setKeyExpr(Record.readSubExpr());1577 E->GetAtIndexMethodDecl = readDeclAs<ObjCMethodDecl>();1578 E->SetAtIndexMethodDecl = readDeclAs<ObjCMethodDecl>();1579}1580 1581void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {1582 VisitExpr(E);1583 assert(Record.peekInt() == E->getNumArgs());1584 Record.skipInts(1);1585 unsigned NumStoredSelLocs = Record.readInt();1586 E->SelLocsKind = Record.readInt();1587 E->setDelegateInitCall(Record.readInt());1588 E->IsImplicit = Record.readInt();1589 auto Kind = static_cast<ObjCMessageExpr::ReceiverKind>(Record.readInt());1590 switch (Kind) {1591 case ObjCMessageExpr::Instance:1592 E->setInstanceReceiver(Record.readSubExpr());1593 break;1594 1595 case ObjCMessageExpr::Class:1596 E->setClassReceiver(readTypeSourceInfo());1597 break;1598 1599 case ObjCMessageExpr::SuperClass:1600 case ObjCMessageExpr::SuperInstance: {1601 QualType T = Record.readType();1602 SourceLocation SuperLoc = readSourceLocation();1603 E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);1604 break;1605 }1606 }1607 1608 assert(Kind == E->getReceiverKind());1609 1610 if (Record.readInt())1611 E->setMethodDecl(readDeclAs<ObjCMethodDecl>());1612 else1613 E->setSelector(Record.readSelector());1614 1615 E->LBracLoc = readSourceLocation();1616 E->RBracLoc = readSourceLocation();1617 1618 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)1619 E->setArg(I, Record.readSubExpr());1620 1621 SourceLocation *Locs = E->getStoredSelLocs();1622 for (unsigned I = 0; I != NumStoredSelLocs; ++I)1623 Locs[I] = readSourceLocation();1624}1625 1626void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {1627 VisitStmt(S);1628 S->setElement(Record.readSubStmt());1629 S->setCollection(Record.readSubExpr());1630 S->setBody(Record.readSubStmt());1631 S->setForLoc(readSourceLocation());1632 S->setRParenLoc(readSourceLocation());1633}1634 1635void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {1636 VisitStmt(S);1637 S->setCatchBody(Record.readSubStmt());1638 S->setCatchParamDecl(readDeclAs<VarDecl>());1639 S->setAtCatchLoc(readSourceLocation());1640 S->setRParenLoc(readSourceLocation());1641}1642 1643void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {1644 VisitStmt(S);1645 S->setFinallyBody(Record.readSubStmt());1646 S->setAtFinallyLoc(readSourceLocation());1647}1648 1649void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {1650 VisitStmt(S); // FIXME: no test coverage.1651 S->setSubStmt(Record.readSubStmt());1652 S->setAtLoc(readSourceLocation());1653}1654 1655void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {1656 VisitStmt(S);1657 assert(Record.peekInt() == S->getNumCatchStmts());1658 Record.skipInts(1);1659 bool HasFinally = Record.readInt();1660 S->setTryBody(Record.readSubStmt());1661 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)1662 S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Record.readSubStmt()));1663 1664 if (HasFinally)1665 S->setFinallyStmt(Record.readSubStmt());1666 S->setAtTryLoc(readSourceLocation());1667}1668 1669void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {1670 VisitStmt(S); // FIXME: no test coverage.1671 S->setSynchExpr(Record.readSubStmt());1672 S->setSynchBody(Record.readSubStmt());1673 S->setAtSynchronizedLoc(readSourceLocation());1674}1675 1676void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {1677 VisitStmt(S); // FIXME: no test coverage.1678 S->setThrowExpr(Record.readSubStmt());1679 S->setThrowLoc(readSourceLocation());1680}1681 1682void ASTStmtReader::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {1683 VisitExpr(E);1684 E->setValue(Record.readInt());1685 E->setLocation(readSourceLocation());1686}1687 1688void ASTStmtReader::VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr *E) {1689 VisitExpr(E);1690 SourceRange R = Record.readSourceRange();1691 E->AtLoc = R.getBegin();1692 E->RParen = R.getEnd();1693 E->VersionToCheck = Record.readVersionTuple();1694}1695 1696//===----------------------------------------------------------------------===//1697// C++ Expressions and Statements1698//===----------------------------------------------------------------------===//1699 1700void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {1701 VisitStmt(S);1702 S->CatchLoc = readSourceLocation();1703 S->ExceptionDecl = readDeclAs<VarDecl>();1704 S->HandlerBlock = Record.readSubStmt();1705}1706 1707void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {1708 VisitStmt(S);1709 assert(Record.peekInt() == S->getNumHandlers() && "NumStmtFields is wrong ?");1710 Record.skipInts(1);1711 S->TryLoc = readSourceLocation();1712 S->getStmts()[0] = Record.readSubStmt();1713 for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)1714 S->getStmts()[i + 1] = Record.readSubStmt();1715}1716 1717void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) {1718 VisitStmt(S);1719 S->ForLoc = readSourceLocation();1720 S->CoawaitLoc = readSourceLocation();1721 S->ColonLoc = readSourceLocation();1722 S->RParenLoc = readSourceLocation();1723 S->setInit(Record.readSubStmt());1724 S->setRangeStmt(Record.readSubStmt());1725 S->setBeginStmt(Record.readSubStmt());1726 S->setEndStmt(Record.readSubStmt());1727 S->setCond(Record.readSubExpr());1728 S->setInc(Record.readSubExpr());1729 S->setLoopVarStmt(Record.readSubStmt());1730 S->setBody(Record.readSubStmt());1731}1732 1733void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {1734 VisitStmt(S);1735 S->KeywordLoc = readSourceLocation();1736 S->IsIfExists = Record.readInt();1737 S->QualifierLoc = Record.readNestedNameSpecifierLoc();1738 S->NameInfo = Record.readDeclarationNameInfo();1739 S->SubStmt = Record.readSubStmt();1740}1741 1742void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {1743 VisitCallExpr(E);1744 E->CXXOperatorCallExprBits.OperatorKind = Record.readInt();1745 E->BeginLoc = Record.readSourceLocation();1746}1747 1748void ASTStmtReader::VisitCXXRewrittenBinaryOperator(1749 CXXRewrittenBinaryOperator *E) {1750 VisitExpr(E);1751 E->CXXRewrittenBinaryOperatorBits.IsReversed = Record.readInt();1752 E->SemanticForm = Record.readSubExpr();1753}1754 1755void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {1756 VisitExpr(E);1757 1758 unsigned NumArgs = Record.readInt();1759 assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!");1760 1761 E->CXXConstructExprBits.Elidable = Record.readInt();1762 E->CXXConstructExprBits.HadMultipleCandidates = Record.readInt();1763 E->CXXConstructExprBits.ListInitialization = Record.readInt();1764 E->CXXConstructExprBits.StdInitListInitialization = Record.readInt();1765 E->CXXConstructExprBits.ZeroInitialization = Record.readInt();1766 E->CXXConstructExprBits.ConstructionKind = Record.readInt();1767 E->CXXConstructExprBits.IsImmediateEscalating = Record.readInt();1768 E->CXXConstructExprBits.Loc = readSourceLocation();1769 E->Constructor = readDeclAs<CXXConstructorDecl>();1770 E->ParenOrBraceRange = readSourceRange();1771 1772 for (unsigned I = 0; I != NumArgs; ++I)1773 E->setArg(I, Record.readSubExpr());1774}1775 1776void ASTStmtReader::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {1777 VisitExpr(E);1778 E->Constructor = readDeclAs<CXXConstructorDecl>();1779 E->Loc = readSourceLocation();1780 E->ConstructsVirtualBase = Record.readInt();1781 E->InheritedFromVirtualBase = Record.readInt();1782}1783 1784void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {1785 VisitCXXConstructExpr(E);1786 E->TSI = readTypeSourceInfo();1787}1788 1789void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) {1790 VisitExpr(E);1791 unsigned NumCaptures = Record.readInt();1792 (void)NumCaptures;1793 assert(NumCaptures == E->LambdaExprBits.NumCaptures);1794 E->IntroducerRange = readSourceRange();1795 E->LambdaExprBits.CaptureDefault = Record.readInt();1796 E->CaptureDefaultLoc = readSourceLocation();1797 E->LambdaExprBits.ExplicitParams = Record.readInt();1798 E->LambdaExprBits.ExplicitResultType = Record.readInt();1799 E->ClosingBrace = readSourceLocation();1800 1801 // Read capture initializers.1802 for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),1803 CEnd = E->capture_init_end();1804 C != CEnd; ++C)1805 *C = Record.readSubExpr();1806 1807 // The body will be lazily deserialized when needed from the call operator1808 // declaration.1809}1810 1811void1812ASTStmtReader::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {1813 VisitExpr(E);1814 E->SubExpr = Record.readSubExpr();1815}1816 1817void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {1818 VisitExplicitCastExpr(E);1819 SourceRange R = readSourceRange();1820 E->Loc = R.getBegin();1821 E->RParenLoc = R.getEnd();1822 if (CurrentUnpackingBits->getNextBit())1823 E->AngleBrackets = readSourceRange();1824}1825 1826void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {1827 return VisitCXXNamedCastExpr(E);1828}1829 1830void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {1831 return VisitCXXNamedCastExpr(E);1832}1833 1834void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {1835 return VisitCXXNamedCastExpr(E);1836}1837 1838void ASTStmtReader::VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {1839 return VisitCXXNamedCastExpr(E);1840}1841 1842void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {1843 return VisitCXXNamedCastExpr(E);1844}1845 1846void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {1847 VisitExplicitCastExpr(E);1848 E->setLParenLoc(readSourceLocation());1849 E->setRParenLoc(readSourceLocation());1850}1851 1852void ASTStmtReader::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *E) {1853 VisitExplicitCastExpr(E);1854 E->KWLoc = readSourceLocation();1855 E->RParenLoc = readSourceLocation();1856}1857 1858void ASTStmtReader::VisitUserDefinedLiteral(UserDefinedLiteral *E) {1859 VisitCallExpr(E);1860 E->UDSuffixLoc = readSourceLocation();1861}1862 1863void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {1864 VisitExpr(E);1865 E->setValue(Record.readInt());1866 E->setLocation(readSourceLocation());1867}1868 1869void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {1870 VisitExpr(E);1871 E->setLocation(readSourceLocation());1872}1873 1874void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {1875 VisitExpr(E);1876 E->setSourceRange(readSourceRange());1877 if (E->isTypeOperand())1878 E->Operand = readTypeSourceInfo();1879 else1880 E->Operand = Record.readSubExpr();1881}1882 1883void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {1884 VisitExpr(E);1885 E->setLocation(readSourceLocation());1886 E->setImplicit(Record.readInt());1887 E->setCapturedByCopyInLambdaWithExplicitObjectParameter(Record.readInt());1888}1889 1890void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {1891 VisitExpr(E);1892 E->CXXThrowExprBits.ThrowLoc = readSourceLocation();1893 E->Operand = Record.readSubExpr();1894 E->CXXThrowExprBits.IsThrownVariableInScope = Record.readInt();1895}1896 1897void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {1898 VisitExpr(E);1899 E->Param = readDeclAs<ParmVarDecl>();1900 E->UsedContext = readDeclAs<DeclContext>();1901 E->CXXDefaultArgExprBits.Loc = readSourceLocation();1902 E->CXXDefaultArgExprBits.HasRewrittenInit = Record.readInt();1903 if (E->CXXDefaultArgExprBits.HasRewrittenInit)1904 *E->getTrailingObjects() = Record.readSubExpr();1905}1906 1907void ASTStmtReader::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {1908 VisitExpr(E);1909 E->CXXDefaultInitExprBits.HasRewrittenInit = Record.readInt();1910 E->Field = readDeclAs<FieldDecl>();1911 E->UsedContext = readDeclAs<DeclContext>();1912 E->CXXDefaultInitExprBits.Loc = readSourceLocation();1913 if (E->CXXDefaultInitExprBits.HasRewrittenInit)1914 *E->getTrailingObjects() = Record.readSubExpr();1915}1916 1917void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {1918 VisitExpr(E);1919 E->setTemporary(Record.readCXXTemporary());1920 E->setSubExpr(Record.readSubExpr());1921}1922 1923void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {1924 VisitExpr(E);1925 E->TypeInfo = readTypeSourceInfo();1926 E->CXXScalarValueInitExprBits.RParenLoc = readSourceLocation();1927}1928 1929void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {1930 VisitExpr(E);1931 1932 bool IsArray = Record.readInt();1933 bool HasInit = Record.readInt();1934 unsigned NumPlacementArgs = Record.readInt();1935 bool IsParenTypeId = Record.readInt();1936 1937 E->CXXNewExprBits.IsGlobalNew = Record.readInt();1938 E->CXXNewExprBits.ShouldPassAlignment = Record.readInt();1939 E->CXXNewExprBits.ShouldPassTypeIdentity = Record.readInt();1940 E->CXXNewExprBits.UsualArrayDeleteWantsSize = Record.readInt();1941 E->CXXNewExprBits.HasInitializer = Record.readInt();1942 E->CXXNewExprBits.StoredInitializationStyle = Record.readInt();1943 1944 assert((IsArray == E->isArray()) && "Wrong IsArray!");1945 assert((HasInit == E->hasInitializer()) && "Wrong HasInit!");1946 assert((NumPlacementArgs == E->getNumPlacementArgs()) &&1947 "Wrong NumPlacementArgs!");1948 assert((IsParenTypeId == E->isParenTypeId()) && "Wrong IsParenTypeId!");1949 (void)IsArray;1950 (void)HasInit;1951 (void)NumPlacementArgs;1952 1953 E->setOperatorNew(readDeclAs<FunctionDecl>());1954 E->setOperatorDelete(readDeclAs<FunctionDecl>());1955 E->AllocatedTypeInfo = readTypeSourceInfo();1956 if (IsParenTypeId)1957 E->getTrailingObjects<SourceRange>()[0] = readSourceRange();1958 E->Range = readSourceRange();1959 E->DirectInitRange = readSourceRange();1960 1961 // Install all the subexpressions.1962 for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),1963 N = E->raw_arg_end();1964 I != N; ++I)1965 *I = Record.readSubStmt();1966}1967 1968void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {1969 VisitExpr(E);1970 E->CXXDeleteExprBits.GlobalDelete = Record.readInt();1971 E->CXXDeleteExprBits.ArrayForm = Record.readInt();1972 E->CXXDeleteExprBits.ArrayFormAsWritten = Record.readInt();1973 E->CXXDeleteExprBits.UsualArrayDeleteWantsSize = Record.readInt();1974 E->OperatorDelete = readDeclAs<FunctionDecl>();1975 E->Argument = Record.readSubExpr();1976 E->CXXDeleteExprBits.Loc = readSourceLocation();1977}1978 1979void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {1980 VisitExpr(E);1981 1982 E->Base = Record.readSubExpr();1983 E->IsArrow = Record.readInt();1984 E->OperatorLoc = readSourceLocation();1985 E->QualifierLoc = Record.readNestedNameSpecifierLoc();1986 E->ScopeType = readTypeSourceInfo();1987 E->ColonColonLoc = readSourceLocation();1988 E->TildeLoc = readSourceLocation();1989 1990 IdentifierInfo *II = Record.readIdentifier();1991 if (II)1992 E->setDestroyedType(II, readSourceLocation());1993 else1994 E->setDestroyedType(readTypeSourceInfo());1995}1996 1997void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) {1998 VisitExpr(E);1999 2000 unsigned NumObjects = Record.readInt();2001 assert(NumObjects == E->getNumObjects());2002 for (unsigned i = 0; i != NumObjects; ++i) {2003 unsigned CleanupKind = Record.readInt();2004 ExprWithCleanups::CleanupObject Obj;2005 if (CleanupKind == COK_Block)2006 Obj = readDeclAs<BlockDecl>();2007 else if (CleanupKind == COK_CompoundLiteral)2008 Obj = cast<CompoundLiteralExpr>(Record.readSubExpr());2009 else2010 llvm_unreachable("unexpected cleanup object type");2011 E->getTrailingObjects()[i] = Obj;2012 }2013 2014 E->ExprWithCleanupsBits.CleanupsHaveSideEffects = Record.readInt();2015 E->SubExpr = Record.readSubExpr();2016}2017 2018void ASTStmtReader::VisitCXXDependentScopeMemberExpr(2019 CXXDependentScopeMemberExpr *E) {2020 VisitExpr(E);2021 2022 unsigned NumTemplateArgs = Record.readInt();2023 CurrentUnpackingBits.emplace(Record.readInt());2024 bool HasTemplateKWAndArgsInfo = CurrentUnpackingBits->getNextBit();2025 bool HasFirstQualifierFoundInScope = CurrentUnpackingBits->getNextBit();2026 2027 assert((HasTemplateKWAndArgsInfo == E->hasTemplateKWAndArgsInfo()) &&2028 "Wrong HasTemplateKWAndArgsInfo!");2029 assert(2030 (HasFirstQualifierFoundInScope == E->hasFirstQualifierFoundInScope()) &&2031 "Wrong HasFirstQualifierFoundInScope!");2032 2033 if (HasTemplateKWAndArgsInfo)2034 ReadTemplateKWAndArgsInfo(2035 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),2036 E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs);2037 2038 assert((NumTemplateArgs == E->getNumTemplateArgs()) &&2039 "Wrong NumTemplateArgs!");2040 2041 E->CXXDependentScopeMemberExprBits.IsArrow =2042 CurrentUnpackingBits->getNextBit();2043 2044 E->BaseType = Record.readType();2045 E->QualifierLoc = Record.readNestedNameSpecifierLoc();2046 // not ImplicitAccess2047 if (CurrentUnpackingBits->getNextBit())2048 E->Base = Record.readSubExpr();2049 else2050 E->Base = nullptr;2051 2052 E->CXXDependentScopeMemberExprBits.OperatorLoc = readSourceLocation();2053 2054 if (HasFirstQualifierFoundInScope)2055 *E->getTrailingObjects<NamedDecl *>() = readDeclAs<NamedDecl>();2056 2057 E->MemberNameInfo = Record.readDeclarationNameInfo();2058}2059 2060void2061ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {2062 VisitExpr(E);2063 2064 if (CurrentUnpackingBits->getNextBit()) // HasTemplateKWAndArgsInfo2065 ReadTemplateKWAndArgsInfo(2066 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),2067 E->getTrailingObjects<TemplateArgumentLoc>(),2068 /*NumTemplateArgs=*/CurrentUnpackingBits->getNextBits(/*Width=*/16));2069 2070 E->QualifierLoc = Record.readNestedNameSpecifierLoc();2071 E->NameInfo = Record.readDeclarationNameInfo();2072}2073 2074void2075ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {2076 VisitExpr(E);2077 assert(Record.peekInt() == E->getNumArgs() &&2078 "Read wrong record during creation ?");2079 Record.skipInts(1);2080 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)2081 E->setArg(I, Record.readSubExpr());2082 E->TypeAndInitForm.setPointer(readTypeSourceInfo());2083 E->setLParenLoc(readSourceLocation());2084 E->setRParenLoc(readSourceLocation());2085 E->TypeAndInitForm.setInt(Record.readInt());2086}2087 2088void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {2089 VisitExpr(E);2090 2091 unsigned NumResults = Record.readInt();2092 CurrentUnpackingBits.emplace(Record.readInt());2093 bool HasTemplateKWAndArgsInfo = CurrentUnpackingBits->getNextBit();2094 assert((E->getNumDecls() == NumResults) && "Wrong NumResults!");2095 assert((E->hasTemplateKWAndArgsInfo() == HasTemplateKWAndArgsInfo) &&2096 "Wrong HasTemplateKWAndArgsInfo!");2097 2098 unsigned NumTemplateArgs = 0;2099 if (HasTemplateKWAndArgsInfo) {2100 NumTemplateArgs = Record.readInt();2101 ReadTemplateKWAndArgsInfo(*E->getTrailingASTTemplateKWAndArgsInfo(),2102 E->getTrailingTemplateArgumentLoc(),2103 NumTemplateArgs);2104 }2105 2106 UnresolvedSet<8> Decls;2107 for (unsigned I = 0; I != NumResults; ++I) {2108 auto *D = readDeclAs<NamedDecl>();2109 auto AS = (AccessSpecifier)Record.readInt();2110 Decls.addDecl(D, AS);2111 }2112 2113 DeclAccessPair *Results = E->getTrailingResults();2114 UnresolvedSetIterator Iter = Decls.begin();2115 for (unsigned I = 0; I != NumResults; ++I) {2116 Results[I] = (Iter + I).getPair();2117 }2118 2119 assert((E->getNumTemplateArgs() == NumTemplateArgs) &&2120 "Wrong NumTemplateArgs!");2121 2122 E->NameInfo = Record.readDeclarationNameInfo();2123 E->QualifierLoc = Record.readNestedNameSpecifierLoc();2124}2125 2126void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {2127 VisitOverloadExpr(E);2128 E->UnresolvedMemberExprBits.IsArrow = CurrentUnpackingBits->getNextBit();2129 E->UnresolvedMemberExprBits.HasUnresolvedUsing =2130 CurrentUnpackingBits->getNextBit();2131 2132 if (/*!isImplicitAccess=*/CurrentUnpackingBits->getNextBit())2133 E->Base = Record.readSubExpr();2134 else2135 E->Base = nullptr;2136 2137 E->OperatorLoc = readSourceLocation();2138 2139 E->BaseType = Record.readType();2140}2141 2142void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {2143 VisitOverloadExpr(E);2144 E->UnresolvedLookupExprBits.RequiresADL = CurrentUnpackingBits->getNextBit();2145 E->NamingClass = readDeclAs<CXXRecordDecl>();2146}2147 2148void ASTStmtReader::VisitTypeTraitExpr(TypeTraitExpr *E) {2149 VisitExpr(E);2150 E->TypeTraitExprBits.IsBooleanTypeTrait = Record.readInt();2151 E->TypeTraitExprBits.NumArgs = Record.readInt();2152 E->TypeTraitExprBits.Kind = Record.readInt();2153 2154 if (E->TypeTraitExprBits.IsBooleanTypeTrait)2155 E->TypeTraitExprBits.Value = Record.readInt();2156 else2157 *E->getTrailingObjects<APValue>() = Record.readAPValue();2158 2159 SourceRange Range = readSourceRange();2160 E->Loc = Range.getBegin();2161 E->RParenLoc = Range.getEnd();2162 2163 auto **Args = E->getTrailingObjects<TypeSourceInfo *>();2164 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)2165 Args[I] = readTypeSourceInfo();2166}2167 2168void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {2169 VisitExpr(E);2170 E->ArrayTypeTraitExprBits.ATT = (ArrayTypeTrait)Record.readInt();2171 E->Value = (unsigned int)Record.readInt();2172 SourceRange Range = readSourceRange();2173 E->Loc = Range.getBegin();2174 E->RParen = Range.getEnd();2175 E->QueriedType = readTypeSourceInfo();2176 E->Dimension = Record.readSubExpr();2177}2178 2179void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {2180 VisitExpr(E);2181 E->ExpressionTraitExprBits.ET = (ExpressionTrait)Record.readInt();2182 E->ExpressionTraitExprBits.Value = (bool)Record.readInt();2183 SourceRange Range = readSourceRange();2184 E->QueriedExpression = Record.readSubExpr();2185 E->Loc = Range.getBegin();2186 E->RParen = Range.getEnd();2187}2188 2189void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {2190 VisitExpr(E);2191 E->CXXNoexceptExprBits.Value = Record.readInt();2192 E->Range = readSourceRange();2193 E->Operand = Record.readSubExpr();2194}2195 2196void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) {2197 VisitExpr(E);2198 E->EllipsisLoc = readSourceLocation();2199 E->NumExpansions = Record.readInt();2200 E->Pattern = Record.readSubExpr();2201}2202 2203void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {2204 VisitExpr(E);2205 unsigned NumPartialArgs = Record.readInt();2206 E->OperatorLoc = readSourceLocation();2207 E->PackLoc = readSourceLocation();2208 E->RParenLoc = readSourceLocation();2209 E->Pack = Record.readDeclAs<NamedDecl>();2210 if (E->isPartiallySubstituted()) {2211 assert(E->Length == NumPartialArgs);2212 for (auto *I = E->getTrailingObjects(), *E = I + NumPartialArgs; I != E;2213 ++I)2214 new (I) TemplateArgument(Record.readTemplateArgument());2215 } else if (!E->isValueDependent()) {2216 E->Length = Record.readInt();2217 }2218}2219 2220void ASTStmtReader::VisitPackIndexingExpr(PackIndexingExpr *E) {2221 VisitExpr(E);2222 E->PackIndexingExprBits.TransformedExpressions = Record.readInt();2223 E->PackIndexingExprBits.FullySubstituted = Record.readInt();2224 E->EllipsisLoc = readSourceLocation();2225 E->RSquareLoc = readSourceLocation();2226 E->SubExprs[0] = Record.readStmt();2227 E->SubExprs[1] = Record.readStmt();2228 auto **Exprs = E->getTrailingObjects();2229 for (unsigned I = 0; I < E->PackIndexingExprBits.TransformedExpressions; ++I)2230 Exprs[I] = Record.readExpr();2231}2232 2233void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr(2234 SubstNonTypeTemplateParmExpr *E) {2235 VisitExpr(E);2236 E->AssociatedDeclAndRef.setPointer(readDeclAs<Decl>());2237 E->AssociatedDeclAndRef.setInt(CurrentUnpackingBits->getNextBit());2238 E->Index = CurrentUnpackingBits->getNextBits(/*Width=*/12);2239 E->PackIndex = Record.readUnsignedOrNone().toInternalRepresentation();2240 E->Final = CurrentUnpackingBits->getNextBit();2241 E->SubstNonTypeTemplateParmExprBits.NameLoc = readSourceLocation();2242 E->Replacement = Record.readSubExpr();2243}2244 2245void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(2246 SubstNonTypeTemplateParmPackExpr *E) {2247 VisitExpr(E);2248 E->AssociatedDecl = readDeclAs<Decl>();2249 E->Final = CurrentUnpackingBits->getNextBit();2250 E->Index = Record.readInt();2251 TemplateArgument ArgPack = Record.readTemplateArgument();2252 if (ArgPack.getKind() != TemplateArgument::Pack)2253 return;2254 2255 E->Arguments = ArgPack.pack_begin();2256 E->NumArguments = ArgPack.pack_size();2257 E->NameLoc = readSourceLocation();2258}2259 2260void ASTStmtReader::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {2261 VisitExpr(E);2262 E->NumParameters = Record.readInt();2263 E->ParamPack = readDeclAs<ValueDecl>();2264 E->NameLoc = readSourceLocation();2265 auto **Parms = E->getTrailingObjects();2266 for (unsigned i = 0, n = E->NumParameters; i != n; ++i)2267 Parms[i] = readDeclAs<ValueDecl>();2268}2269 2270void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {2271 VisitExpr(E);2272 bool HasMaterialzedDecl = Record.readInt();2273 if (HasMaterialzedDecl)2274 E->State = cast<LifetimeExtendedTemporaryDecl>(Record.readDecl());2275 else2276 E->State = Record.readSubExpr();2277}2278 2279void ASTStmtReader::VisitCXXFoldExpr(CXXFoldExpr *E) {2280 VisitExpr(E);2281 E->LParenLoc = readSourceLocation();2282 E->EllipsisLoc = readSourceLocation();2283 E->RParenLoc = readSourceLocation();2284 E->NumExpansions = Record.readUnsignedOrNone();2285 E->SubExprs[0] = Record.readSubExpr();2286 E->SubExprs[1] = Record.readSubExpr();2287 E->SubExprs[2] = Record.readSubExpr();2288 E->CXXFoldExprBits.Opcode = (BinaryOperatorKind)Record.readInt();2289}2290 2291void ASTStmtReader::VisitCXXParenListInitExpr(CXXParenListInitExpr *E) {2292 VisitExpr(E);2293 unsigned ExpectedNumExprs = Record.readInt();2294 assert(E->NumExprs == ExpectedNumExprs &&2295 "expected number of expressions does not equal the actual number of "2296 "serialized expressions.");2297 E->NumUserSpecifiedExprs = Record.readInt();2298 E->InitLoc = readSourceLocation();2299 E->LParenLoc = readSourceLocation();2300 E->RParenLoc = readSourceLocation();2301 for (unsigned I = 0; I < ExpectedNumExprs; I++)2302 E->getTrailingObjects()[I] = Record.readSubExpr();2303 2304 bool HasArrayFillerOrUnionDecl = Record.readBool();2305 if (HasArrayFillerOrUnionDecl) {2306 bool HasArrayFiller = Record.readBool();2307 if (HasArrayFiller) {2308 E->setArrayFiller(Record.readSubExpr());2309 } else {2310 E->setInitializedFieldInUnion(readDeclAs<FieldDecl>());2311 }2312 }2313 E->updateDependence();2314}2315 2316void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {2317 VisitExpr(E);2318 E->SourceExpr = Record.readSubExpr();2319 E->OpaqueValueExprBits.Loc = readSourceLocation();2320 E->setIsUnique(Record.readInt());2321}2322 2323void ASTStmtReader::VisitRecoveryExpr(RecoveryExpr *E) {2324 VisitExpr(E);2325 unsigned NumArgs = Record.readInt();2326 E->BeginLoc = readSourceLocation();2327 E->EndLoc = readSourceLocation();2328 assert((NumArgs + 0LL ==2329 std::distance(E->children().begin(), E->children().end())) &&2330 "Wrong NumArgs!");2331 (void)NumArgs;2332 for (Stmt *&Child : E->children())2333 Child = Record.readSubStmt();2334}2335 2336//===----------------------------------------------------------------------===//2337// Microsoft Expressions and Statements2338//===----------------------------------------------------------------------===//2339void ASTStmtReader::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {2340 VisitExpr(E);2341 E->IsArrow = (Record.readInt() != 0);2342 E->BaseExpr = Record.readSubExpr();2343 E->QualifierLoc = Record.readNestedNameSpecifierLoc();2344 E->MemberLoc = readSourceLocation();2345 E->TheDecl = readDeclAs<MSPropertyDecl>();2346}2347 2348void ASTStmtReader::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) {2349 VisitExpr(E);2350 E->setBase(Record.readSubExpr());2351 E->setIdx(Record.readSubExpr());2352 E->setRBracketLoc(readSourceLocation());2353}2354 2355void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {2356 VisitExpr(E);2357 E->setSourceRange(readSourceRange());2358 E->Guid = readDeclAs<MSGuidDecl>();2359 if (E->isTypeOperand())2360 E->Operand = readTypeSourceInfo();2361 else2362 E->Operand = Record.readSubExpr();2363}2364 2365void ASTStmtReader::VisitSEHLeaveStmt(SEHLeaveStmt *S) {2366 VisitStmt(S);2367 S->setLeaveLoc(readSourceLocation());2368}2369 2370void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) {2371 VisitStmt(S);2372 S->Loc = readSourceLocation();2373 S->Children[SEHExceptStmt::FILTER_EXPR] = Record.readSubStmt();2374 S->Children[SEHExceptStmt::BLOCK] = Record.readSubStmt();2375}2376 2377void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) {2378 VisitStmt(S);2379 S->Loc = readSourceLocation();2380 S->Block = Record.readSubStmt();2381}2382 2383void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) {2384 VisitStmt(S);2385 S->IsCXXTry = Record.readInt();2386 S->TryLoc = readSourceLocation();2387 S->Children[SEHTryStmt::TRY] = Record.readSubStmt();2388 S->Children[SEHTryStmt::HANDLER] = Record.readSubStmt();2389}2390 2391//===----------------------------------------------------------------------===//2392// CUDA Expressions and Statements2393//===----------------------------------------------------------------------===//2394 2395void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {2396 VisitCallExpr(E);2397 E->setPreArg(CUDAKernelCallExpr::CONFIG, Record.readSubExpr());2398}2399 2400//===----------------------------------------------------------------------===//2401// OpenCL Expressions and Statements.2402//===----------------------------------------------------------------------===//2403void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {2404 VisitExpr(E);2405 E->BuiltinLoc = readSourceLocation();2406 E->RParenLoc = readSourceLocation();2407 E->SrcExpr = Record.readSubExpr();2408}2409 2410//===----------------------------------------------------------------------===//2411// OpenMP Directives.2412//===----------------------------------------------------------------------===//2413 2414void ASTStmtReader::VisitOMPCanonicalLoop(OMPCanonicalLoop *S) {2415 VisitStmt(S);2416 for (Stmt *&SubStmt : S->SubStmts)2417 SubStmt = Record.readSubStmt();2418}2419 2420void ASTStmtReader::VisitOMPExecutableDirective(OMPExecutableDirective *E) {2421 Record.readOMPChildren(E->Data);2422 E->setLocStart(readSourceLocation());2423 E->setLocEnd(readSourceLocation());2424}2425 2426void ASTStmtReader::VisitOMPLoopBasedDirective(OMPLoopBasedDirective *D) {2427 VisitStmt(D);2428 // Field CollapsedNum was read in ReadStmtFromStream.2429 Record.skipInts(1);2430 VisitOMPExecutableDirective(D);2431}2432 2433void ASTStmtReader::VisitOMPLoopDirective(OMPLoopDirective *D) {2434 VisitOMPLoopBasedDirective(D);2435}2436 2437void ASTStmtReader::VisitOMPMetaDirective(OMPMetaDirective *D) {2438 VisitStmt(D);2439 // The NumClauses field was read in ReadStmtFromStream.2440 Record.skipInts(1);2441 VisitOMPExecutableDirective(D);2442}2443 2444void ASTStmtReader::VisitOMPParallelDirective(OMPParallelDirective *D) {2445 VisitStmt(D);2446 VisitOMPExecutableDirective(D);2447 D->setHasCancel(Record.readBool());2448}2449 2450void ASTStmtReader::VisitOMPSimdDirective(OMPSimdDirective *D) {2451 VisitOMPLoopDirective(D);2452}2453 2454void ASTStmtReader::VisitOMPCanonicalLoopNestTransformationDirective(2455 OMPCanonicalLoopNestTransformationDirective *D) {2456 VisitOMPLoopBasedDirective(D);2457 D->setNumGeneratedTopLevelLoops(Record.readUInt32());2458}2459 2460void ASTStmtReader::VisitOMPTileDirective(OMPTileDirective *D) {2461 VisitOMPCanonicalLoopNestTransformationDirective(D);2462}2463 2464void ASTStmtReader::VisitOMPStripeDirective(OMPStripeDirective *D) {2465 VisitOMPCanonicalLoopNestTransformationDirective(D);2466}2467 2468void ASTStmtReader::VisitOMPUnrollDirective(OMPUnrollDirective *D) {2469 VisitOMPCanonicalLoopNestTransformationDirective(D);2470}2471 2472void ASTStmtReader::VisitOMPReverseDirective(OMPReverseDirective *D) {2473 VisitOMPCanonicalLoopNestTransformationDirective(D);2474}2475 2476void ASTStmtReader::VisitOMPCanonicalLoopSequenceTransformationDirective(2477 OMPCanonicalLoopSequenceTransformationDirective *D) {2478 VisitStmt(D);2479 VisitOMPExecutableDirective(D);2480 D->setNumGeneratedTopLevelLoops(Record.readUInt32());2481}2482 2483void ASTStmtReader::VisitOMPInterchangeDirective(OMPInterchangeDirective *D) {2484 VisitOMPCanonicalLoopNestTransformationDirective(D);2485}2486 2487void ASTStmtReader::VisitOMPFuseDirective(OMPFuseDirective *D) {2488 VisitOMPCanonicalLoopSequenceTransformationDirective(D);2489}2490 2491void ASTStmtReader::VisitOMPForDirective(OMPForDirective *D) {2492 VisitOMPLoopDirective(D);2493 D->setHasCancel(Record.readBool());2494}2495 2496void ASTStmtReader::VisitOMPForSimdDirective(OMPForSimdDirective *D) {2497 VisitOMPLoopDirective(D);2498}2499 2500void ASTStmtReader::VisitOMPSectionsDirective(OMPSectionsDirective *D) {2501 VisitStmt(D);2502 VisitOMPExecutableDirective(D);2503 D->setHasCancel(Record.readBool());2504}2505 2506void ASTStmtReader::VisitOMPSectionDirective(OMPSectionDirective *D) {2507 VisitStmt(D);2508 VisitOMPExecutableDirective(D);2509 D->setHasCancel(Record.readBool());2510}2511 2512void ASTStmtReader::VisitOMPScopeDirective(OMPScopeDirective *D) {2513 VisitStmt(D);2514 VisitOMPExecutableDirective(D);2515}2516 2517void ASTStmtReader::VisitOMPSingleDirective(OMPSingleDirective *D) {2518 VisitStmt(D);2519 VisitOMPExecutableDirective(D);2520}2521 2522void ASTStmtReader::VisitOMPMasterDirective(OMPMasterDirective *D) {2523 VisitStmt(D);2524 VisitOMPExecutableDirective(D);2525}2526 2527void ASTStmtReader::VisitOMPCriticalDirective(OMPCriticalDirective *D) {2528 VisitStmt(D);2529 VisitOMPExecutableDirective(D);2530 D->DirName = Record.readDeclarationNameInfo();2531}2532 2533void ASTStmtReader::VisitOMPParallelForDirective(OMPParallelForDirective *D) {2534 VisitOMPLoopDirective(D);2535 D->setHasCancel(Record.readBool());2536}2537 2538void ASTStmtReader::VisitOMPParallelForSimdDirective(2539 OMPParallelForSimdDirective *D) {2540 VisitOMPLoopDirective(D);2541}2542 2543void ASTStmtReader::VisitOMPParallelMasterDirective(2544 OMPParallelMasterDirective *D) {2545 VisitStmt(D);2546 VisitOMPExecutableDirective(D);2547}2548 2549void ASTStmtReader::VisitOMPParallelMaskedDirective(2550 OMPParallelMaskedDirective *D) {2551 VisitStmt(D);2552 VisitOMPExecutableDirective(D);2553}2554 2555void ASTStmtReader::VisitOMPParallelSectionsDirective(2556 OMPParallelSectionsDirective *D) {2557 VisitStmt(D);2558 VisitOMPExecutableDirective(D);2559 D->setHasCancel(Record.readBool());2560}2561 2562void ASTStmtReader::VisitOMPTaskDirective(OMPTaskDirective *D) {2563 VisitStmt(D);2564 VisitOMPExecutableDirective(D);2565 D->setHasCancel(Record.readBool());2566}2567 2568void ASTStmtReader::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) {2569 VisitStmt(D);2570 VisitOMPExecutableDirective(D);2571}2572 2573void ASTStmtReader::VisitOMPBarrierDirective(OMPBarrierDirective *D) {2574 VisitStmt(D);2575 VisitOMPExecutableDirective(D);2576}2577 2578void ASTStmtReader::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) {2579 VisitStmt(D);2580 // The NumClauses field was read in ReadStmtFromStream.2581 Record.skipInts(1);2582 VisitOMPExecutableDirective(D);2583}2584 2585void ASTStmtReader::VisitOMPAssumeDirective(OMPAssumeDirective *D) {2586 VisitStmt(D);2587 VisitOMPExecutableDirective(D);2588}2589 2590void ASTStmtReader::VisitOMPErrorDirective(OMPErrorDirective *D) {2591 VisitStmt(D);2592 // The NumClauses field was read in ReadStmtFromStream.2593 Record.skipInts(1);2594 VisitOMPExecutableDirective(D);2595}2596 2597void ASTStmtReader::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) {2598 VisitStmt(D);2599 VisitOMPExecutableDirective(D);2600}2601 2602void ASTStmtReader::VisitOMPFlushDirective(OMPFlushDirective *D) {2603 VisitStmt(D);2604 VisitOMPExecutableDirective(D);2605}2606 2607void ASTStmtReader::VisitOMPDepobjDirective(OMPDepobjDirective *D) {2608 VisitStmt(D);2609 VisitOMPExecutableDirective(D);2610}2611 2612void ASTStmtReader::VisitOMPScanDirective(OMPScanDirective *D) {2613 VisitStmt(D);2614 VisitOMPExecutableDirective(D);2615}2616 2617void ASTStmtReader::VisitOMPOrderedDirective(OMPOrderedDirective *D) {2618 VisitStmt(D);2619 VisitOMPExecutableDirective(D);2620}2621 2622void ASTStmtReader::VisitOMPAtomicDirective(OMPAtomicDirective *D) {2623 VisitStmt(D);2624 VisitOMPExecutableDirective(D);2625 D->Flags.IsXLHSInRHSPart = Record.readBool() ? 1 : 0;2626 D->Flags.IsPostfixUpdate = Record.readBool() ? 1 : 0;2627 D->Flags.IsFailOnly = Record.readBool() ? 1 : 0;2628}2629 2630void ASTStmtReader::VisitOMPTargetDirective(OMPTargetDirective *D) {2631 VisitStmt(D);2632 VisitOMPExecutableDirective(D);2633}2634 2635void ASTStmtReader::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) {2636 VisitStmt(D);2637 VisitOMPExecutableDirective(D);2638}2639 2640void ASTStmtReader::VisitOMPTargetEnterDataDirective(2641 OMPTargetEnterDataDirective *D) {2642 VisitStmt(D);2643 VisitOMPExecutableDirective(D);2644}2645 2646void ASTStmtReader::VisitOMPTargetExitDataDirective(2647 OMPTargetExitDataDirective *D) {2648 VisitStmt(D);2649 VisitOMPExecutableDirective(D);2650}2651 2652void ASTStmtReader::VisitOMPTargetParallelDirective(2653 OMPTargetParallelDirective *D) {2654 VisitStmt(D);2655 VisitOMPExecutableDirective(D);2656 D->setHasCancel(Record.readBool());2657}2658 2659void ASTStmtReader::VisitOMPTargetParallelForDirective(2660 OMPTargetParallelForDirective *D) {2661 VisitOMPLoopDirective(D);2662 D->setHasCancel(Record.readBool());2663}2664 2665void ASTStmtReader::VisitOMPTeamsDirective(OMPTeamsDirective *D) {2666 VisitStmt(D);2667 VisitOMPExecutableDirective(D);2668}2669 2670void ASTStmtReader::VisitOMPCancellationPointDirective(2671 OMPCancellationPointDirective *D) {2672 VisitStmt(D);2673 VisitOMPExecutableDirective(D);2674 D->setCancelRegion(Record.readEnum<OpenMPDirectiveKind>());2675}2676 2677void ASTStmtReader::VisitOMPCancelDirective(OMPCancelDirective *D) {2678 VisitStmt(D);2679 VisitOMPExecutableDirective(D);2680 D->setCancelRegion(Record.readEnum<OpenMPDirectiveKind>());2681}2682 2683void ASTStmtReader::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) {2684 VisitOMPLoopDirective(D);2685 D->setHasCancel(Record.readBool());2686}2687 2688void ASTStmtReader::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) {2689 VisitOMPLoopDirective(D);2690}2691 2692void ASTStmtReader::VisitOMPMasterTaskLoopDirective(2693 OMPMasterTaskLoopDirective *D) {2694 VisitOMPLoopDirective(D);2695 D->setHasCancel(Record.readBool());2696}2697 2698void ASTStmtReader::VisitOMPMaskedTaskLoopDirective(2699 OMPMaskedTaskLoopDirective *D) {2700 VisitOMPLoopDirective(D);2701 D->setHasCancel(Record.readBool());2702}2703 2704void ASTStmtReader::VisitOMPMasterTaskLoopSimdDirective(2705 OMPMasterTaskLoopSimdDirective *D) {2706 VisitOMPLoopDirective(D);2707}2708 2709void ASTStmtReader::VisitOMPMaskedTaskLoopSimdDirective(2710 OMPMaskedTaskLoopSimdDirective *D) {2711 VisitOMPLoopDirective(D);2712}2713 2714void ASTStmtReader::VisitOMPParallelMasterTaskLoopDirective(2715 OMPParallelMasterTaskLoopDirective *D) {2716 VisitOMPLoopDirective(D);2717 D->setHasCancel(Record.readBool());2718}2719 2720void ASTStmtReader::VisitOMPParallelMaskedTaskLoopDirective(2721 OMPParallelMaskedTaskLoopDirective *D) {2722 VisitOMPLoopDirective(D);2723 D->setHasCancel(Record.readBool());2724}2725 2726void ASTStmtReader::VisitOMPParallelMasterTaskLoopSimdDirective(2727 OMPParallelMasterTaskLoopSimdDirective *D) {2728 VisitOMPLoopDirective(D);2729}2730 2731void ASTStmtReader::VisitOMPParallelMaskedTaskLoopSimdDirective(2732 OMPParallelMaskedTaskLoopSimdDirective *D) {2733 VisitOMPLoopDirective(D);2734}2735 2736void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective *D) {2737 VisitOMPLoopDirective(D);2738}2739 2740void ASTStmtReader::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) {2741 VisitStmt(D);2742 VisitOMPExecutableDirective(D);2743}2744 2745void ASTStmtReader::VisitOMPDistributeParallelForDirective(2746 OMPDistributeParallelForDirective *D) {2747 VisitOMPLoopDirective(D);2748 D->setHasCancel(Record.readBool());2749}2750 2751void ASTStmtReader::VisitOMPDistributeParallelForSimdDirective(2752 OMPDistributeParallelForSimdDirective *D) {2753 VisitOMPLoopDirective(D);2754}2755 2756void ASTStmtReader::VisitOMPDistributeSimdDirective(2757 OMPDistributeSimdDirective *D) {2758 VisitOMPLoopDirective(D);2759}2760 2761void ASTStmtReader::VisitOMPTargetParallelForSimdDirective(2762 OMPTargetParallelForSimdDirective *D) {2763 VisitOMPLoopDirective(D);2764}2765 2766void ASTStmtReader::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *D) {2767 VisitOMPLoopDirective(D);2768}2769 2770void ASTStmtReader::VisitOMPTeamsDistributeDirective(2771 OMPTeamsDistributeDirective *D) {2772 VisitOMPLoopDirective(D);2773}2774 2775void ASTStmtReader::VisitOMPTeamsDistributeSimdDirective(2776 OMPTeamsDistributeSimdDirective *D) {2777 VisitOMPLoopDirective(D);2778}2779 2780void ASTStmtReader::VisitOMPTeamsDistributeParallelForSimdDirective(2781 OMPTeamsDistributeParallelForSimdDirective *D) {2782 VisitOMPLoopDirective(D);2783}2784 2785void ASTStmtReader::VisitOMPTeamsDistributeParallelForDirective(2786 OMPTeamsDistributeParallelForDirective *D) {2787 VisitOMPLoopDirective(D);2788 D->setHasCancel(Record.readBool());2789}2790 2791void ASTStmtReader::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *D) {2792 VisitStmt(D);2793 VisitOMPExecutableDirective(D);2794}2795 2796void ASTStmtReader::VisitOMPTargetTeamsDistributeDirective(2797 OMPTargetTeamsDistributeDirective *D) {2798 VisitOMPLoopDirective(D);2799}2800 2801void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForDirective(2802 OMPTargetTeamsDistributeParallelForDirective *D) {2803 VisitOMPLoopDirective(D);2804 D->setHasCancel(Record.readBool());2805}2806 2807void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForSimdDirective(2808 OMPTargetTeamsDistributeParallelForSimdDirective *D) {2809 VisitOMPLoopDirective(D);2810}2811 2812void ASTStmtReader::VisitOMPTargetTeamsDistributeSimdDirective(2813 OMPTargetTeamsDistributeSimdDirective *D) {2814 VisitOMPLoopDirective(D);2815}2816 2817void ASTStmtReader::VisitOMPInteropDirective(OMPInteropDirective *D) {2818 VisitStmt(D);2819 VisitOMPExecutableDirective(D);2820}2821 2822void ASTStmtReader::VisitOMPDispatchDirective(OMPDispatchDirective *D) {2823 VisitStmt(D);2824 VisitOMPExecutableDirective(D);2825 D->setTargetCallLoc(Record.readSourceLocation());2826}2827 2828void ASTStmtReader::VisitOMPMaskedDirective(OMPMaskedDirective *D) {2829 VisitStmt(D);2830 VisitOMPExecutableDirective(D);2831}2832 2833void ASTStmtReader::VisitOMPGenericLoopDirective(OMPGenericLoopDirective *D) {2834 VisitOMPLoopDirective(D);2835}2836 2837void ASTStmtReader::VisitOMPTeamsGenericLoopDirective(2838 OMPTeamsGenericLoopDirective *D) {2839 VisitOMPLoopDirective(D);2840}2841 2842void ASTStmtReader::VisitOMPTargetTeamsGenericLoopDirective(2843 OMPTargetTeamsGenericLoopDirective *D) {2844 VisitOMPLoopDirective(D);2845 D->setCanBeParallelFor(Record.readBool());2846}2847 2848void ASTStmtReader::VisitOMPParallelGenericLoopDirective(2849 OMPParallelGenericLoopDirective *D) {2850 VisitOMPLoopDirective(D);2851}2852 2853void ASTStmtReader::VisitOMPTargetParallelGenericLoopDirective(2854 OMPTargetParallelGenericLoopDirective *D) {2855 VisitOMPLoopDirective(D);2856}2857 2858//===----------------------------------------------------------------------===//2859// OpenACC Constructs/Directives.2860//===----------------------------------------------------------------------===//2861void ASTStmtReader::VisitOpenACCConstructStmt(OpenACCConstructStmt *S) {2862 (void)Record.readInt();2863 S->Kind = Record.readEnum<OpenACCDirectiveKind>();2864 S->Range = Record.readSourceRange();2865 S->DirectiveLoc = Record.readSourceLocation();2866 Record.readOpenACCClauseList(S->Clauses);2867}2868 2869void ASTStmtReader::VisitOpenACCAssociatedStmtConstruct(2870 OpenACCAssociatedStmtConstruct *S) {2871 VisitOpenACCConstructStmt(S);2872 S->setAssociatedStmt(Record.readSubStmt());2873}2874 2875void ASTStmtReader::VisitOpenACCComputeConstruct(OpenACCComputeConstruct *S) {2876 VisitStmt(S);2877 VisitOpenACCAssociatedStmtConstruct(S);2878}2879 2880void ASTStmtReader::VisitOpenACCLoopConstruct(OpenACCLoopConstruct *S) {2881 VisitStmt(S);2882 VisitOpenACCAssociatedStmtConstruct(S);2883 S->ParentComputeConstructKind = Record.readEnum<OpenACCDirectiveKind>();2884}2885 2886void ASTStmtReader::VisitOpenACCCombinedConstruct(OpenACCCombinedConstruct *S) {2887 VisitStmt(S);2888 VisitOpenACCAssociatedStmtConstruct(S);2889}2890 2891void ASTStmtReader::VisitOpenACCDataConstruct(OpenACCDataConstruct *S) {2892 VisitStmt(S);2893 VisitOpenACCAssociatedStmtConstruct(S);2894}2895 2896void ASTStmtReader::VisitOpenACCEnterDataConstruct(2897 OpenACCEnterDataConstruct *S) {2898 VisitStmt(S);2899 VisitOpenACCConstructStmt(S);2900}2901 2902void ASTStmtReader::VisitOpenACCExitDataConstruct(OpenACCExitDataConstruct *S) {2903 VisitStmt(S);2904 VisitOpenACCConstructStmt(S);2905}2906 2907void ASTStmtReader::VisitOpenACCInitConstruct(OpenACCInitConstruct *S) {2908 VisitStmt(S);2909 VisitOpenACCConstructStmt(S);2910}2911 2912void ASTStmtReader::VisitOpenACCShutdownConstruct(OpenACCShutdownConstruct *S) {2913 VisitStmt(S);2914 VisitOpenACCConstructStmt(S);2915}2916 2917void ASTStmtReader::VisitOpenACCSetConstruct(OpenACCSetConstruct *S) {2918 VisitStmt(S);2919 VisitOpenACCConstructStmt(S);2920}2921 2922void ASTStmtReader::VisitOpenACCUpdateConstruct(OpenACCUpdateConstruct *S) {2923 VisitStmt(S);2924 VisitOpenACCConstructStmt(S);2925}2926 2927void ASTStmtReader::VisitOpenACCHostDataConstruct(OpenACCHostDataConstruct *S) {2928 VisitStmt(S);2929 VisitOpenACCAssociatedStmtConstruct(S);2930}2931 2932void ASTStmtReader::VisitOpenACCWaitConstruct(OpenACCWaitConstruct *S) {2933 VisitStmt(S);2934 // Consume the count of Expressions.2935 (void)Record.readInt();2936 VisitOpenACCConstructStmt(S);2937 S->LParenLoc = Record.readSourceLocation();2938 S->RParenLoc = Record.readSourceLocation();2939 S->QueuesLoc = Record.readSourceLocation();2940 2941 for (unsigned I = 0; I < S->NumExprs; ++I) {2942 S->getExprPtr()[I] = cast_if_present<Expr>(Record.readSubStmt());2943 assert((I == 0 || S->getExprPtr()[I] != nullptr) &&2944 "Only first expression should be null");2945 }2946}2947 2948void ASTStmtReader::VisitOpenACCCacheConstruct(OpenACCCacheConstruct *S) {2949 VisitStmt(S);2950 (void)Record.readInt();2951 VisitOpenACCConstructStmt(S);2952 S->ParensLoc = Record.readSourceRange();2953 S->ReadOnlyLoc = Record.readSourceLocation();2954 for (unsigned I = 0; I < S->NumVars; ++I)2955 S->getVarList()[I] = cast<Expr>(Record.readSubStmt());2956}2957 2958void ASTStmtReader::VisitOpenACCAtomicConstruct(OpenACCAtomicConstruct *S) {2959 VisitStmt(S);2960 VisitOpenACCConstructStmt(S);2961 S->AtomicKind = Record.readEnum<OpenACCAtomicKind>();2962 S->setAssociatedStmt(Record.readSubStmt());2963}2964 2965//===----------------------------------------------------------------------===//2966// HLSL Constructs/Directives.2967//===----------------------------------------------------------------------===//2968 2969void ASTStmtReader::VisitHLSLOutArgExpr(HLSLOutArgExpr *S) {2970 VisitExpr(S);2971 S->SubExprs[HLSLOutArgExpr::BaseLValue] = Record.readSubExpr();2972 S->SubExprs[HLSLOutArgExpr::CastedTemporary] = Record.readSubExpr();2973 S->SubExprs[HLSLOutArgExpr::WritebackCast] = Record.readSubExpr();2974 S->IsInOut = Record.readBool();2975}2976 2977//===----------------------------------------------------------------------===//2978// ASTReader Implementation2979//===----------------------------------------------------------------------===//2980 2981Stmt *ASTReader::ReadStmt(ModuleFile &F) {2982 switch (ReadingKind) {2983 case Read_None:2984 llvm_unreachable("should not call this when not reading anything");2985 case Read_Decl:2986 case Read_Type:2987 return ReadStmtFromStream(F);2988 case Read_Stmt:2989 return ReadSubStmt();2990 }2991 2992 llvm_unreachable("ReadingKind not set ?");2993}2994 2995Expr *ASTReader::ReadExpr(ModuleFile &F) {2996 return cast_or_null<Expr>(ReadStmt(F));2997}2998 2999Expr *ASTReader::ReadSubExpr() {3000 return cast_or_null<Expr>(ReadSubStmt());3001}3002 3003// Within the bitstream, expressions are stored in Reverse Polish3004// Notation, with each of the subexpressions preceding the3005// expression they are stored in. Subexpressions are stored from last to first.3006// To evaluate expressions, we continue reading expressions and placing them on3007// the stack, with expressions having operands removing those operands from the3008// stack. Evaluation terminates when we see a STMT_STOP record, and3009// the single remaining expression on the stack is our result.3010Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {3011 ReadingKindTracker ReadingKind(Read_Stmt, *this);3012 llvm::BitstreamCursor &Cursor = F.DeclsCursor;3013 3014 // Map of offset to previously deserialized stmt. The offset points3015 // just after the stmt record.3016 llvm::DenseMap<uint64_t, Stmt *> StmtEntries;3017 3018#ifndef NDEBUG3019 unsigned PrevNumStmts = StmtStack.size();3020#endif3021 3022 ASTRecordReader Record(*this, F);3023 ASTStmtReader Reader(Record, Cursor);3024 Stmt::EmptyShell Empty;3025 3026 while (true) {3027 llvm::Expected<llvm::BitstreamEntry> MaybeEntry =3028 Cursor.advanceSkippingSubblocks();3029 if (!MaybeEntry) {3030 Error(toString(MaybeEntry.takeError()));3031 return nullptr;3032 }3033 llvm::BitstreamEntry Entry = MaybeEntry.get();3034 3035 switch (Entry.Kind) {3036 case llvm::BitstreamEntry::SubBlock: // Handled for us already.3037 case llvm::BitstreamEntry::Error:3038 Error("malformed block record in AST file");3039 return nullptr;3040 case llvm::BitstreamEntry::EndBlock:3041 goto Done;3042 case llvm::BitstreamEntry::Record:3043 // The interesting case.3044 break;3045 }3046 3047 ASTContext &Context = getContext();3048 Stmt *S = nullptr;3049 bool Finished = false;3050 bool IsStmtReference = false;3051 Expected<unsigned> MaybeStmtCode = Record.readRecord(Cursor, Entry.ID);3052 if (!MaybeStmtCode) {3053 Error(toString(MaybeStmtCode.takeError()));3054 return nullptr;3055 }3056 switch ((StmtCode)MaybeStmtCode.get()) {3057 case STMT_STOP:3058 Finished = true;3059 break;3060 3061 case STMT_REF_PTR:3062 IsStmtReference = true;3063 assert(StmtEntries.contains(Record[0]) &&3064 "No stmt was recorded for this offset reference!");3065 S = StmtEntries[Record.readInt()];3066 break;3067 3068 case STMT_NULL_PTR:3069 S = nullptr;3070 break;3071 3072 case STMT_NULL:3073 S = new (Context) NullStmt(Empty);3074 break;3075 3076 case STMT_COMPOUND: {3077 unsigned NumStmts = Record[ASTStmtReader::NumStmtFields];3078 bool HasFPFeatures = Record[ASTStmtReader::NumStmtFields + 1];3079 S = CompoundStmt::CreateEmpty(Context, NumStmts, HasFPFeatures);3080 break;3081 }3082 3083 case STMT_CASE:3084 S = CaseStmt::CreateEmpty(3085 Context,3086 /*CaseStmtIsGNURange*/ Record[ASTStmtReader::NumStmtFields + 3]);3087 break;3088 3089 case STMT_DEFAULT:3090 S = new (Context) DefaultStmt(Empty);3091 break;3092 3093 case STMT_LABEL:3094 S = new (Context) LabelStmt(Empty);3095 break;3096 3097 case STMT_ATTRIBUTED:3098 S = AttributedStmt::CreateEmpty(3099 Context,3100 /*NumAttrs*/Record[ASTStmtReader::NumStmtFields]);3101 break;3102 3103 case STMT_IF: {3104 BitsUnpacker IfStmtBits(Record[ASTStmtReader::NumStmtFields]);3105 bool HasElse = IfStmtBits.getNextBit();3106 bool HasVar = IfStmtBits.getNextBit();3107 bool HasInit = IfStmtBits.getNextBit();3108 S = IfStmt::CreateEmpty(Context, HasElse, HasVar, HasInit);3109 break;3110 }3111 3112 case STMT_SWITCH:3113 S = SwitchStmt::CreateEmpty(3114 Context,3115 /* HasInit=*/Record[ASTStmtReader::NumStmtFields],3116 /* HasVar=*/Record[ASTStmtReader::NumStmtFields + 1]);3117 break;3118 3119 case STMT_WHILE:3120 S = WhileStmt::CreateEmpty(3121 Context,3122 /* HasVar=*/Record[ASTStmtReader::NumStmtFields]);3123 break;3124 3125 case STMT_DO:3126 S = new (Context) DoStmt(Empty);3127 break;3128 3129 case STMT_FOR:3130 S = new (Context) ForStmt(Empty);3131 break;3132 3133 case STMT_GOTO:3134 S = new (Context) GotoStmt(Empty);3135 break;3136 3137 case STMT_INDIRECT_GOTO:3138 S = new (Context) IndirectGotoStmt(Empty);3139 break;3140 3141 case STMT_CONTINUE:3142 S = new (Context) ContinueStmt(Empty);3143 break;3144 3145 case STMT_BREAK:3146 S = new (Context) BreakStmt(Empty);3147 break;3148 3149 case STMT_RETURN:3150 S = ReturnStmt::CreateEmpty(3151 Context, /* HasNRVOCandidate=*/Record[ASTStmtReader::NumStmtFields]);3152 break;3153 3154 case STMT_DECL:3155 S = new (Context) DeclStmt(Empty);3156 break;3157 3158 case STMT_GCCASM:3159 S = new (Context) GCCAsmStmt(Empty);3160 break;3161 3162 case STMT_MSASM:3163 S = new (Context) MSAsmStmt(Empty);3164 break;3165 3166 case STMT_CAPTURED:3167 S = CapturedStmt::CreateDeserialized(3168 Context, Record[ASTStmtReader::NumStmtFields]);3169 break;3170 3171 case STMT_SYCLKERNELCALL:3172 S = new (Context) SYCLKernelCallStmt(Empty);3173 break;3174 3175 case EXPR_CONSTANT:3176 S = ConstantExpr::CreateEmpty(3177 Context, static_cast<ConstantResultStorageKind>(3178 /*StorageKind=*/Record[ASTStmtReader::NumExprFields]));3179 break;3180 3181 case EXPR_SYCL_UNIQUE_STABLE_NAME:3182 S = SYCLUniqueStableNameExpr::CreateEmpty(Context);3183 break;3184 3185 case EXPR_OPENACC_ASTERISK_SIZE:3186 S = OpenACCAsteriskSizeExpr::CreateEmpty(Context);3187 break;3188 3189 case EXPR_PREDEFINED:3190 S = PredefinedExpr::CreateEmpty(3191 Context,3192 /*HasFunctionName*/ Record[ASTStmtReader::NumExprFields]);3193 break;3194 3195 case EXPR_DECL_REF: {3196 BitsUnpacker DeclRefExprBits(Record[ASTStmtReader::NumExprFields]);3197 DeclRefExprBits.advance(5);3198 bool HasFoundDecl = DeclRefExprBits.getNextBit();3199 bool HasQualifier = DeclRefExprBits.getNextBit();3200 bool HasTemplateKWAndArgsInfo = DeclRefExprBits.getNextBit();3201 unsigned NumTemplateArgs = HasTemplateKWAndArgsInfo3202 ? Record[ASTStmtReader::NumExprFields + 1]3203 : 0;3204 S = DeclRefExpr::CreateEmpty(Context, HasQualifier, HasFoundDecl,3205 HasTemplateKWAndArgsInfo, NumTemplateArgs);3206 break;3207 }3208 3209 case EXPR_INTEGER_LITERAL:3210 S = IntegerLiteral::Create(Context, Empty);3211 break;3212 3213 case EXPR_FIXEDPOINT_LITERAL:3214 S = FixedPointLiteral::Create(Context, Empty);3215 break;3216 3217 case EXPR_FLOATING_LITERAL:3218 S = FloatingLiteral::Create(Context, Empty);3219 break;3220 3221 case EXPR_IMAGINARY_LITERAL:3222 S = new (Context) ImaginaryLiteral(Empty);3223 break;3224 3225 case EXPR_STRING_LITERAL:3226 S = StringLiteral::CreateEmpty(3227 Context,3228 /* NumConcatenated=*/Record[ASTStmtReader::NumExprFields],3229 /* Length=*/Record[ASTStmtReader::NumExprFields + 1],3230 /* CharByteWidth=*/Record[ASTStmtReader::NumExprFields + 2]);3231 break;3232 3233 case EXPR_CHARACTER_LITERAL:3234 S = new (Context) CharacterLiteral(Empty);3235 break;3236 3237 case EXPR_PAREN:3238 S = new (Context) ParenExpr(Empty);3239 break;3240 3241 case EXPR_PAREN_LIST:3242 S = ParenListExpr::CreateEmpty(3243 Context,3244 /* NumExprs=*/Record[ASTStmtReader::NumExprFields]);3245 break;3246 3247 case EXPR_UNARY_OPERATOR: {3248 BitsUnpacker UnaryOperatorBits(Record[ASTStmtReader::NumStmtFields]);3249 UnaryOperatorBits.advance(ASTStmtReader::NumExprBits);3250 bool HasFPFeatures = UnaryOperatorBits.getNextBit();3251 S = UnaryOperator::CreateEmpty(Context, HasFPFeatures);3252 break;3253 }3254 3255 case EXPR_OFFSETOF:3256 S = OffsetOfExpr::CreateEmpty(Context,3257 Record[ASTStmtReader::NumExprFields],3258 Record[ASTStmtReader::NumExprFields + 1]);3259 break;3260 3261 case EXPR_SIZEOF_ALIGN_OF:3262 S = new (Context) UnaryExprOrTypeTraitExpr(Empty);3263 break;3264 3265 case EXPR_ARRAY_SUBSCRIPT:3266 S = new (Context) ArraySubscriptExpr(Empty);3267 break;3268 3269 case EXPR_MATRIX_SUBSCRIPT:3270 S = new (Context) MatrixSubscriptExpr(Empty);3271 break;3272 3273 case EXPR_ARRAY_SECTION:3274 S = new (Context) ArraySectionExpr(Empty);3275 break;3276 3277 case EXPR_OMP_ARRAY_SHAPING:3278 S = OMPArrayShapingExpr::CreateEmpty(3279 Context, Record[ASTStmtReader::NumExprFields]);3280 break;3281 3282 case EXPR_OMP_ITERATOR:3283 S = OMPIteratorExpr::CreateEmpty(Context,3284 Record[ASTStmtReader::NumExprFields]);3285 break;3286 3287 case EXPR_CALL: {3288 auto NumArgs = Record[ASTStmtReader::NumExprFields];3289 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);3290 CallExprBits.advance(1);3291 auto HasFPFeatures = CallExprBits.getNextBit();3292 S = CallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures, Empty);3293 break;3294 }3295 3296 case EXPR_RECOVERY:3297 S = RecoveryExpr::CreateEmpty(3298 Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);3299 break;3300 3301 case EXPR_MEMBER: {3302 BitsUnpacker ExprMemberBits(Record[ASTStmtReader::NumExprFields]);3303 bool HasQualifier = ExprMemberBits.getNextBit();3304 bool HasFoundDecl = ExprMemberBits.getNextBit();3305 bool HasTemplateInfo = ExprMemberBits.getNextBit();3306 unsigned NumTemplateArgs = Record[ASTStmtReader::NumExprFields + 1];3307 S = MemberExpr::CreateEmpty(Context, HasQualifier, HasFoundDecl,3308 HasTemplateInfo, NumTemplateArgs);3309 break;3310 }3311 3312 case EXPR_BINARY_OPERATOR: {3313 BitsUnpacker BinaryOperatorBits(Record[ASTStmtReader::NumExprFields]);3314 BinaryOperatorBits.advance(/*Size of opcode*/ 6);3315 bool HasFPFeatures = BinaryOperatorBits.getNextBit();3316 S = BinaryOperator::CreateEmpty(Context, HasFPFeatures);3317 break;3318 }3319 3320 case EXPR_COMPOUND_ASSIGN_OPERATOR: {3321 BitsUnpacker BinaryOperatorBits(Record[ASTStmtReader::NumExprFields]);3322 BinaryOperatorBits.advance(/*Size of opcode*/ 6);3323 bool HasFPFeatures = BinaryOperatorBits.getNextBit();3324 S = CompoundAssignOperator::CreateEmpty(Context, HasFPFeatures);3325 break;3326 }3327 3328 case EXPR_CONDITIONAL_OPERATOR:3329 S = new (Context) ConditionalOperator(Empty);3330 break;3331 3332 case EXPR_BINARY_CONDITIONAL_OPERATOR:3333 S = new (Context) BinaryConditionalOperator(Empty);3334 break;3335 3336 case EXPR_IMPLICIT_CAST: {3337 unsigned PathSize = Record[ASTStmtReader::NumExprFields];3338 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);3339 CastExprBits.advance(7);3340 bool HasFPFeatures = CastExprBits.getNextBit();3341 S = ImplicitCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);3342 break;3343 }3344 3345 case EXPR_CSTYLE_CAST: {3346 unsigned PathSize = Record[ASTStmtReader::NumExprFields];3347 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);3348 CastExprBits.advance(7);3349 bool HasFPFeatures = CastExprBits.getNextBit();3350 S = CStyleCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);3351 break;3352 }3353 3354 case EXPR_COMPOUND_LITERAL:3355 S = new (Context) CompoundLiteralExpr(Empty);3356 break;3357 3358 case EXPR_EXT_VECTOR_ELEMENT:3359 S = new (Context) ExtVectorElementExpr(Empty);3360 break;3361 3362 case EXPR_INIT_LIST:3363 S = new (Context) InitListExpr(Empty);3364 break;3365 3366 case EXPR_DESIGNATED_INIT:3367 S = DesignatedInitExpr::CreateEmpty(Context,3368 Record[ASTStmtReader::NumExprFields] - 1);3369 3370 break;3371 3372 case EXPR_DESIGNATED_INIT_UPDATE:3373 S = new (Context) DesignatedInitUpdateExpr(Empty);3374 break;3375 3376 case EXPR_IMPLICIT_VALUE_INIT:3377 S = new (Context) ImplicitValueInitExpr(Empty);3378 break;3379 3380 case EXPR_NO_INIT:3381 S = new (Context) NoInitExpr(Empty);3382 break;3383 3384 case EXPR_ARRAY_INIT_LOOP:3385 S = new (Context) ArrayInitLoopExpr(Empty);3386 break;3387 3388 case EXPR_ARRAY_INIT_INDEX:3389 S = new (Context) ArrayInitIndexExpr(Empty);3390 break;3391 3392 case EXPR_VA_ARG:3393 S = new (Context) VAArgExpr(Empty);3394 break;3395 3396 case EXPR_SOURCE_LOC:3397 S = new (Context) SourceLocExpr(Empty);3398 break;3399 3400 case EXPR_BUILTIN_PP_EMBED:3401 S = new (Context) EmbedExpr(Empty);3402 break;3403 3404 case EXPR_ADDR_LABEL:3405 S = new (Context) AddrLabelExpr(Empty);3406 break;3407 3408 case EXPR_STMT:3409 S = new (Context) StmtExpr(Empty);3410 break;3411 3412 case EXPR_CHOOSE:3413 S = new (Context) ChooseExpr(Empty);3414 break;3415 3416 case EXPR_GNU_NULL:3417 S = new (Context) GNUNullExpr(Empty);3418 break;3419 3420 case EXPR_SHUFFLE_VECTOR:3421 S = new (Context) ShuffleVectorExpr(Empty);3422 break;3423 3424 case EXPR_CONVERT_VECTOR: {3425 BitsUnpacker ConvertVectorExprBits(Record[ASTStmtReader::NumStmtFields]);3426 ConvertVectorExprBits.advance(ASTStmtReader::NumExprBits);3427 bool HasFPFeatures = ConvertVectorExprBits.getNextBit();3428 S = ConvertVectorExpr::CreateEmpty(Context, HasFPFeatures);3429 break;3430 }3431 3432 case EXPR_BLOCK:3433 S = new (Context) BlockExpr(Empty);3434 break;3435 3436 case EXPR_GENERIC_SELECTION:3437 S = GenericSelectionExpr::CreateEmpty(3438 Context,3439 /*NumAssocs=*/Record[ASTStmtReader::NumExprFields]);3440 break;3441 3442 case EXPR_OBJC_STRING_LITERAL:3443 S = new (Context) ObjCStringLiteral(Empty);3444 break;3445 3446 case EXPR_OBJC_BOXED_EXPRESSION:3447 S = new (Context) ObjCBoxedExpr(Empty);3448 break;3449 3450 case EXPR_OBJC_ARRAY_LITERAL:3451 S = ObjCArrayLiteral::CreateEmpty(Context,3452 Record[ASTStmtReader::NumExprFields]);3453 break;3454 3455 case EXPR_OBJC_DICTIONARY_LITERAL:3456 S = ObjCDictionaryLiteral::CreateEmpty(Context,3457 Record[ASTStmtReader::NumExprFields],3458 Record[ASTStmtReader::NumExprFields + 1]);3459 break;3460 3461 case EXPR_OBJC_ENCODE:3462 S = new (Context) ObjCEncodeExpr(Empty);3463 break;3464 3465 case EXPR_OBJC_SELECTOR_EXPR:3466 S = new (Context) ObjCSelectorExpr(Empty);3467 break;3468 3469 case EXPR_OBJC_PROTOCOL_EXPR:3470 S = new (Context) ObjCProtocolExpr(Empty);3471 break;3472 3473 case EXPR_OBJC_IVAR_REF_EXPR:3474 S = new (Context) ObjCIvarRefExpr(Empty);3475 break;3476 3477 case EXPR_OBJC_PROPERTY_REF_EXPR:3478 S = new (Context) ObjCPropertyRefExpr(Empty);3479 break;3480 3481 case EXPR_OBJC_SUBSCRIPT_REF_EXPR:3482 S = new (Context) ObjCSubscriptRefExpr(Empty);3483 break;3484 3485 case EXPR_OBJC_KVC_REF_EXPR:3486 llvm_unreachable("mismatching AST file");3487 3488 case EXPR_OBJC_MESSAGE_EXPR:3489 S = ObjCMessageExpr::CreateEmpty(Context,3490 Record[ASTStmtReader::NumExprFields],3491 Record[ASTStmtReader::NumExprFields + 1]);3492 break;3493 3494 case EXPR_OBJC_ISA:3495 S = new (Context) ObjCIsaExpr(Empty);3496 break;3497 3498 case EXPR_OBJC_INDIRECT_COPY_RESTORE:3499 S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);3500 break;3501 3502 case EXPR_OBJC_BRIDGED_CAST:3503 S = new (Context) ObjCBridgedCastExpr(Empty);3504 break;3505 3506 case STMT_OBJC_FOR_COLLECTION:3507 S = new (Context) ObjCForCollectionStmt(Empty);3508 break;3509 3510 case STMT_OBJC_CATCH:3511 S = new (Context) ObjCAtCatchStmt(Empty);3512 break;3513 3514 case STMT_OBJC_FINALLY:3515 S = new (Context) ObjCAtFinallyStmt(Empty);3516 break;3517 3518 case STMT_OBJC_AT_TRY:3519 S = ObjCAtTryStmt::CreateEmpty(Context,3520 Record[ASTStmtReader::NumStmtFields],3521 Record[ASTStmtReader::NumStmtFields + 1]);3522 break;3523 3524 case STMT_OBJC_AT_SYNCHRONIZED:3525 S = new (Context) ObjCAtSynchronizedStmt(Empty);3526 break;3527 3528 case STMT_OBJC_AT_THROW:3529 S = new (Context) ObjCAtThrowStmt(Empty);3530 break;3531 3532 case STMT_OBJC_AUTORELEASE_POOL:3533 S = new (Context) ObjCAutoreleasePoolStmt(Empty);3534 break;3535 3536 case EXPR_OBJC_BOOL_LITERAL:3537 S = new (Context) ObjCBoolLiteralExpr(Empty);3538 break;3539 3540 case EXPR_OBJC_AVAILABILITY_CHECK:3541 S = new (Context) ObjCAvailabilityCheckExpr(Empty);3542 break;3543 3544 case STMT_SEH_LEAVE:3545 S = new (Context) SEHLeaveStmt(Empty);3546 break;3547 3548 case STMT_SEH_EXCEPT:3549 S = new (Context) SEHExceptStmt(Empty);3550 break;3551 3552 case STMT_SEH_FINALLY:3553 S = new (Context) SEHFinallyStmt(Empty);3554 break;3555 3556 case STMT_SEH_TRY:3557 S = new (Context) SEHTryStmt(Empty);3558 break;3559 3560 case STMT_CXX_CATCH:3561 S = new (Context) CXXCatchStmt(Empty);3562 break;3563 3564 case STMT_CXX_TRY:3565 S = CXXTryStmt::Create(Context, Empty,3566 /*numHandlers=*/Record[ASTStmtReader::NumStmtFields]);3567 break;3568 3569 case STMT_CXX_FOR_RANGE:3570 S = new (Context) CXXForRangeStmt(Empty);3571 break;3572 3573 case STMT_MS_DEPENDENT_EXISTS:3574 S = new (Context) MSDependentExistsStmt(SourceLocation(), true,3575 NestedNameSpecifierLoc(),3576 DeclarationNameInfo(),3577 nullptr);3578 break;3579 3580 case STMT_OMP_CANONICAL_LOOP:3581 S = OMPCanonicalLoop::createEmpty(Context);3582 break;3583 3584 case STMT_OMP_META_DIRECTIVE:3585 S = OMPMetaDirective::CreateEmpty(3586 Context, Record[ASTStmtReader::NumStmtFields], Empty);3587 break;3588 3589 case STMT_OMP_PARALLEL_DIRECTIVE:3590 S =3591 OMPParallelDirective::CreateEmpty(Context,3592 Record[ASTStmtReader::NumStmtFields],3593 Empty);3594 break;3595 3596 case STMT_OMP_SIMD_DIRECTIVE: {3597 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3598 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3599 S = OMPSimdDirective::CreateEmpty(Context, NumClauses,3600 CollapsedNum, Empty);3601 break;3602 }3603 3604 case STMT_OMP_TILE_DIRECTIVE: {3605 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];3606 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3607 S = OMPTileDirective::CreateEmpty(Context, NumClauses, NumLoops);3608 break;3609 }3610 3611 case STMP_OMP_STRIPE_DIRECTIVE: {3612 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];3613 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3614 S = OMPStripeDirective::CreateEmpty(Context, NumClauses, NumLoops);3615 break;3616 }3617 3618 case STMT_OMP_UNROLL_DIRECTIVE: {3619 assert(Record[ASTStmtReader::NumStmtFields] == 1 && "Unroll directive accepts only a single loop");3620 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3621 S = OMPUnrollDirective::CreateEmpty(Context, NumClauses);3622 break;3623 }3624 3625 case STMT_OMP_REVERSE_DIRECTIVE: {3626 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];3627 assert(Record[ASTStmtReader::NumStmtFields + 1] == 0 &&3628 "Reverse directive has no clauses");3629 S = OMPReverseDirective::CreateEmpty(Context, NumLoops);3630 break;3631 }3632 3633 case STMT_OMP_FUSE_DIRECTIVE: {3634 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];3635 S = OMPFuseDirective::CreateEmpty(Context, NumClauses);3636 break;3637 }3638 3639 case STMT_OMP_INTERCHANGE_DIRECTIVE: {3640 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];3641 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3642 S = OMPInterchangeDirective::CreateEmpty(Context, NumClauses, NumLoops);3643 break;3644 }3645 3646 case STMT_OMP_FOR_DIRECTIVE: {3647 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3648 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3649 S = OMPForDirective::CreateEmpty(Context, NumClauses, CollapsedNum,3650 Empty);3651 break;3652 }3653 3654 case STMT_OMP_FOR_SIMD_DIRECTIVE: {3655 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3656 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3657 S = OMPForSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum,3658 Empty);3659 break;3660 }3661 3662 case STMT_OMP_SECTIONS_DIRECTIVE:3663 S = OMPSectionsDirective::CreateEmpty(3664 Context, Record[ASTStmtReader::NumStmtFields], Empty);3665 break;3666 3667 case STMT_OMP_SECTION_DIRECTIVE:3668 S = OMPSectionDirective::CreateEmpty(Context, Empty);3669 break;3670 3671 case STMT_OMP_SCOPE_DIRECTIVE:3672 S = OMPScopeDirective::CreateEmpty(3673 Context, Record[ASTStmtReader::NumStmtFields], Empty);3674 break;3675 3676 case STMT_OMP_SINGLE_DIRECTIVE:3677 S = OMPSingleDirective::CreateEmpty(3678 Context, Record[ASTStmtReader::NumStmtFields], Empty);3679 break;3680 3681 case STMT_OMP_MASTER_DIRECTIVE:3682 S = OMPMasterDirective::CreateEmpty(Context, Empty);3683 break;3684 3685 case STMT_OMP_CRITICAL_DIRECTIVE:3686 S = OMPCriticalDirective::CreateEmpty(3687 Context, Record[ASTStmtReader::NumStmtFields], Empty);3688 break;3689 3690 case STMT_OMP_PARALLEL_FOR_DIRECTIVE: {3691 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3692 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3693 S = OMPParallelForDirective::CreateEmpty(Context, NumClauses,3694 CollapsedNum, Empty);3695 break;3696 }3697 3698 case STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE: {3699 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3700 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3701 S = OMPParallelForSimdDirective::CreateEmpty(Context, NumClauses,3702 CollapsedNum, Empty);3703 break;3704 }3705 3706 case STMT_OMP_PARALLEL_MASTER_DIRECTIVE:3707 S = OMPParallelMasterDirective::CreateEmpty(3708 Context, Record[ASTStmtReader::NumStmtFields], Empty);3709 break;3710 3711 case STMT_OMP_PARALLEL_MASKED_DIRECTIVE:3712 S = OMPParallelMaskedDirective::CreateEmpty(3713 Context, Record[ASTStmtReader::NumStmtFields], Empty);3714 break;3715 3716 case STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE:3717 S = OMPParallelSectionsDirective::CreateEmpty(3718 Context, Record[ASTStmtReader::NumStmtFields], Empty);3719 break;3720 3721 case STMT_OMP_TASK_DIRECTIVE:3722 S = OMPTaskDirective::CreateEmpty(3723 Context, Record[ASTStmtReader::NumStmtFields], Empty);3724 break;3725 3726 case STMT_OMP_TASKYIELD_DIRECTIVE:3727 S = OMPTaskyieldDirective::CreateEmpty(Context, Empty);3728 break;3729 3730 case STMT_OMP_BARRIER_DIRECTIVE:3731 S = OMPBarrierDirective::CreateEmpty(Context, Empty);3732 break;3733 3734 case STMT_OMP_TASKWAIT_DIRECTIVE:3735 S = OMPTaskwaitDirective::CreateEmpty(3736 Context, Record[ASTStmtReader::NumStmtFields], Empty);3737 break;3738 3739 case STMT_OMP_ERROR_DIRECTIVE:3740 S = OMPErrorDirective::CreateEmpty(3741 Context, Record[ASTStmtReader::NumStmtFields], Empty);3742 break;3743 3744 case STMT_OMP_TASKGROUP_DIRECTIVE:3745 S = OMPTaskgroupDirective::CreateEmpty(3746 Context, Record[ASTStmtReader::NumStmtFields], Empty);3747 break;3748 3749 case STMT_OMP_FLUSH_DIRECTIVE:3750 S = OMPFlushDirective::CreateEmpty(3751 Context, Record[ASTStmtReader::NumStmtFields], Empty);3752 break;3753 3754 case STMT_OMP_DEPOBJ_DIRECTIVE:3755 S = OMPDepobjDirective::CreateEmpty(3756 Context, Record[ASTStmtReader::NumStmtFields], Empty);3757 break;3758 3759 case STMT_OMP_SCAN_DIRECTIVE:3760 S = OMPScanDirective::CreateEmpty(3761 Context, Record[ASTStmtReader::NumStmtFields], Empty);3762 break;3763 3764 case STMT_OMP_ORDERED_DIRECTIVE: {3765 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];3766 bool HasAssociatedStmt = Record[ASTStmtReader::NumStmtFields + 2];3767 S = OMPOrderedDirective::CreateEmpty(Context, NumClauses,3768 !HasAssociatedStmt, Empty);3769 break;3770 }3771 3772 case STMT_OMP_ATOMIC_DIRECTIVE:3773 S = OMPAtomicDirective::CreateEmpty(3774 Context, Record[ASTStmtReader::NumStmtFields], Empty);3775 break;3776 3777 case STMT_OMP_TARGET_DIRECTIVE:3778 S = OMPTargetDirective::CreateEmpty(3779 Context, Record[ASTStmtReader::NumStmtFields], Empty);3780 break;3781 3782 case STMT_OMP_TARGET_DATA_DIRECTIVE:3783 S = OMPTargetDataDirective::CreateEmpty(3784 Context, Record[ASTStmtReader::NumStmtFields], Empty);3785 break;3786 3787 case STMT_OMP_TARGET_ENTER_DATA_DIRECTIVE:3788 S = OMPTargetEnterDataDirective::CreateEmpty(3789 Context, Record[ASTStmtReader::NumStmtFields], Empty);3790 break;3791 3792 case STMT_OMP_TARGET_EXIT_DATA_DIRECTIVE:3793 S = OMPTargetExitDataDirective::CreateEmpty(3794 Context, Record[ASTStmtReader::NumStmtFields], Empty);3795 break;3796 3797 case STMT_OMP_TARGET_PARALLEL_DIRECTIVE:3798 S = OMPTargetParallelDirective::CreateEmpty(3799 Context, Record[ASTStmtReader::NumStmtFields], Empty);3800 break;3801 3802 case STMT_OMP_TARGET_PARALLEL_FOR_DIRECTIVE: {3803 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3804 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3805 S = OMPTargetParallelForDirective::CreateEmpty(Context, NumClauses,3806 CollapsedNum, Empty);3807 break;3808 }3809 3810 case STMT_OMP_TARGET_UPDATE_DIRECTIVE:3811 S = OMPTargetUpdateDirective::CreateEmpty(3812 Context, Record[ASTStmtReader::NumStmtFields], Empty);3813 break;3814 3815 case STMT_OMP_TEAMS_DIRECTIVE:3816 S = OMPTeamsDirective::CreateEmpty(3817 Context, Record[ASTStmtReader::NumStmtFields], Empty);3818 break;3819 3820 case STMT_OMP_CANCELLATION_POINT_DIRECTIVE:3821 S = OMPCancellationPointDirective::CreateEmpty(Context, Empty);3822 break;3823 3824 case STMT_OMP_CANCEL_DIRECTIVE:3825 S = OMPCancelDirective::CreateEmpty(3826 Context, Record[ASTStmtReader::NumStmtFields], Empty);3827 break;3828 3829 case STMT_OMP_TASKLOOP_DIRECTIVE: {3830 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3831 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3832 S = OMPTaskLoopDirective::CreateEmpty(Context, NumClauses, CollapsedNum,3833 Empty);3834 break;3835 }3836 3837 case STMT_OMP_TASKLOOP_SIMD_DIRECTIVE: {3838 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3839 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3840 S = OMPTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,3841 CollapsedNum, Empty);3842 break;3843 }3844 3845 case STMT_OMP_MASTER_TASKLOOP_DIRECTIVE: {3846 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3847 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3848 S = OMPMasterTaskLoopDirective::CreateEmpty(Context, NumClauses,3849 CollapsedNum, Empty);3850 break;3851 }3852 3853 case STMT_OMP_MASKED_TASKLOOP_DIRECTIVE: {3854 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3855 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3856 S = OMPMaskedTaskLoopDirective::CreateEmpty(Context, NumClauses,3857 CollapsedNum, Empty);3858 break;3859 }3860 3861 case STMT_OMP_MASTER_TASKLOOP_SIMD_DIRECTIVE: {3862 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3863 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3864 S = OMPMasterTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,3865 CollapsedNum, Empty);3866 break;3867 }3868 3869 case STMT_OMP_MASKED_TASKLOOP_SIMD_DIRECTIVE: {3870 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3871 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3872 S = OMPMaskedTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,3873 CollapsedNum, Empty);3874 break;3875 }3876 3877 case STMT_OMP_PARALLEL_MASTER_TASKLOOP_DIRECTIVE: {3878 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3879 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3880 S = OMPParallelMasterTaskLoopDirective::CreateEmpty(Context, NumClauses,3881 CollapsedNum, Empty);3882 break;3883 }3884 3885 case STMT_OMP_PARALLEL_MASKED_TASKLOOP_DIRECTIVE: {3886 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3887 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3888 S = OMPParallelMaskedTaskLoopDirective::CreateEmpty(Context, NumClauses,3889 CollapsedNum, Empty);3890 break;3891 }3892 3893 case STMT_OMP_PARALLEL_MASTER_TASKLOOP_SIMD_DIRECTIVE: {3894 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3895 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3896 S = OMPParallelMasterTaskLoopSimdDirective::CreateEmpty(3897 Context, NumClauses, CollapsedNum, Empty);3898 break;3899 }3900 3901 case STMT_OMP_PARALLEL_MASKED_TASKLOOP_SIMD_DIRECTIVE: {3902 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3903 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3904 S = OMPParallelMaskedTaskLoopSimdDirective::CreateEmpty(3905 Context, NumClauses, CollapsedNum, Empty);3906 break;3907 }3908 3909 case STMT_OMP_DISTRIBUTE_DIRECTIVE: {3910 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3911 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3912 S = OMPDistributeDirective::CreateEmpty(Context, NumClauses, CollapsedNum,3913 Empty);3914 break;3915 }3916 3917 case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: {3918 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3919 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3920 S = OMPDistributeParallelForDirective::CreateEmpty(Context, NumClauses,3921 CollapsedNum, Empty);3922 break;3923 }3924 3925 case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: {3926 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3927 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3928 S = OMPDistributeParallelForSimdDirective::CreateEmpty(Context, NumClauses,3929 CollapsedNum,3930 Empty);3931 break;3932 }3933 3934 case STMT_OMP_DISTRIBUTE_SIMD_DIRECTIVE: {3935 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3936 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3937 S = OMPDistributeSimdDirective::CreateEmpty(Context, NumClauses,3938 CollapsedNum, Empty);3939 break;3940 }3941 3942 case STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE: {3943 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3944 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3945 S = OMPTargetParallelForSimdDirective::CreateEmpty(Context, NumClauses,3946 CollapsedNum, Empty);3947 break;3948 }3949 3950 case STMT_OMP_TARGET_SIMD_DIRECTIVE: {3951 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3952 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3953 S = OMPTargetSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum,3954 Empty);3955 break;3956 }3957 3958 case STMT_OMP_TEAMS_DISTRIBUTE_DIRECTIVE: {3959 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3960 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3961 S = OMPTeamsDistributeDirective::CreateEmpty(Context, NumClauses,3962 CollapsedNum, Empty);3963 break;3964 }3965 3966 case STMT_OMP_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE: {3967 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3968 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3969 S = OMPTeamsDistributeSimdDirective::CreateEmpty(Context, NumClauses,3970 CollapsedNum, Empty);3971 break;3972 }3973 3974 case STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: {3975 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3976 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3977 S = OMPTeamsDistributeParallelForSimdDirective::CreateEmpty(3978 Context, NumClauses, CollapsedNum, Empty);3979 break;3980 }3981 3982 case STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: {3983 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3984 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3985 S = OMPTeamsDistributeParallelForDirective::CreateEmpty(3986 Context, NumClauses, CollapsedNum, Empty);3987 break;3988 }3989 3990 case STMT_OMP_TARGET_TEAMS_DIRECTIVE:3991 S = OMPTargetTeamsDirective::CreateEmpty(3992 Context, Record[ASTStmtReader::NumStmtFields], Empty);3993 break;3994 3995 case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_DIRECTIVE: {3996 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3997 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3998 S = OMPTargetTeamsDistributeDirective::CreateEmpty(Context, NumClauses,3999 CollapsedNum, Empty);4000 break;4001 }4002 4003 case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: {4004 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];4005 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];4006 S = OMPTargetTeamsDistributeParallelForDirective::CreateEmpty(4007 Context, NumClauses, CollapsedNum, Empty);4008 break;4009 }4010 4011 case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: {4012 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];4013 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];4014 S = OMPTargetTeamsDistributeParallelForSimdDirective::CreateEmpty(4015 Context, NumClauses, CollapsedNum, Empty);4016 break;4017 }4018 4019 case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE: {4020 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];4021 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];4022 S = OMPTargetTeamsDistributeSimdDirective::CreateEmpty(4023 Context, NumClauses, CollapsedNum, Empty);4024 break;4025 }4026 4027 case STMT_OMP_INTEROP_DIRECTIVE:4028 S = OMPInteropDirective::CreateEmpty(4029 Context, Record[ASTStmtReader::NumStmtFields], Empty);4030 break;4031 4032 case STMT_OMP_DISPATCH_DIRECTIVE:4033 S = OMPDispatchDirective::CreateEmpty(4034 Context, Record[ASTStmtReader::NumStmtFields], Empty);4035 break;4036 4037 case STMT_OMP_MASKED_DIRECTIVE:4038 S = OMPMaskedDirective::CreateEmpty(4039 Context, Record[ASTStmtReader::NumStmtFields], Empty);4040 break;4041 4042 case STMT_OMP_GENERIC_LOOP_DIRECTIVE: {4043 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];4044 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];4045 S = OMPGenericLoopDirective::CreateEmpty(Context, NumClauses,4046 CollapsedNum, Empty);4047 break;4048 }4049 4050 case STMT_OMP_TEAMS_GENERIC_LOOP_DIRECTIVE: {4051 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];4052 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];4053 S = OMPTeamsGenericLoopDirective::CreateEmpty(Context, NumClauses,4054 CollapsedNum, Empty);4055 break;4056 }4057 4058 case STMT_OMP_TARGET_TEAMS_GENERIC_LOOP_DIRECTIVE: {4059 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];4060 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];4061 S = OMPTargetTeamsGenericLoopDirective::CreateEmpty(Context, NumClauses,4062 CollapsedNum, Empty);4063 break;4064 }4065 4066 case STMT_OMP_PARALLEL_GENERIC_LOOP_DIRECTIVE: {4067 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];4068 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];4069 S = OMPParallelGenericLoopDirective::CreateEmpty(Context, NumClauses,4070 CollapsedNum, Empty);4071 break;4072 }4073 4074 case STMT_OMP_TARGET_PARALLEL_GENERIC_LOOP_DIRECTIVE: {4075 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];4076 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];4077 S = OMPTargetParallelGenericLoopDirective::CreateEmpty(4078 Context, NumClauses, CollapsedNum, Empty);4079 break;4080 }4081 4082 case STMT_OMP_ASSUME_DIRECTIVE: {4083 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4084 S = OMPAssumeDirective::CreateEmpty(Context, NumClauses, Empty);4085 break;4086 }4087 4088 case EXPR_CXX_OPERATOR_CALL: {4089 auto NumArgs = Record[ASTStmtReader::NumExprFields];4090 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);4091 CallExprBits.advance(1);4092 auto HasFPFeatures = CallExprBits.getNextBit();4093 S = CXXOperatorCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,4094 Empty);4095 break;4096 }4097 4098 case EXPR_CXX_MEMBER_CALL: {4099 auto NumArgs = Record[ASTStmtReader::NumExprFields];4100 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);4101 CallExprBits.advance(1);4102 auto HasFPFeatures = CallExprBits.getNextBit();4103 S = CXXMemberCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,4104 Empty);4105 break;4106 }4107 4108 case EXPR_CXX_REWRITTEN_BINARY_OPERATOR:4109 S = new (Context) CXXRewrittenBinaryOperator(Empty);4110 break;4111 4112 case EXPR_CXX_CONSTRUCT:4113 S = CXXConstructExpr::CreateEmpty(4114 Context,4115 /* NumArgs=*/Record[ASTStmtReader::NumExprFields]);4116 break;4117 4118 case EXPR_CXX_INHERITED_CTOR_INIT:4119 S = new (Context) CXXInheritedCtorInitExpr(Empty);4120 break;4121 4122 case EXPR_CXX_TEMPORARY_OBJECT:4123 S = CXXTemporaryObjectExpr::CreateEmpty(4124 Context,4125 /* NumArgs=*/Record[ASTStmtReader::NumExprFields]);4126 break;4127 4128 case EXPR_CXX_STATIC_CAST: {4129 unsigned PathSize = Record[ASTStmtReader::NumExprFields];4130 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);4131 CastExprBits.advance(7);4132 bool HasFPFeatures = CastExprBits.getNextBit();4133 S = CXXStaticCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);4134 break;4135 }4136 4137 case EXPR_CXX_DYNAMIC_CAST: {4138 unsigned PathSize = Record[ASTStmtReader::NumExprFields];4139 S = CXXDynamicCastExpr::CreateEmpty(Context, PathSize);4140 break;4141 }4142 4143 case EXPR_CXX_REINTERPRET_CAST: {4144 unsigned PathSize = Record[ASTStmtReader::NumExprFields];4145 S = CXXReinterpretCastExpr::CreateEmpty(Context, PathSize);4146 break;4147 }4148 4149 case EXPR_CXX_CONST_CAST:4150 S = CXXConstCastExpr::CreateEmpty(Context);4151 break;4152 4153 case EXPR_CXX_ADDRSPACE_CAST:4154 S = CXXAddrspaceCastExpr::CreateEmpty(Context);4155 break;4156 4157 case EXPR_CXX_FUNCTIONAL_CAST: {4158 unsigned PathSize = Record[ASTStmtReader::NumExprFields];4159 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);4160 CastExprBits.advance(7);4161 bool HasFPFeatures = CastExprBits.getNextBit();4162 S = CXXFunctionalCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);4163 break;4164 }4165 4166 case EXPR_BUILTIN_BIT_CAST: {4167#ifndef NDEBUG4168 unsigned PathSize = Record[ASTStmtReader::NumExprFields];4169 assert(PathSize == 0 && "Wrong PathSize!");4170#endif4171 S = new (Context) BuiltinBitCastExpr(Empty);4172 break;4173 }4174 4175 case EXPR_USER_DEFINED_LITERAL: {4176 auto NumArgs = Record[ASTStmtReader::NumExprFields];4177 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);4178 CallExprBits.advance(1);4179 auto HasFPFeatures = CallExprBits.getNextBit();4180 S = UserDefinedLiteral::CreateEmpty(Context, NumArgs, HasFPFeatures,4181 Empty);4182 break;4183 }4184 4185 case EXPR_CXX_STD_INITIALIZER_LIST:4186 S = new (Context) CXXStdInitializerListExpr(Empty);4187 break;4188 4189 case EXPR_CXX_BOOL_LITERAL:4190 S = new (Context) CXXBoolLiteralExpr(Empty);4191 break;4192 4193 case EXPR_CXX_NULL_PTR_LITERAL:4194 S = new (Context) CXXNullPtrLiteralExpr(Empty);4195 break;4196 4197 case EXPR_CXX_TYPEID_EXPR:4198 S = new (Context) CXXTypeidExpr(Empty, true);4199 break;4200 4201 case EXPR_CXX_TYPEID_TYPE:4202 S = new (Context) CXXTypeidExpr(Empty, false);4203 break;4204 4205 case EXPR_CXX_UUIDOF_EXPR:4206 S = new (Context) CXXUuidofExpr(Empty, true);4207 break;4208 4209 case EXPR_CXX_PROPERTY_REF_EXPR:4210 S = new (Context) MSPropertyRefExpr(Empty);4211 break;4212 4213 case EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR:4214 S = new (Context) MSPropertySubscriptExpr(Empty);4215 break;4216 4217 case EXPR_CXX_UUIDOF_TYPE:4218 S = new (Context) CXXUuidofExpr(Empty, false);4219 break;4220 4221 case EXPR_CXX_THIS:4222 S = CXXThisExpr::CreateEmpty(Context);4223 break;4224 4225 case EXPR_CXX_THROW:4226 S = new (Context) CXXThrowExpr(Empty);4227 break;4228 4229 case EXPR_CXX_DEFAULT_ARG:4230 S = CXXDefaultArgExpr::CreateEmpty(4231 Context, /*HasRewrittenInit=*/Record[ASTStmtReader::NumExprFields]);4232 break;4233 4234 case EXPR_CXX_DEFAULT_INIT:4235 S = CXXDefaultInitExpr::CreateEmpty(4236 Context, /*HasRewrittenInit=*/Record[ASTStmtReader::NumExprFields]);4237 break;4238 4239 case EXPR_CXX_BIND_TEMPORARY:4240 S = new (Context) CXXBindTemporaryExpr(Empty);4241 break;4242 4243 case EXPR_CXX_SCALAR_VALUE_INIT:4244 S = new (Context) CXXScalarValueInitExpr(Empty);4245 break;4246 4247 case EXPR_CXX_NEW:4248 S = CXXNewExpr::CreateEmpty(4249 Context,4250 /*IsArray=*/Record[ASTStmtReader::NumExprFields],4251 /*HasInit=*/Record[ASTStmtReader::NumExprFields + 1],4252 /*NumPlacementArgs=*/Record[ASTStmtReader::NumExprFields + 2],4253 /*IsParenTypeId=*/Record[ASTStmtReader::NumExprFields + 3]);4254 break;4255 4256 case EXPR_CXX_DELETE:4257 S = new (Context) CXXDeleteExpr(Empty);4258 break;4259 4260 case EXPR_CXX_PSEUDO_DESTRUCTOR:4261 S = new (Context) CXXPseudoDestructorExpr(Empty);4262 break;4263 4264 case EXPR_EXPR_WITH_CLEANUPS:4265 S = ExprWithCleanups::Create(Context, Empty,4266 Record[ASTStmtReader::NumExprFields]);4267 break;4268 4269 case EXPR_CXX_DEPENDENT_SCOPE_MEMBER: {4270 unsigned NumTemplateArgs = Record[ASTStmtReader::NumExprFields];4271 BitsUnpacker DependentScopeMemberBits(4272 Record[ASTStmtReader::NumExprFields + 1]);4273 bool HasTemplateKWAndArgsInfo = DependentScopeMemberBits.getNextBit();4274 4275 bool HasFirstQualifierFoundInScope =4276 DependentScopeMemberBits.getNextBit();4277 S = CXXDependentScopeMemberExpr::CreateEmpty(4278 Context, HasTemplateKWAndArgsInfo, NumTemplateArgs,4279 HasFirstQualifierFoundInScope);4280 break;4281 }4282 4283 case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF: {4284 BitsUnpacker DependentScopeDeclRefBits(4285 Record[ASTStmtReader::NumStmtFields]);4286 DependentScopeDeclRefBits.advance(ASTStmtReader::NumExprBits);4287 bool HasTemplateKWAndArgsInfo = DependentScopeDeclRefBits.getNextBit();4288 unsigned NumTemplateArgs =4289 HasTemplateKWAndArgsInfo4290 ? DependentScopeDeclRefBits.getNextBits(/*Width=*/16)4291 : 0;4292 S = DependentScopeDeclRefExpr::CreateEmpty(4293 Context, HasTemplateKWAndArgsInfo, NumTemplateArgs);4294 break;4295 }4296 4297 case EXPR_CXX_UNRESOLVED_CONSTRUCT:4298 S = CXXUnresolvedConstructExpr::CreateEmpty(Context,4299 /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);4300 break;4301 4302 case EXPR_CXX_UNRESOLVED_MEMBER: {4303 auto NumResults = Record[ASTStmtReader::NumExprFields];4304 BitsUnpacker OverloadExprBits(Record[ASTStmtReader::NumExprFields + 1]);4305 auto HasTemplateKWAndArgsInfo = OverloadExprBits.getNextBit();4306 auto NumTemplateArgs = HasTemplateKWAndArgsInfo4307 ? Record[ASTStmtReader::NumExprFields + 2]4308 : 0;4309 S = UnresolvedMemberExpr::CreateEmpty(4310 Context, NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);4311 break;4312 }4313 4314 case EXPR_CXX_UNRESOLVED_LOOKUP: {4315 auto NumResults = Record[ASTStmtReader::NumExprFields];4316 BitsUnpacker OverloadExprBits(Record[ASTStmtReader::NumExprFields + 1]);4317 auto HasTemplateKWAndArgsInfo = OverloadExprBits.getNextBit();4318 auto NumTemplateArgs = HasTemplateKWAndArgsInfo4319 ? Record[ASTStmtReader::NumExprFields + 2]4320 : 0;4321 S = UnresolvedLookupExpr::CreateEmpty(4322 Context, NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);4323 break;4324 }4325 4326 case EXPR_TYPE_TRAIT:4327 S = TypeTraitExpr::CreateDeserialized(4328 Context, Record[ASTStmtReader::NumExprFields],4329 Record[ASTStmtReader::NumExprFields + 1]);4330 break;4331 4332 case EXPR_ARRAY_TYPE_TRAIT:4333 S = new (Context) ArrayTypeTraitExpr(Empty);4334 break;4335 4336 case EXPR_CXX_EXPRESSION_TRAIT:4337 S = new (Context) ExpressionTraitExpr(Empty);4338 break;4339 4340 case EXPR_CXX_NOEXCEPT:4341 S = new (Context) CXXNoexceptExpr(Empty);4342 break;4343 4344 case EXPR_PACK_EXPANSION:4345 S = new (Context) PackExpansionExpr(Empty);4346 break;4347 4348 case EXPR_SIZEOF_PACK:4349 S = SizeOfPackExpr::CreateDeserialized(4350 Context,4351 /*NumPartialArgs=*/Record[ASTStmtReader::NumExprFields]);4352 break;4353 4354 case EXPR_PACK_INDEXING:4355 S = PackIndexingExpr::CreateDeserialized(4356 Context,4357 /*TransformedExprs=*/Record[ASTStmtReader::NumExprFields]);4358 break;4359 4360 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:4361 S = new (Context) SubstNonTypeTemplateParmExpr(Empty);4362 break;4363 4364 case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:4365 S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);4366 break;4367 4368 case EXPR_FUNCTION_PARM_PACK:4369 S = FunctionParmPackExpr::CreateEmpty(Context,4370 Record[ASTStmtReader::NumExprFields]);4371 break;4372 4373 case EXPR_MATERIALIZE_TEMPORARY:4374 S = new (Context) MaterializeTemporaryExpr(Empty);4375 break;4376 4377 case EXPR_CXX_FOLD:4378 S = new (Context) CXXFoldExpr(Empty);4379 break;4380 4381 case EXPR_CXX_PAREN_LIST_INIT:4382 S = CXXParenListInitExpr::CreateEmpty(4383 Context, /*numExprs=*/Record[ASTStmtReader::NumExprFields], Empty);4384 break;4385 4386 case EXPR_OPAQUE_VALUE:4387 S = new (Context) OpaqueValueExpr(Empty);4388 break;4389 4390 case EXPR_CUDA_KERNEL_CALL: {4391 auto NumArgs = Record[ASTStmtReader::NumExprFields];4392 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);4393 CallExprBits.advance(1);4394 auto HasFPFeatures = CallExprBits.getNextBit();4395 S = CUDAKernelCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,4396 Empty);4397 break;4398 }4399 4400 case EXPR_ASTYPE:4401 S = new (Context) AsTypeExpr(Empty);4402 break;4403 4404 case EXPR_PSEUDO_OBJECT: {4405 unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields];4406 S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs);4407 break;4408 }4409 4410 case EXPR_ATOMIC:4411 S = new (Context) AtomicExpr(Empty);4412 break;4413 4414 case EXPR_LAMBDA: {4415 unsigned NumCaptures = Record[ASTStmtReader::NumExprFields];4416 S = LambdaExpr::CreateDeserialized(Context, NumCaptures);4417 break;4418 }4419 4420 case STMT_COROUTINE_BODY: {4421 unsigned NumParams = Record[ASTStmtReader::NumStmtFields];4422 S = CoroutineBodyStmt::Create(Context, Empty, NumParams);4423 break;4424 }4425 4426 case STMT_CORETURN:4427 S = new (Context) CoreturnStmt(Empty);4428 break;4429 4430 case EXPR_COAWAIT:4431 S = new (Context) CoawaitExpr(Empty);4432 break;4433 4434 case EXPR_COYIELD:4435 S = new (Context) CoyieldExpr(Empty);4436 break;4437 4438 case EXPR_DEPENDENT_COAWAIT:4439 S = new (Context) DependentCoawaitExpr(Empty);4440 break;4441 4442 case EXPR_CONCEPT_SPECIALIZATION: {4443 S = new (Context) ConceptSpecializationExpr(Empty);4444 break;4445 }4446 case STMT_OPENACC_COMPUTE_CONSTRUCT: {4447 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4448 S = OpenACCComputeConstruct::CreateEmpty(Context, NumClauses);4449 break;4450 }4451 case STMT_OPENACC_LOOP_CONSTRUCT: {4452 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4453 S = OpenACCLoopConstruct::CreateEmpty(Context, NumClauses);4454 break;4455 }4456 case STMT_OPENACC_COMBINED_CONSTRUCT: {4457 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4458 S = OpenACCCombinedConstruct::CreateEmpty(Context, NumClauses);4459 break;4460 }4461 case STMT_OPENACC_DATA_CONSTRUCT: {4462 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4463 S = OpenACCDataConstruct::CreateEmpty(Context, NumClauses);4464 break;4465 }4466 case STMT_OPENACC_ENTER_DATA_CONSTRUCT: {4467 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4468 S = OpenACCEnterDataConstruct::CreateEmpty(Context, NumClauses);4469 break;4470 }4471 case STMT_OPENACC_EXIT_DATA_CONSTRUCT: {4472 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4473 S = OpenACCExitDataConstruct::CreateEmpty(Context, NumClauses);4474 break;4475 }4476 case STMT_OPENACC_HOST_DATA_CONSTRUCT: {4477 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4478 S = OpenACCHostDataConstruct::CreateEmpty(Context, NumClauses);4479 break;4480 }4481 case STMT_OPENACC_WAIT_CONSTRUCT: {4482 unsigned NumExprs = Record[ASTStmtReader::NumStmtFields];4483 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];4484 S = OpenACCWaitConstruct::CreateEmpty(Context, NumExprs, NumClauses);4485 break;4486 }4487 case STMT_OPENACC_CACHE_CONSTRUCT: {4488 unsigned NumVars = Record[ASTStmtReader::NumStmtFields];4489 S = OpenACCCacheConstruct::CreateEmpty(Context, NumVars);4490 break;4491 }4492 case STMT_OPENACC_INIT_CONSTRUCT: {4493 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4494 S = OpenACCInitConstruct::CreateEmpty(Context, NumClauses);4495 break;4496 }4497 case STMT_OPENACC_SHUTDOWN_CONSTRUCT: {4498 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4499 S = OpenACCShutdownConstruct::CreateEmpty(Context, NumClauses);4500 break;4501 }4502 case STMT_OPENACC_SET_CONSTRUCT: {4503 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4504 S = OpenACCSetConstruct::CreateEmpty(Context, NumClauses);4505 break;4506 }4507 case STMT_OPENACC_UPDATE_CONSTRUCT: {4508 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4509 S = OpenACCUpdateConstruct::CreateEmpty(Context, NumClauses);4510 break;4511 }4512 case STMT_OPENACC_ATOMIC_CONSTRUCT: {4513 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4514 S = OpenACCAtomicConstruct::CreateEmpty(Context, NumClauses);4515 break;4516 }4517 case EXPR_REQUIRES: {4518 unsigned numLocalParameters = Record[ASTStmtReader::NumExprFields];4519 unsigned numRequirement = Record[ASTStmtReader::NumExprFields + 1];4520 S = RequiresExpr::Create(Context, Empty, numLocalParameters,4521 numRequirement);4522 break;4523 }4524 case EXPR_HLSL_OUT_ARG:4525 S = HLSLOutArgExpr::CreateEmpty(Context);4526 break;4527 }4528 4529 // We hit a STMT_STOP, so we're done with this expression.4530 if (Finished)4531 break;4532 4533 ++NumStatementsRead;4534 4535 if (S && !IsStmtReference) {4536 Reader.Visit(S);4537 StmtEntries[Cursor.GetCurrentBitNo()] = S;4538 }4539 4540 assert(Record.getIdx() == Record.size() &&4541 "Invalid deserialization of statement");4542 StmtStack.push_back(S);4543 }4544Done:4545 assert(StmtStack.size() > PrevNumStmts && "Read too many sub-stmts!");4546 assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");4547 return StmtStack.pop_back_val();4548}4549