Path: blob/main/contrib/llvm-project/clang/lib/Serialization/ASTReaderStmt.cpp
35233 views
//===- ASTReaderStmt.cpp - Stmt/Expr Deserialization ----------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// Statement/expression deserialization. This implements the9// ASTReader::ReadStmt method.10//11//===----------------------------------------------------------------------===//1213#include "clang/AST/ASTConcept.h"14#include "clang/AST/ASTContext.h"15#include "clang/AST/AttrIterator.h"16#include "clang/AST/Decl.h"17#include "clang/AST/DeclAccessPair.h"18#include "clang/AST/DeclCXX.h"19#include "clang/AST/DeclGroup.h"20#include "clang/AST/DeclObjC.h"21#include "clang/AST/DeclTemplate.h"22#include "clang/AST/DeclarationName.h"23#include "clang/AST/DependenceFlags.h"24#include "clang/AST/Expr.h"25#include "clang/AST/ExprCXX.h"26#include "clang/AST/ExprObjC.h"27#include "clang/AST/ExprOpenMP.h"28#include "clang/AST/NestedNameSpecifier.h"29#include "clang/AST/OpenMPClause.h"30#include "clang/AST/OperationKinds.h"31#include "clang/AST/Stmt.h"32#include "clang/AST/StmtCXX.h"33#include "clang/AST/StmtObjC.h"34#include "clang/AST/StmtOpenMP.h"35#include "clang/AST/StmtVisitor.h"36#include "clang/AST/TemplateBase.h"37#include "clang/AST/Type.h"38#include "clang/AST/UnresolvedSet.h"39#include "clang/Basic/CapturedStmt.h"40#include "clang/Basic/ExpressionTraits.h"41#include "clang/Basic/LLVM.h"42#include "clang/Basic/Lambda.h"43#include "clang/Basic/LangOptions.h"44#include "clang/Basic/OpenMPKinds.h"45#include "clang/Basic/OperatorKinds.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/BitmaskEnum.h"53#include "llvm/ADT/DenseMap.h"54#include "llvm/ADT/SmallString.h"55#include "llvm/ADT/SmallVector.h"56#include "llvm/ADT/StringRef.h"57#include "llvm/Bitstream/BitstreamReader.h"58#include "llvm/Support/Casting.h"59#include "llvm/Support/ErrorHandling.h"60#include <algorithm>61#include <cassert>62#include <cstdint>63#include <optional>64#include <string>6566using namespace clang;67using namespace serialization;6869namespace clang {7071class ASTStmtReader : public StmtVisitor<ASTStmtReader> {72ASTRecordReader &Record;73llvm::BitstreamCursor &DeclsCursor;7475std::optional<BitsUnpacker> CurrentUnpackingBits;7677SourceLocation readSourceLocation() {78return Record.readSourceLocation();79}8081SourceRange readSourceRange() {82return Record.readSourceRange();83}8485std::string readString() {86return Record.readString();87}8889TypeSourceInfo *readTypeSourceInfo() {90return Record.readTypeSourceInfo();91}9293Decl *readDecl() {94return Record.readDecl();95}9697template<typename T>98T *readDeclAs() {99return Record.readDeclAs<T>();100}101102public:103ASTStmtReader(ASTRecordReader &Record, llvm::BitstreamCursor &Cursor)104: Record(Record), DeclsCursor(Cursor) {}105106/// The number of record fields required for the Stmt class107/// itself.108static const unsigned NumStmtFields = 0;109110/// The number of record fields required for the Expr class111/// itself.112static const unsigned NumExprFields = NumStmtFields + 2;113114/// The number of bits required for the packing bits for the Expr class.115static const unsigned NumExprBits = 10;116117/// Read and initialize a ExplicitTemplateArgumentList structure.118void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,119TemplateArgumentLoc *ArgsLocArray,120unsigned NumTemplateArgs);121122void VisitStmt(Stmt *S);123#define STMT(Type, Base) \124void Visit##Type(Type *);125#include "clang/AST/StmtNodes.inc"126};127128} // namespace clang129130void ASTStmtReader::ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args,131TemplateArgumentLoc *ArgsLocArray,132unsigned NumTemplateArgs) {133SourceLocation TemplateKWLoc = readSourceLocation();134TemplateArgumentListInfo ArgInfo;135ArgInfo.setLAngleLoc(readSourceLocation());136ArgInfo.setRAngleLoc(readSourceLocation());137for (unsigned i = 0; i != NumTemplateArgs; ++i)138ArgInfo.addArgument(Record.readTemplateArgumentLoc());139Args.initializeFrom(TemplateKWLoc, ArgInfo, ArgsLocArray);140}141142void ASTStmtReader::VisitStmt(Stmt *S) {143assert(Record.getIdx() == NumStmtFields && "Incorrect statement field count");144}145146void ASTStmtReader::VisitNullStmt(NullStmt *S) {147VisitStmt(S);148S->setSemiLoc(readSourceLocation());149S->NullStmtBits.HasLeadingEmptyMacro = Record.readInt();150}151152void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) {153VisitStmt(S);154SmallVector<Stmt *, 16> Stmts;155unsigned NumStmts = Record.readInt();156unsigned HasFPFeatures = Record.readInt();157assert(S->hasStoredFPFeatures() == HasFPFeatures);158while (NumStmts--)159Stmts.push_back(Record.readSubStmt());160S->setStmts(Stmts);161if (HasFPFeatures)162S->setStoredFPFeatures(163FPOptionsOverride::getFromOpaqueInt(Record.readInt()));164S->LBraceLoc = readSourceLocation();165S->RBraceLoc = readSourceLocation();166}167168void ASTStmtReader::VisitSwitchCase(SwitchCase *S) {169VisitStmt(S);170Record.recordSwitchCaseID(S, Record.readInt());171S->setKeywordLoc(readSourceLocation());172S->setColonLoc(readSourceLocation());173}174175void ASTStmtReader::VisitCaseStmt(CaseStmt *S) {176VisitSwitchCase(S);177bool CaseStmtIsGNURange = Record.readInt();178S->setLHS(Record.readSubExpr());179S->setSubStmt(Record.readSubStmt());180if (CaseStmtIsGNURange) {181S->setRHS(Record.readSubExpr());182S->setEllipsisLoc(readSourceLocation());183}184}185186void ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) {187VisitSwitchCase(S);188S->setSubStmt(Record.readSubStmt());189}190191void ASTStmtReader::VisitLabelStmt(LabelStmt *S) {192VisitStmt(S);193bool IsSideEntry = Record.readInt();194auto *LD = readDeclAs<LabelDecl>();195LD->setStmt(S);196S->setDecl(LD);197S->setSubStmt(Record.readSubStmt());198S->setIdentLoc(readSourceLocation());199S->setSideEntry(IsSideEntry);200}201202void ASTStmtReader::VisitAttributedStmt(AttributedStmt *S) {203VisitStmt(S);204// NumAttrs in AttributedStmt is set when creating an empty205// AttributedStmt in AttributedStmt::CreateEmpty, since it is needed206// to allocate the right amount of space for the trailing Attr *.207uint64_t NumAttrs = Record.readInt();208AttrVec Attrs;209Record.readAttributes(Attrs);210(void)NumAttrs;211assert(NumAttrs == S->AttributedStmtBits.NumAttrs);212assert(NumAttrs == Attrs.size());213std::copy(Attrs.begin(), Attrs.end(), S->getAttrArrayPtr());214S->SubStmt = Record.readSubStmt();215S->AttributedStmtBits.AttrLoc = readSourceLocation();216}217218void ASTStmtReader::VisitIfStmt(IfStmt *S) {219VisitStmt(S);220221CurrentUnpackingBits.emplace(Record.readInt());222223bool HasElse = CurrentUnpackingBits->getNextBit();224bool HasVar = CurrentUnpackingBits->getNextBit();225bool HasInit = CurrentUnpackingBits->getNextBit();226227S->setStatementKind(static_cast<IfStatementKind>(Record.readInt()));228S->setCond(Record.readSubExpr());229S->setThen(Record.readSubStmt());230if (HasElse)231S->setElse(Record.readSubStmt());232if (HasVar)233S->setConditionVariableDeclStmt(cast<DeclStmt>(Record.readSubStmt()));234if (HasInit)235S->setInit(Record.readSubStmt());236237S->setIfLoc(readSourceLocation());238S->setLParenLoc(readSourceLocation());239S->setRParenLoc(readSourceLocation());240if (HasElse)241S->setElseLoc(readSourceLocation());242}243244void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) {245VisitStmt(S);246247bool HasInit = Record.readInt();248bool HasVar = Record.readInt();249bool AllEnumCasesCovered = Record.readInt();250if (AllEnumCasesCovered)251S->setAllEnumCasesCovered();252253S->setCond(Record.readSubExpr());254S->setBody(Record.readSubStmt());255if (HasInit)256S->setInit(Record.readSubStmt());257if (HasVar)258S->setConditionVariableDeclStmt(cast<DeclStmt>(Record.readSubStmt()));259260S->setSwitchLoc(readSourceLocation());261S->setLParenLoc(readSourceLocation());262S->setRParenLoc(readSourceLocation());263264SwitchCase *PrevSC = nullptr;265for (auto E = Record.size(); Record.getIdx() != E; ) {266SwitchCase *SC = Record.getSwitchCaseWithID(Record.readInt());267if (PrevSC)268PrevSC->setNextSwitchCase(SC);269else270S->setSwitchCaseList(SC);271272PrevSC = SC;273}274}275276void ASTStmtReader::VisitWhileStmt(WhileStmt *S) {277VisitStmt(S);278279bool HasVar = Record.readInt();280281S->setCond(Record.readSubExpr());282S->setBody(Record.readSubStmt());283if (HasVar)284S->setConditionVariableDeclStmt(cast<DeclStmt>(Record.readSubStmt()));285286S->setWhileLoc(readSourceLocation());287S->setLParenLoc(readSourceLocation());288S->setRParenLoc(readSourceLocation());289}290291void ASTStmtReader::VisitDoStmt(DoStmt *S) {292VisitStmt(S);293S->setCond(Record.readSubExpr());294S->setBody(Record.readSubStmt());295S->setDoLoc(readSourceLocation());296S->setWhileLoc(readSourceLocation());297S->setRParenLoc(readSourceLocation());298}299300void ASTStmtReader::VisitForStmt(ForStmt *S) {301VisitStmt(S);302S->setInit(Record.readSubStmt());303S->setCond(Record.readSubExpr());304S->setConditionVariableDeclStmt(cast_or_null<DeclStmt>(Record.readSubStmt()));305S->setInc(Record.readSubExpr());306S->setBody(Record.readSubStmt());307S->setForLoc(readSourceLocation());308S->setLParenLoc(readSourceLocation());309S->setRParenLoc(readSourceLocation());310}311312void ASTStmtReader::VisitGotoStmt(GotoStmt *S) {313VisitStmt(S);314S->setLabel(readDeclAs<LabelDecl>());315S->setGotoLoc(readSourceLocation());316S->setLabelLoc(readSourceLocation());317}318319void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {320VisitStmt(S);321S->setGotoLoc(readSourceLocation());322S->setStarLoc(readSourceLocation());323S->setTarget(Record.readSubExpr());324}325326void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {327VisitStmt(S);328S->setContinueLoc(readSourceLocation());329}330331void ASTStmtReader::VisitBreakStmt(BreakStmt *S) {332VisitStmt(S);333S->setBreakLoc(readSourceLocation());334}335336void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) {337VisitStmt(S);338339bool HasNRVOCandidate = Record.readInt();340341S->setRetValue(Record.readSubExpr());342if (HasNRVOCandidate)343S->setNRVOCandidate(readDeclAs<VarDecl>());344345S->setReturnLoc(readSourceLocation());346}347348void ASTStmtReader::VisitDeclStmt(DeclStmt *S) {349VisitStmt(S);350S->setStartLoc(readSourceLocation());351S->setEndLoc(readSourceLocation());352353if (Record.size() - Record.getIdx() == 1) {354// Single declaration355S->setDeclGroup(DeclGroupRef(readDecl()));356} else {357SmallVector<Decl *, 16> Decls;358int N = Record.size() - Record.getIdx();359Decls.reserve(N);360for (int I = 0; I < N; ++I)361Decls.push_back(readDecl());362S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Record.getContext(),363Decls.data(),364Decls.size())));365}366}367368void ASTStmtReader::VisitAsmStmt(AsmStmt *S) {369VisitStmt(S);370S->NumOutputs = Record.readInt();371S->NumInputs = Record.readInt();372S->NumClobbers = Record.readInt();373S->setAsmLoc(readSourceLocation());374S->setVolatile(Record.readInt());375S->setSimple(Record.readInt());376}377378void ASTStmtReader::VisitGCCAsmStmt(GCCAsmStmt *S) {379VisitAsmStmt(S);380S->NumLabels = Record.readInt();381S->setRParenLoc(readSourceLocation());382S->setAsmString(cast_or_null<StringLiteral>(Record.readSubStmt()));383384unsigned NumOutputs = S->getNumOutputs();385unsigned NumInputs = S->getNumInputs();386unsigned NumClobbers = S->getNumClobbers();387unsigned NumLabels = S->getNumLabels();388389// Outputs and inputs390SmallVector<IdentifierInfo *, 16> Names;391SmallVector<StringLiteral*, 16> Constraints;392SmallVector<Stmt*, 16> Exprs;393for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {394Names.push_back(Record.readIdentifier());395Constraints.push_back(cast_or_null<StringLiteral>(Record.readSubStmt()));396Exprs.push_back(Record.readSubStmt());397}398399// Constraints400SmallVector<StringLiteral*, 16> Clobbers;401for (unsigned I = 0; I != NumClobbers; ++I)402Clobbers.push_back(cast_or_null<StringLiteral>(Record.readSubStmt()));403404// Labels405for (unsigned I = 0, N = NumLabels; I != N; ++I) {406Names.push_back(Record.readIdentifier());407Exprs.push_back(Record.readSubStmt());408}409410S->setOutputsAndInputsAndClobbers(Record.getContext(),411Names.data(), Constraints.data(),412Exprs.data(), NumOutputs, NumInputs,413NumLabels,414Clobbers.data(), NumClobbers);415}416417void ASTStmtReader::VisitMSAsmStmt(MSAsmStmt *S) {418VisitAsmStmt(S);419S->LBraceLoc = readSourceLocation();420S->EndLoc = readSourceLocation();421S->NumAsmToks = Record.readInt();422std::string AsmStr = readString();423424// Read the tokens.425SmallVector<Token, 16> AsmToks;426AsmToks.reserve(S->NumAsmToks);427for (unsigned i = 0, e = S->NumAsmToks; i != e; ++i) {428AsmToks.push_back(Record.readToken());429}430431// The calls to reserve() for the FooData vectors are mandatory to432// prevent dead StringRefs in the Foo vectors.433434// Read the clobbers.435SmallVector<std::string, 16> ClobbersData;436SmallVector<StringRef, 16> Clobbers;437ClobbersData.reserve(S->NumClobbers);438Clobbers.reserve(S->NumClobbers);439for (unsigned i = 0, e = S->NumClobbers; i != e; ++i) {440ClobbersData.push_back(readString());441Clobbers.push_back(ClobbersData.back());442}443444// Read the operands.445unsigned NumOperands = S->NumOutputs + S->NumInputs;446SmallVector<Expr*, 16> Exprs;447SmallVector<std::string, 16> ConstraintsData;448SmallVector<StringRef, 16> Constraints;449Exprs.reserve(NumOperands);450ConstraintsData.reserve(NumOperands);451Constraints.reserve(NumOperands);452for (unsigned i = 0; i != NumOperands; ++i) {453Exprs.push_back(cast<Expr>(Record.readSubStmt()));454ConstraintsData.push_back(readString());455Constraints.push_back(ConstraintsData.back());456}457458S->initialize(Record.getContext(), AsmStr, AsmToks,459Constraints, Exprs, Clobbers);460}461462void ASTStmtReader::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {463VisitStmt(S);464assert(Record.peekInt() == S->NumParams);465Record.skipInts(1);466auto *StoredStmts = S->getStoredStmts();467for (unsigned i = 0;468i < CoroutineBodyStmt::SubStmt::FirstParamMove + S->NumParams; ++i)469StoredStmts[i] = Record.readSubStmt();470}471472void ASTStmtReader::VisitCoreturnStmt(CoreturnStmt *S) {473VisitStmt(S);474S->CoreturnLoc = Record.readSourceLocation();475for (auto &SubStmt: S->SubStmts)476SubStmt = Record.readSubStmt();477S->IsImplicit = Record.readInt() != 0;478}479480void ASTStmtReader::VisitCoawaitExpr(CoawaitExpr *E) {481VisitExpr(E);482E->KeywordLoc = readSourceLocation();483for (auto &SubExpr: E->SubExprs)484SubExpr = Record.readSubStmt();485E->OpaqueValue = cast_or_null<OpaqueValueExpr>(Record.readSubStmt());486E->setIsImplicit(Record.readInt() != 0);487}488489void ASTStmtReader::VisitCoyieldExpr(CoyieldExpr *E) {490VisitExpr(E);491E->KeywordLoc = readSourceLocation();492for (auto &SubExpr: E->SubExprs)493SubExpr = Record.readSubStmt();494E->OpaqueValue = cast_or_null<OpaqueValueExpr>(Record.readSubStmt());495}496497void ASTStmtReader::VisitDependentCoawaitExpr(DependentCoawaitExpr *E) {498VisitExpr(E);499E->KeywordLoc = readSourceLocation();500for (auto &SubExpr: E->SubExprs)501SubExpr = Record.readSubStmt();502}503504void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) {505VisitStmt(S);506Record.skipInts(1);507S->setCapturedDecl(readDeclAs<CapturedDecl>());508S->setCapturedRegionKind(static_cast<CapturedRegionKind>(Record.readInt()));509S->setCapturedRecordDecl(readDeclAs<RecordDecl>());510511// Capture inits512for (CapturedStmt::capture_init_iterator I = S->capture_init_begin(),513E = S->capture_init_end();514I != E; ++I)515*I = Record.readSubExpr();516517// Body518S->setCapturedStmt(Record.readSubStmt());519S->getCapturedDecl()->setBody(S->getCapturedStmt());520521// Captures522for (auto &I : S->captures()) {523I.VarAndKind.setPointer(readDeclAs<VarDecl>());524I.VarAndKind.setInt(525static_cast<CapturedStmt::VariableCaptureKind>(Record.readInt()));526I.Loc = readSourceLocation();527}528}529530void ASTStmtReader::VisitExpr(Expr *E) {531VisitStmt(E);532CurrentUnpackingBits.emplace(Record.readInt());533E->setDependence(static_cast<ExprDependence>(534CurrentUnpackingBits->getNextBits(/*Width=*/5)));535E->setValueKind(static_cast<ExprValueKind>(536CurrentUnpackingBits->getNextBits(/*Width=*/2)));537E->setObjectKind(static_cast<ExprObjectKind>(538CurrentUnpackingBits->getNextBits(/*Width=*/3)));539540E->setType(Record.readType());541assert(Record.getIdx() == NumExprFields &&542"Incorrect expression field count");543}544545void ASTStmtReader::VisitConstantExpr(ConstantExpr *E) {546VisitExpr(E);547548auto StorageKind = static_cast<ConstantResultStorageKind>(Record.readInt());549assert(E->getResultStorageKind() == StorageKind && "Wrong ResultKind!");550551E->ConstantExprBits.APValueKind = Record.readInt();552E->ConstantExprBits.IsUnsigned = Record.readInt();553E->ConstantExprBits.BitWidth = Record.readInt();554E->ConstantExprBits.HasCleanup = false; // Not serialized, see below.555E->ConstantExprBits.IsImmediateInvocation = Record.readInt();556557switch (StorageKind) {558case ConstantResultStorageKind::None:559break;560561case ConstantResultStorageKind::Int64:562E->Int64Result() = Record.readInt();563break;564565case ConstantResultStorageKind::APValue:566E->APValueResult() = Record.readAPValue();567if (E->APValueResult().needsCleanup()) {568E->ConstantExprBits.HasCleanup = true;569Record.getContext().addDestruction(&E->APValueResult());570}571break;572}573574E->setSubExpr(Record.readSubExpr());575}576577void ASTStmtReader::VisitSYCLUniqueStableNameExpr(SYCLUniqueStableNameExpr *E) {578VisitExpr(E);579580E->setLocation(readSourceLocation());581E->setLParenLocation(readSourceLocation());582E->setRParenLocation(readSourceLocation());583584E->setTypeSourceInfo(Record.readTypeSourceInfo());585}586587void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {588VisitExpr(E);589bool HasFunctionName = Record.readInt();590E->PredefinedExprBits.HasFunctionName = HasFunctionName;591E->PredefinedExprBits.Kind = Record.readInt();592E->PredefinedExprBits.IsTransparent = Record.readInt();593E->setLocation(readSourceLocation());594if (HasFunctionName)595E->setFunctionName(cast<StringLiteral>(Record.readSubExpr()));596}597598void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {599VisitExpr(E);600601CurrentUnpackingBits.emplace(Record.readInt());602E->DeclRefExprBits.HadMultipleCandidates = CurrentUnpackingBits->getNextBit();603E->DeclRefExprBits.RefersToEnclosingVariableOrCapture =604CurrentUnpackingBits->getNextBit();605E->DeclRefExprBits.NonOdrUseReason =606CurrentUnpackingBits->getNextBits(/*Width=*/2);607E->DeclRefExprBits.IsImmediateEscalating = CurrentUnpackingBits->getNextBit();608E->DeclRefExprBits.HasFoundDecl = CurrentUnpackingBits->getNextBit();609E->DeclRefExprBits.HasQualifier = CurrentUnpackingBits->getNextBit();610E->DeclRefExprBits.HasTemplateKWAndArgsInfo =611CurrentUnpackingBits->getNextBit();612E->DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = false;613unsigned NumTemplateArgs = 0;614if (E->hasTemplateKWAndArgsInfo())615NumTemplateArgs = Record.readInt();616617if (E->hasQualifier())618new (E->getTrailingObjects<NestedNameSpecifierLoc>())619NestedNameSpecifierLoc(Record.readNestedNameSpecifierLoc());620621if (E->hasFoundDecl())622*E->getTrailingObjects<NamedDecl *>() = readDeclAs<NamedDecl>();623624if (E->hasTemplateKWAndArgsInfo())625ReadTemplateKWAndArgsInfo(626*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),627E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs);628629E->D = readDeclAs<ValueDecl>();630E->setLocation(readSourceLocation());631E->DNLoc = Record.readDeclarationNameLoc(E->getDecl()->getDeclName());632}633634void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {635VisitExpr(E);636E->setLocation(readSourceLocation());637E->setValue(Record.getContext(), Record.readAPInt());638}639640void ASTStmtReader::VisitFixedPointLiteral(FixedPointLiteral *E) {641VisitExpr(E);642E->setLocation(readSourceLocation());643E->setScale(Record.readInt());644E->setValue(Record.getContext(), Record.readAPInt());645}646647void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {648VisitExpr(E);649E->setRawSemantics(650static_cast<llvm::APFloatBase::Semantics>(Record.readInt()));651E->setExact(Record.readInt());652E->setValue(Record.getContext(), Record.readAPFloat(E->getSemantics()));653E->setLocation(readSourceLocation());654}655656void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {657VisitExpr(E);658E->setSubExpr(Record.readSubExpr());659}660661void ASTStmtReader::VisitStringLiteral(StringLiteral *E) {662VisitExpr(E);663664// NumConcatenated, Length and CharByteWidth are set by the empty665// ctor since they are needed to allocate storage for the trailing objects.666unsigned NumConcatenated = Record.readInt();667unsigned Length = Record.readInt();668unsigned CharByteWidth = Record.readInt();669assert((NumConcatenated == E->getNumConcatenated()) &&670"Wrong number of concatenated tokens!");671assert((Length == E->getLength()) && "Wrong Length!");672assert((CharByteWidth == E->getCharByteWidth()) && "Wrong character width!");673E->StringLiteralBits.Kind = Record.readInt();674E->StringLiteralBits.IsPascal = Record.readInt();675676// The character width is originally computed via mapCharByteWidth.677// Check that the deserialized character width is consistant with the result678// of calling mapCharByteWidth.679assert((CharByteWidth ==680StringLiteral::mapCharByteWidth(Record.getContext().getTargetInfo(),681E->getKind())) &&682"Wrong character width!");683684// Deserialize the trailing array of SourceLocation.685for (unsigned I = 0; I < NumConcatenated; ++I)686E->setStrTokenLoc(I, readSourceLocation());687688// Deserialize the trailing array of char holding the string data.689char *StrData = E->getStrDataAsChar();690for (unsigned I = 0; I < Length * CharByteWidth; ++I)691StrData[I] = Record.readInt();692}693694void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {695VisitExpr(E);696E->setValue(Record.readInt());697E->setLocation(readSourceLocation());698E->setKind(static_cast<CharacterLiteralKind>(Record.readInt()));699}700701void ASTStmtReader::VisitParenExpr(ParenExpr *E) {702VisitExpr(E);703E->setLParen(readSourceLocation());704E->setRParen(readSourceLocation());705E->setSubExpr(Record.readSubExpr());706}707708void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {709VisitExpr(E);710unsigned NumExprs = Record.readInt();711assert((NumExprs == E->getNumExprs()) && "Wrong NumExprs!");712for (unsigned I = 0; I != NumExprs; ++I)713E->getTrailingObjects<Stmt *>()[I] = Record.readSubStmt();714E->LParenLoc = readSourceLocation();715E->RParenLoc = readSourceLocation();716}717718void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {719VisitExpr(E);720bool hasFP_Features = CurrentUnpackingBits->getNextBit();721assert(hasFP_Features == E->hasStoredFPFeatures());722E->setSubExpr(Record.readSubExpr());723E->setOpcode(724(UnaryOperator::Opcode)CurrentUnpackingBits->getNextBits(/*Width=*/5));725E->setOperatorLoc(readSourceLocation());726E->setCanOverflow(CurrentUnpackingBits->getNextBit());727if (hasFP_Features)728E->setStoredFPFeatures(729FPOptionsOverride::getFromOpaqueInt(Record.readInt()));730}731732void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {733VisitExpr(E);734assert(E->getNumComponents() == Record.peekInt());735Record.skipInts(1);736assert(E->getNumExpressions() == Record.peekInt());737Record.skipInts(1);738E->setOperatorLoc(readSourceLocation());739E->setRParenLoc(readSourceLocation());740E->setTypeSourceInfo(readTypeSourceInfo());741for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {742auto Kind = static_cast<OffsetOfNode::Kind>(Record.readInt());743SourceLocation Start = readSourceLocation();744SourceLocation End = readSourceLocation();745switch (Kind) {746case OffsetOfNode::Array:747E->setComponent(I, OffsetOfNode(Start, Record.readInt(), End));748break;749750case OffsetOfNode::Field:751E->setComponent(752I, OffsetOfNode(Start, readDeclAs<FieldDecl>(), End));753break;754755case OffsetOfNode::Identifier:756E->setComponent(757I,758OffsetOfNode(Start, Record.readIdentifier(), End));759break;760761case OffsetOfNode::Base: {762auto *Base = new (Record.getContext()) CXXBaseSpecifier();763*Base = Record.readCXXBaseSpecifier();764E->setComponent(I, OffsetOfNode(Base));765break;766}767}768}769770for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)771E->setIndexExpr(I, Record.readSubExpr());772}773774void ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {775VisitExpr(E);776E->setKind(static_cast<UnaryExprOrTypeTrait>(Record.readInt()));777if (Record.peekInt() == 0) {778E->setArgument(Record.readSubExpr());779Record.skipInts(1);780} else {781E->setArgument(readTypeSourceInfo());782}783E->setOperatorLoc(readSourceLocation());784E->setRParenLoc(readSourceLocation());785}786787static ConstraintSatisfaction788readConstraintSatisfaction(ASTRecordReader &Record) {789ConstraintSatisfaction Satisfaction;790Satisfaction.IsSatisfied = Record.readInt();791Satisfaction.ContainsErrors = Record.readInt();792const ASTContext &C = Record.getContext();793if (!Satisfaction.IsSatisfied) {794unsigned NumDetailRecords = Record.readInt();795for (unsigned i = 0; i != NumDetailRecords; ++i) {796if (/* IsDiagnostic */Record.readInt()) {797SourceLocation DiagLocation = Record.readSourceLocation();798StringRef DiagMessage = C.backupStr(Record.readString());799800Satisfaction.Details.emplace_back(801new (C) ConstraintSatisfaction::SubstitutionDiagnostic(802DiagLocation, DiagMessage));803} else804Satisfaction.Details.emplace_back(Record.readExpr());805}806}807return Satisfaction;808}809810void ASTStmtReader::VisitConceptSpecializationExpr(811ConceptSpecializationExpr *E) {812VisitExpr(E);813E->SpecDecl = Record.readDeclAs<ImplicitConceptSpecializationDecl>();814if (Record.readBool())815E->ConceptRef = Record.readConceptReference();816E->Satisfaction = E->isValueDependent() ? nullptr :817ASTConstraintSatisfaction::Create(Record.getContext(),818readConstraintSatisfaction(Record));819}820821static concepts::Requirement::SubstitutionDiagnostic *822readSubstitutionDiagnostic(ASTRecordReader &Record) {823const ASTContext &C = Record.getContext();824StringRef SubstitutedEntity = C.backupStr(Record.readString());825SourceLocation DiagLoc = Record.readSourceLocation();826StringRef DiagMessage = C.backupStr(Record.readString());827828return new (Record.getContext())829concepts::Requirement::SubstitutionDiagnostic{SubstitutedEntity, DiagLoc,830DiagMessage};831}832833void ASTStmtReader::VisitRequiresExpr(RequiresExpr *E) {834VisitExpr(E);835unsigned NumLocalParameters = Record.readInt();836unsigned NumRequirements = Record.readInt();837E->RequiresExprBits.RequiresKWLoc = Record.readSourceLocation();838E->RequiresExprBits.IsSatisfied = Record.readInt();839E->Body = Record.readDeclAs<RequiresExprBodyDecl>();840llvm::SmallVector<ParmVarDecl *, 4> LocalParameters;841for (unsigned i = 0; i < NumLocalParameters; ++i)842LocalParameters.push_back(cast<ParmVarDecl>(Record.readDecl()));843std::copy(LocalParameters.begin(), LocalParameters.end(),844E->getTrailingObjects<ParmVarDecl *>());845llvm::SmallVector<concepts::Requirement *, 4> Requirements;846for (unsigned i = 0; i < NumRequirements; ++i) {847auto RK =848static_cast<concepts::Requirement::RequirementKind>(Record.readInt());849concepts::Requirement *R = nullptr;850switch (RK) {851case concepts::Requirement::RK_Type: {852auto Status =853static_cast<concepts::TypeRequirement::SatisfactionStatus>(854Record.readInt());855if (Status == concepts::TypeRequirement::SS_SubstitutionFailure)856R = new (Record.getContext())857concepts::TypeRequirement(readSubstitutionDiagnostic(Record));858else859R = new (Record.getContext())860concepts::TypeRequirement(Record.readTypeSourceInfo());861} break;862case concepts::Requirement::RK_Simple:863case concepts::Requirement::RK_Compound: {864auto Status =865static_cast<concepts::ExprRequirement::SatisfactionStatus>(866Record.readInt());867llvm::PointerUnion<concepts::Requirement::SubstitutionDiagnostic *,868Expr *> E;869if (Status == concepts::ExprRequirement::SS_ExprSubstitutionFailure) {870E = readSubstitutionDiagnostic(Record);871} else872E = Record.readExpr();873874std::optional<concepts::ExprRequirement::ReturnTypeRequirement> Req;875ConceptSpecializationExpr *SubstitutedConstraintExpr = nullptr;876SourceLocation NoexceptLoc;877if (RK == concepts::Requirement::RK_Simple) {878Req.emplace();879} else {880NoexceptLoc = Record.readSourceLocation();881switch (/* returnTypeRequirementKind */Record.readInt()) {882case 0:883// No return type requirement.884Req.emplace();885break;886case 1: {887// type-constraint888TemplateParameterList *TPL = Record.readTemplateParameterList();889if (Status >=890concepts::ExprRequirement::SS_ConstraintsNotSatisfied)891SubstitutedConstraintExpr =892cast<ConceptSpecializationExpr>(Record.readExpr());893Req.emplace(TPL);894} break;895case 2:896// Substitution failure897Req.emplace(readSubstitutionDiagnostic(Record));898break;899}900}901if (Expr *Ex = E.dyn_cast<Expr *>())902R = new (Record.getContext()) concepts::ExprRequirement(903Ex, RK == concepts::Requirement::RK_Simple, NoexceptLoc,904std::move(*Req), Status, SubstitutedConstraintExpr);905else906R = new (Record.getContext()) concepts::ExprRequirement(907E.get<concepts::Requirement::SubstitutionDiagnostic *>(),908RK == concepts::Requirement::RK_Simple, NoexceptLoc,909std::move(*Req));910} break;911case concepts::Requirement::RK_Nested: {912ASTContext &C = Record.getContext();913bool HasInvalidConstraint = Record.readInt();914if (HasInvalidConstraint) {915StringRef InvalidConstraint = C.backupStr(Record.readString());916R = new (C) concepts::NestedRequirement(917Record.getContext(), InvalidConstraint,918readConstraintSatisfaction(Record));919break;920}921Expr *E = Record.readExpr();922if (E->isInstantiationDependent())923R = new (C) concepts::NestedRequirement(E);924else925R = new (C) concepts::NestedRequirement(926C, E, readConstraintSatisfaction(Record));927} break;928}929if (!R)930continue;931Requirements.push_back(R);932}933std::copy(Requirements.begin(), Requirements.end(),934E->getTrailingObjects<concepts::Requirement *>());935E->LParenLoc = Record.readSourceLocation();936E->RParenLoc = Record.readSourceLocation();937E->RBraceLoc = Record.readSourceLocation();938}939940void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {941VisitExpr(E);942E->setLHS(Record.readSubExpr());943E->setRHS(Record.readSubExpr());944E->setRBracketLoc(readSourceLocation());945}946947void ASTStmtReader::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *E) {948VisitExpr(E);949E->setBase(Record.readSubExpr());950E->setRowIdx(Record.readSubExpr());951E->setColumnIdx(Record.readSubExpr());952E->setRBracketLoc(readSourceLocation());953}954955void ASTStmtReader::VisitArraySectionExpr(ArraySectionExpr *E) {956VisitExpr(E);957E->ASType = Record.readEnum<ArraySectionExpr::ArraySectionType>();958959E->setBase(Record.readSubExpr());960E->setLowerBound(Record.readSubExpr());961E->setLength(Record.readSubExpr());962963if (E->isOMPArraySection())964E->setStride(Record.readSubExpr());965966E->setColonLocFirst(readSourceLocation());967968if (E->isOMPArraySection())969E->setColonLocSecond(readSourceLocation());970971E->setRBracketLoc(readSourceLocation());972}973974void ASTStmtReader::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *E) {975VisitExpr(E);976unsigned NumDims = Record.readInt();977E->setBase(Record.readSubExpr());978SmallVector<Expr *, 4> Dims(NumDims);979for (unsigned I = 0; I < NumDims; ++I)980Dims[I] = Record.readSubExpr();981E->setDimensions(Dims);982SmallVector<SourceRange, 4> SRs(NumDims);983for (unsigned I = 0; I < NumDims; ++I)984SRs[I] = readSourceRange();985E->setBracketsRanges(SRs);986E->setLParenLoc(readSourceLocation());987E->setRParenLoc(readSourceLocation());988}989990void ASTStmtReader::VisitOMPIteratorExpr(OMPIteratorExpr *E) {991VisitExpr(E);992unsigned NumIters = Record.readInt();993E->setIteratorKwLoc(readSourceLocation());994E->setLParenLoc(readSourceLocation());995E->setRParenLoc(readSourceLocation());996for (unsigned I = 0; I < NumIters; ++I) {997E->setIteratorDeclaration(I, Record.readDeclRef());998E->setAssignmentLoc(I, readSourceLocation());999Expr *Begin = Record.readSubExpr();1000Expr *End = Record.readSubExpr();1001Expr *Step = Record.readSubExpr();1002SourceLocation ColonLoc = readSourceLocation();1003SourceLocation SecColonLoc;1004if (Step)1005SecColonLoc = readSourceLocation();1006E->setIteratorRange(I, Begin, ColonLoc, End, SecColonLoc, Step);1007// Deserialize helpers1008OMPIteratorHelperData HD;1009HD.CounterVD = cast_or_null<VarDecl>(Record.readDeclRef());1010HD.Upper = Record.readSubExpr();1011HD.Update = Record.readSubExpr();1012HD.CounterUpdate = Record.readSubExpr();1013E->setHelper(I, HD);1014}1015}10161017void ASTStmtReader::VisitCallExpr(CallExpr *E) {1018VisitExpr(E);10191020unsigned NumArgs = Record.readInt();1021CurrentUnpackingBits.emplace(Record.readInt());1022E->setADLCallKind(1023static_cast<CallExpr::ADLCallKind>(CurrentUnpackingBits->getNextBit()));1024bool HasFPFeatures = CurrentUnpackingBits->getNextBit();1025assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!");1026E->setRParenLoc(readSourceLocation());1027E->setCallee(Record.readSubExpr());1028for (unsigned I = 0; I != NumArgs; ++I)1029E->setArg(I, Record.readSubExpr());10301031if (HasFPFeatures)1032E->setStoredFPFeatures(1033FPOptionsOverride::getFromOpaqueInt(Record.readInt()));1034}10351036void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {1037VisitCallExpr(E);1038}10391040void ASTStmtReader::VisitMemberExpr(MemberExpr *E) {1041VisitExpr(E);10421043CurrentUnpackingBits.emplace(Record.readInt());1044bool HasQualifier = CurrentUnpackingBits->getNextBit();1045bool HasFoundDecl = CurrentUnpackingBits->getNextBit();1046bool HasTemplateInfo = CurrentUnpackingBits->getNextBit();1047unsigned NumTemplateArgs = Record.readInt();10481049E->Base = Record.readSubExpr();1050E->MemberDecl = Record.readDeclAs<ValueDecl>();1051E->MemberDNLoc = Record.readDeclarationNameLoc(E->MemberDecl->getDeclName());1052E->MemberLoc = Record.readSourceLocation();1053E->MemberExprBits.IsArrow = CurrentUnpackingBits->getNextBit();1054E->MemberExprBits.HasQualifier = HasQualifier;1055E->MemberExprBits.HasFoundDecl = HasFoundDecl;1056E->MemberExprBits.HasTemplateKWAndArgsInfo = HasTemplateInfo;1057E->MemberExprBits.HadMultipleCandidates = CurrentUnpackingBits->getNextBit();1058E->MemberExprBits.NonOdrUseReason =1059CurrentUnpackingBits->getNextBits(/*Width=*/2);1060E->MemberExprBits.OperatorLoc = Record.readSourceLocation();10611062if (HasQualifier)1063new (E->getTrailingObjects<NestedNameSpecifierLoc>())1064NestedNameSpecifierLoc(Record.readNestedNameSpecifierLoc());10651066if (HasFoundDecl) {1067auto *FoundD = Record.readDeclAs<NamedDecl>();1068auto AS = (AccessSpecifier)CurrentUnpackingBits->getNextBits(/*Width=*/2);1069*E->getTrailingObjects<DeclAccessPair>() = DeclAccessPair::make(FoundD, AS);1070}10711072if (HasTemplateInfo)1073ReadTemplateKWAndArgsInfo(1074*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),1075E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs);1076}10771078void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {1079VisitExpr(E);1080E->setBase(Record.readSubExpr());1081E->setIsaMemberLoc(readSourceLocation());1082E->setOpLoc(readSourceLocation());1083E->setArrow(Record.readInt());1084}10851086void ASTStmtReader::1087VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {1088VisitExpr(E);1089E->Operand = Record.readSubExpr();1090E->setShouldCopy(Record.readInt());1091}10921093void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {1094VisitExplicitCastExpr(E);1095E->LParenLoc = readSourceLocation();1096E->BridgeKeywordLoc = readSourceLocation();1097E->Kind = Record.readInt();1098}10991100void ASTStmtReader::VisitCastExpr(CastExpr *E) {1101VisitExpr(E);1102unsigned NumBaseSpecs = Record.readInt();1103assert(NumBaseSpecs == E->path_size());11041105CurrentUnpackingBits.emplace(Record.readInt());1106E->setCastKind((CastKind)CurrentUnpackingBits->getNextBits(/*Width=*/7));1107unsigned HasFPFeatures = CurrentUnpackingBits->getNextBit();1108assert(E->hasStoredFPFeatures() == HasFPFeatures);11091110E->setSubExpr(Record.readSubExpr());11111112CastExpr::path_iterator BaseI = E->path_begin();1113while (NumBaseSpecs--) {1114auto *BaseSpec = new (Record.getContext()) CXXBaseSpecifier;1115*BaseSpec = Record.readCXXBaseSpecifier();1116*BaseI++ = BaseSpec;1117}1118if (HasFPFeatures)1119*E->getTrailingFPFeatures() =1120FPOptionsOverride::getFromOpaqueInt(Record.readInt());1121}11221123void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {1124VisitExpr(E);1125CurrentUnpackingBits.emplace(Record.readInt());1126E->setOpcode(1127(BinaryOperator::Opcode)CurrentUnpackingBits->getNextBits(/*Width=*/6));1128bool hasFP_Features = CurrentUnpackingBits->getNextBit();1129E->setHasStoredFPFeatures(hasFP_Features);1130E->setLHS(Record.readSubExpr());1131E->setRHS(Record.readSubExpr());1132E->setOperatorLoc(readSourceLocation());1133if (hasFP_Features)1134E->setStoredFPFeatures(1135FPOptionsOverride::getFromOpaqueInt(Record.readInt()));1136}11371138void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {1139VisitBinaryOperator(E);1140E->setComputationLHSType(Record.readType());1141E->setComputationResultType(Record.readType());1142}11431144void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {1145VisitExpr(E);1146E->SubExprs[ConditionalOperator::COND] = Record.readSubExpr();1147E->SubExprs[ConditionalOperator::LHS] = Record.readSubExpr();1148E->SubExprs[ConditionalOperator::RHS] = Record.readSubExpr();1149E->QuestionLoc = readSourceLocation();1150E->ColonLoc = readSourceLocation();1151}11521153void1154ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {1155VisitExpr(E);1156E->OpaqueValue = cast<OpaqueValueExpr>(Record.readSubExpr());1157E->SubExprs[BinaryConditionalOperator::COMMON] = Record.readSubExpr();1158E->SubExprs[BinaryConditionalOperator::COND] = Record.readSubExpr();1159E->SubExprs[BinaryConditionalOperator::LHS] = Record.readSubExpr();1160E->SubExprs[BinaryConditionalOperator::RHS] = Record.readSubExpr();1161E->QuestionLoc = readSourceLocation();1162E->ColonLoc = readSourceLocation();1163}11641165void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {1166VisitCastExpr(E);1167E->setIsPartOfExplicitCast(CurrentUnpackingBits->getNextBit());1168}11691170void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {1171VisitCastExpr(E);1172E->setTypeInfoAsWritten(readTypeSourceInfo());1173}11741175void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {1176VisitExplicitCastExpr(E);1177E->setLParenLoc(readSourceLocation());1178E->setRParenLoc(readSourceLocation());1179}11801181void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {1182VisitExpr(E);1183E->setLParenLoc(readSourceLocation());1184E->setTypeSourceInfo(readTypeSourceInfo());1185E->setInitializer(Record.readSubExpr());1186E->setFileScope(Record.readInt());1187}11881189void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {1190VisitExpr(E);1191E->setBase(Record.readSubExpr());1192E->setAccessor(Record.readIdentifier());1193E->setAccessorLoc(readSourceLocation());1194}11951196void ASTStmtReader::VisitInitListExpr(InitListExpr *E) {1197VisitExpr(E);1198if (auto *SyntForm = cast_or_null<InitListExpr>(Record.readSubStmt()))1199E->setSyntacticForm(SyntForm);1200E->setLBraceLoc(readSourceLocation());1201E->setRBraceLoc(readSourceLocation());1202bool isArrayFiller = Record.readInt();1203Expr *filler = nullptr;1204if (isArrayFiller) {1205filler = Record.readSubExpr();1206E->ArrayFillerOrUnionFieldInit = filler;1207} else1208E->ArrayFillerOrUnionFieldInit = readDeclAs<FieldDecl>();1209E->sawArrayRangeDesignator(Record.readInt());1210unsigned NumInits = Record.readInt();1211E->reserveInits(Record.getContext(), NumInits);1212if (isArrayFiller) {1213for (unsigned I = 0; I != NumInits; ++I) {1214Expr *init = Record.readSubExpr();1215E->updateInit(Record.getContext(), I, init ? init : filler);1216}1217} else {1218for (unsigned I = 0; I != NumInits; ++I)1219E->updateInit(Record.getContext(), I, Record.readSubExpr());1220}1221}12221223void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {1224using Designator = DesignatedInitExpr::Designator;12251226VisitExpr(E);1227unsigned NumSubExprs = Record.readInt();1228assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");1229for (unsigned I = 0; I != NumSubExprs; ++I)1230E->setSubExpr(I, Record.readSubExpr());1231E->setEqualOrColonLoc(readSourceLocation());1232E->setGNUSyntax(Record.readInt());12331234SmallVector<Designator, 4> Designators;1235while (Record.getIdx() < Record.size()) {1236switch ((DesignatorTypes)Record.readInt()) {1237case DESIG_FIELD_DECL: {1238auto *Field = readDeclAs<FieldDecl>();1239SourceLocation DotLoc = readSourceLocation();1240SourceLocation FieldLoc = readSourceLocation();1241Designators.push_back(Designator::CreateFieldDesignator(1242Field->getIdentifier(), DotLoc, FieldLoc));1243Designators.back().setFieldDecl(Field);1244break;1245}12461247case DESIG_FIELD_NAME: {1248const IdentifierInfo *Name = Record.readIdentifier();1249SourceLocation DotLoc = readSourceLocation();1250SourceLocation FieldLoc = readSourceLocation();1251Designators.push_back(Designator::CreateFieldDesignator(Name, DotLoc,1252FieldLoc));1253break;1254}12551256case DESIG_ARRAY: {1257unsigned Index = Record.readInt();1258SourceLocation LBracketLoc = readSourceLocation();1259SourceLocation RBracketLoc = readSourceLocation();1260Designators.push_back(Designator::CreateArrayDesignator(Index,1261LBracketLoc,1262RBracketLoc));1263break;1264}12651266case DESIG_ARRAY_RANGE: {1267unsigned Index = Record.readInt();1268SourceLocation LBracketLoc = readSourceLocation();1269SourceLocation EllipsisLoc = readSourceLocation();1270SourceLocation RBracketLoc = readSourceLocation();1271Designators.push_back(Designator::CreateArrayRangeDesignator(1272Index, LBracketLoc, EllipsisLoc, RBracketLoc));1273break;1274}1275}1276}1277E->setDesignators(Record.getContext(),1278Designators.data(), Designators.size());1279}12801281void ASTStmtReader::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {1282VisitExpr(E);1283E->setBase(Record.readSubExpr());1284E->setUpdater(Record.readSubExpr());1285}12861287void ASTStmtReader::VisitNoInitExpr(NoInitExpr *E) {1288VisitExpr(E);1289}12901291void ASTStmtReader::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {1292VisitExpr(E);1293E->SubExprs[0] = Record.readSubExpr();1294E->SubExprs[1] = Record.readSubExpr();1295}12961297void ASTStmtReader::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {1298VisitExpr(E);1299}13001301void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {1302VisitExpr(E);1303}13041305void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {1306VisitExpr(E);1307E->setSubExpr(Record.readSubExpr());1308E->setWrittenTypeInfo(readTypeSourceInfo());1309E->setBuiltinLoc(readSourceLocation());1310E->setRParenLoc(readSourceLocation());1311E->setIsMicrosoftABI(Record.readInt());1312}13131314void ASTStmtReader::VisitSourceLocExpr(SourceLocExpr *E) {1315VisitExpr(E);1316E->ParentContext = readDeclAs<DeclContext>();1317E->BuiltinLoc = readSourceLocation();1318E->RParenLoc = readSourceLocation();1319E->SourceLocExprBits.Kind = Record.readInt();1320}13211322void ASTStmtReader::VisitEmbedExpr(EmbedExpr *E) {1323VisitExpr(E);1324E->EmbedKeywordLoc = readSourceLocation();1325EmbedDataStorage *Data = new (Record.getContext()) EmbedDataStorage;1326Data->BinaryData = cast<StringLiteral>(Record.readSubStmt());1327E->Data = Data;1328E->Begin = Record.readInt();1329E->NumOfElements = Record.readInt();1330}13311332void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {1333VisitExpr(E);1334E->setAmpAmpLoc(readSourceLocation());1335E->setLabelLoc(readSourceLocation());1336E->setLabel(readDeclAs<LabelDecl>());1337}13381339void ASTStmtReader::VisitStmtExpr(StmtExpr *E) {1340VisitExpr(E);1341E->setLParenLoc(readSourceLocation());1342E->setRParenLoc(readSourceLocation());1343E->setSubStmt(cast_or_null<CompoundStmt>(Record.readSubStmt()));1344E->StmtExprBits.TemplateDepth = Record.readInt();1345}13461347void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {1348VisitExpr(E);1349E->setCond(Record.readSubExpr());1350E->setLHS(Record.readSubExpr());1351E->setRHS(Record.readSubExpr());1352E->setBuiltinLoc(readSourceLocation());1353E->setRParenLoc(readSourceLocation());1354E->setIsConditionTrue(Record.readInt());1355}13561357void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {1358VisitExpr(E);1359E->setTokenLocation(readSourceLocation());1360}13611362void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {1363VisitExpr(E);1364SmallVector<Expr *, 16> Exprs;1365unsigned NumExprs = Record.readInt();1366while (NumExprs--)1367Exprs.push_back(Record.readSubExpr());1368E->setExprs(Record.getContext(), Exprs);1369E->setBuiltinLoc(readSourceLocation());1370E->setRParenLoc(readSourceLocation());1371}13721373void ASTStmtReader::VisitConvertVectorExpr(ConvertVectorExpr *E) {1374VisitExpr(E);1375E->BuiltinLoc = readSourceLocation();1376E->RParenLoc = readSourceLocation();1377E->TInfo = readTypeSourceInfo();1378E->SrcExpr = Record.readSubExpr();1379}13801381void ASTStmtReader::VisitBlockExpr(BlockExpr *E) {1382VisitExpr(E);1383E->setBlockDecl(readDeclAs<BlockDecl>());1384}13851386void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) {1387VisitExpr(E);13881389unsigned NumAssocs = Record.readInt();1390assert(NumAssocs == E->getNumAssocs() && "Wrong NumAssocs!");1391E->IsExprPredicate = Record.readInt();1392E->ResultIndex = Record.readInt();1393E->GenericSelectionExprBits.GenericLoc = readSourceLocation();1394E->DefaultLoc = readSourceLocation();1395E->RParenLoc = readSourceLocation();13961397Stmt **Stmts = E->getTrailingObjects<Stmt *>();1398// Add 1 to account for the controlling expression which is the first1399// expression in the trailing array of Stmt *. This is not needed for1400// the trailing array of TypeSourceInfo *.1401for (unsigned I = 0, N = NumAssocs + 1; I < N; ++I)1402Stmts[I] = Record.readSubExpr();14031404TypeSourceInfo **TSIs = E->getTrailingObjects<TypeSourceInfo *>();1405for (unsigned I = 0, N = NumAssocs; I < N; ++I)1406TSIs[I] = readTypeSourceInfo();1407}14081409void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) {1410VisitExpr(E);1411unsigned numSemanticExprs = Record.readInt();1412assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs);1413E->PseudoObjectExprBits.ResultIndex = Record.readInt();14141415// Read the syntactic expression.1416E->getSubExprsBuffer()[0] = Record.readSubExpr();14171418// Read all the semantic expressions.1419for (unsigned i = 0; i != numSemanticExprs; ++i) {1420Expr *subExpr = Record.readSubExpr();1421E->getSubExprsBuffer()[i+1] = subExpr;1422}1423}14241425void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) {1426VisitExpr(E);1427E->Op = AtomicExpr::AtomicOp(Record.readInt());1428E->NumSubExprs = AtomicExpr::getNumSubExprs(E->Op);1429for (unsigned I = 0; I != E->NumSubExprs; ++I)1430E->SubExprs[I] = Record.readSubExpr();1431E->BuiltinLoc = readSourceLocation();1432E->RParenLoc = readSourceLocation();1433}14341435//===----------------------------------------------------------------------===//1436// Objective-C Expressions and Statements14371438void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {1439VisitExpr(E);1440E->setString(cast<StringLiteral>(Record.readSubStmt()));1441E->setAtLoc(readSourceLocation());1442}14431444void ASTStmtReader::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {1445VisitExpr(E);1446// could be one of several IntegerLiteral, FloatLiteral, etc.1447E->SubExpr = Record.readSubStmt();1448E->BoxingMethod = readDeclAs<ObjCMethodDecl>();1449E->Range = readSourceRange();1450}14511452void ASTStmtReader::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {1453VisitExpr(E);1454unsigned NumElements = Record.readInt();1455assert(NumElements == E->getNumElements() && "Wrong number of elements");1456Expr **Elements = E->getElements();1457for (unsigned I = 0, N = NumElements; I != N; ++I)1458Elements[I] = Record.readSubExpr();1459E->ArrayWithObjectsMethod = readDeclAs<ObjCMethodDecl>();1460E->Range = readSourceRange();1461}14621463void ASTStmtReader::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {1464VisitExpr(E);1465unsigned NumElements = Record.readInt();1466assert(NumElements == E->getNumElements() && "Wrong number of elements");1467bool HasPackExpansions = Record.readInt();1468assert(HasPackExpansions == E->HasPackExpansions &&"Pack expansion mismatch");1469auto *KeyValues =1470E->getTrailingObjects<ObjCDictionaryLiteral::KeyValuePair>();1471auto *Expansions =1472E->getTrailingObjects<ObjCDictionaryLiteral::ExpansionData>();1473for (unsigned I = 0; I != NumElements; ++I) {1474KeyValues[I].Key = Record.readSubExpr();1475KeyValues[I].Value = Record.readSubExpr();1476if (HasPackExpansions) {1477Expansions[I].EllipsisLoc = readSourceLocation();1478Expansions[I].NumExpansionsPlusOne = Record.readInt();1479}1480}1481E->DictWithObjectsMethod = readDeclAs<ObjCMethodDecl>();1482E->Range = readSourceRange();1483}14841485void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {1486VisitExpr(E);1487E->setEncodedTypeSourceInfo(readTypeSourceInfo());1488E->setAtLoc(readSourceLocation());1489E->setRParenLoc(readSourceLocation());1490}14911492void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {1493VisitExpr(E);1494E->setSelector(Record.readSelector());1495E->setAtLoc(readSourceLocation());1496E->setRParenLoc(readSourceLocation());1497}14981499void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {1500VisitExpr(E);1501E->setProtocol(readDeclAs<ObjCProtocolDecl>());1502E->setAtLoc(readSourceLocation());1503E->ProtoLoc = readSourceLocation();1504E->setRParenLoc(readSourceLocation());1505}15061507void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {1508VisitExpr(E);1509E->setDecl(readDeclAs<ObjCIvarDecl>());1510E->setLocation(readSourceLocation());1511E->setOpLoc(readSourceLocation());1512E->setBase(Record.readSubExpr());1513E->setIsArrow(Record.readInt());1514E->setIsFreeIvar(Record.readInt());1515}15161517void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {1518VisitExpr(E);1519unsigned MethodRefFlags = Record.readInt();1520bool Implicit = Record.readInt() != 0;1521if (Implicit) {1522auto *Getter = readDeclAs<ObjCMethodDecl>();1523auto *Setter = readDeclAs<ObjCMethodDecl>();1524E->setImplicitProperty(Getter, Setter, MethodRefFlags);1525} else {1526E->setExplicitProperty(readDeclAs<ObjCPropertyDecl>(), MethodRefFlags);1527}1528E->setLocation(readSourceLocation());1529E->setReceiverLocation(readSourceLocation());1530switch (Record.readInt()) {1531case 0:1532E->setBase(Record.readSubExpr());1533break;1534case 1:1535E->setSuperReceiver(Record.readType());1536break;1537case 2:1538E->setClassReceiver(readDeclAs<ObjCInterfaceDecl>());1539break;1540}1541}15421543void ASTStmtReader::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {1544VisitExpr(E);1545E->setRBracket(readSourceLocation());1546E->setBaseExpr(Record.readSubExpr());1547E->setKeyExpr(Record.readSubExpr());1548E->GetAtIndexMethodDecl = readDeclAs<ObjCMethodDecl>();1549E->SetAtIndexMethodDecl = readDeclAs<ObjCMethodDecl>();1550}15511552void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {1553VisitExpr(E);1554assert(Record.peekInt() == E->getNumArgs());1555Record.skipInts(1);1556unsigned NumStoredSelLocs = Record.readInt();1557E->SelLocsKind = Record.readInt();1558E->setDelegateInitCall(Record.readInt());1559E->IsImplicit = Record.readInt();1560auto Kind = static_cast<ObjCMessageExpr::ReceiverKind>(Record.readInt());1561switch (Kind) {1562case ObjCMessageExpr::Instance:1563E->setInstanceReceiver(Record.readSubExpr());1564break;15651566case ObjCMessageExpr::Class:1567E->setClassReceiver(readTypeSourceInfo());1568break;15691570case ObjCMessageExpr::SuperClass:1571case ObjCMessageExpr::SuperInstance: {1572QualType T = Record.readType();1573SourceLocation SuperLoc = readSourceLocation();1574E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);1575break;1576}1577}15781579assert(Kind == E->getReceiverKind());15801581if (Record.readInt())1582E->setMethodDecl(readDeclAs<ObjCMethodDecl>());1583else1584E->setSelector(Record.readSelector());15851586E->LBracLoc = readSourceLocation();1587E->RBracLoc = readSourceLocation();15881589for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)1590E->setArg(I, Record.readSubExpr());15911592SourceLocation *Locs = E->getStoredSelLocs();1593for (unsigned I = 0; I != NumStoredSelLocs; ++I)1594Locs[I] = readSourceLocation();1595}15961597void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {1598VisitStmt(S);1599S->setElement(Record.readSubStmt());1600S->setCollection(Record.readSubExpr());1601S->setBody(Record.readSubStmt());1602S->setForLoc(readSourceLocation());1603S->setRParenLoc(readSourceLocation());1604}16051606void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {1607VisitStmt(S);1608S->setCatchBody(Record.readSubStmt());1609S->setCatchParamDecl(readDeclAs<VarDecl>());1610S->setAtCatchLoc(readSourceLocation());1611S->setRParenLoc(readSourceLocation());1612}16131614void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {1615VisitStmt(S);1616S->setFinallyBody(Record.readSubStmt());1617S->setAtFinallyLoc(readSourceLocation());1618}16191620void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {1621VisitStmt(S); // FIXME: no test coverage.1622S->setSubStmt(Record.readSubStmt());1623S->setAtLoc(readSourceLocation());1624}16251626void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {1627VisitStmt(S);1628assert(Record.peekInt() == S->getNumCatchStmts());1629Record.skipInts(1);1630bool HasFinally = Record.readInt();1631S->setTryBody(Record.readSubStmt());1632for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)1633S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Record.readSubStmt()));16341635if (HasFinally)1636S->setFinallyStmt(Record.readSubStmt());1637S->setAtTryLoc(readSourceLocation());1638}16391640void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {1641VisitStmt(S); // FIXME: no test coverage.1642S->setSynchExpr(Record.readSubStmt());1643S->setSynchBody(Record.readSubStmt());1644S->setAtSynchronizedLoc(readSourceLocation());1645}16461647void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {1648VisitStmt(S); // FIXME: no test coverage.1649S->setThrowExpr(Record.readSubStmt());1650S->setThrowLoc(readSourceLocation());1651}16521653void ASTStmtReader::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {1654VisitExpr(E);1655E->setValue(Record.readInt());1656E->setLocation(readSourceLocation());1657}16581659void ASTStmtReader::VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr *E) {1660VisitExpr(E);1661SourceRange R = Record.readSourceRange();1662E->AtLoc = R.getBegin();1663E->RParen = R.getEnd();1664E->VersionToCheck = Record.readVersionTuple();1665}16661667//===----------------------------------------------------------------------===//1668// C++ Expressions and Statements1669//===----------------------------------------------------------------------===//16701671void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {1672VisitStmt(S);1673S->CatchLoc = readSourceLocation();1674S->ExceptionDecl = readDeclAs<VarDecl>();1675S->HandlerBlock = Record.readSubStmt();1676}16771678void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {1679VisitStmt(S);1680assert(Record.peekInt() == S->getNumHandlers() && "NumStmtFields is wrong ?");1681Record.skipInts(1);1682S->TryLoc = readSourceLocation();1683S->getStmts()[0] = Record.readSubStmt();1684for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)1685S->getStmts()[i + 1] = Record.readSubStmt();1686}16871688void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) {1689VisitStmt(S);1690S->ForLoc = readSourceLocation();1691S->CoawaitLoc = readSourceLocation();1692S->ColonLoc = readSourceLocation();1693S->RParenLoc = readSourceLocation();1694S->setInit(Record.readSubStmt());1695S->setRangeStmt(Record.readSubStmt());1696S->setBeginStmt(Record.readSubStmt());1697S->setEndStmt(Record.readSubStmt());1698S->setCond(Record.readSubExpr());1699S->setInc(Record.readSubExpr());1700S->setLoopVarStmt(Record.readSubStmt());1701S->setBody(Record.readSubStmt());1702}17031704void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {1705VisitStmt(S);1706S->KeywordLoc = readSourceLocation();1707S->IsIfExists = Record.readInt();1708S->QualifierLoc = Record.readNestedNameSpecifierLoc();1709S->NameInfo = Record.readDeclarationNameInfo();1710S->SubStmt = Record.readSubStmt();1711}17121713void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {1714VisitCallExpr(E);1715E->CXXOperatorCallExprBits.OperatorKind = Record.readInt();1716E->Range = Record.readSourceRange();1717}17181719void ASTStmtReader::VisitCXXRewrittenBinaryOperator(1720CXXRewrittenBinaryOperator *E) {1721VisitExpr(E);1722E->CXXRewrittenBinaryOperatorBits.IsReversed = Record.readInt();1723E->SemanticForm = Record.readSubExpr();1724}17251726void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {1727VisitExpr(E);17281729unsigned NumArgs = Record.readInt();1730assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!");17311732E->CXXConstructExprBits.Elidable = Record.readInt();1733E->CXXConstructExprBits.HadMultipleCandidates = Record.readInt();1734E->CXXConstructExprBits.ListInitialization = Record.readInt();1735E->CXXConstructExprBits.StdInitListInitialization = Record.readInt();1736E->CXXConstructExprBits.ZeroInitialization = Record.readInt();1737E->CXXConstructExprBits.ConstructionKind = Record.readInt();1738E->CXXConstructExprBits.IsImmediateEscalating = Record.readInt();1739E->CXXConstructExprBits.Loc = readSourceLocation();1740E->Constructor = readDeclAs<CXXConstructorDecl>();1741E->ParenOrBraceRange = readSourceRange();17421743for (unsigned I = 0; I != NumArgs; ++I)1744E->setArg(I, Record.readSubExpr());1745}17461747void ASTStmtReader::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {1748VisitExpr(E);1749E->Constructor = readDeclAs<CXXConstructorDecl>();1750E->Loc = readSourceLocation();1751E->ConstructsVirtualBase = Record.readInt();1752E->InheritedFromVirtualBase = Record.readInt();1753}17541755void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {1756VisitCXXConstructExpr(E);1757E->TSI = readTypeSourceInfo();1758}17591760void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) {1761VisitExpr(E);1762unsigned NumCaptures = Record.readInt();1763(void)NumCaptures;1764assert(NumCaptures == E->LambdaExprBits.NumCaptures);1765E->IntroducerRange = readSourceRange();1766E->LambdaExprBits.CaptureDefault = Record.readInt();1767E->CaptureDefaultLoc = readSourceLocation();1768E->LambdaExprBits.ExplicitParams = Record.readInt();1769E->LambdaExprBits.ExplicitResultType = Record.readInt();1770E->ClosingBrace = readSourceLocation();17711772// Read capture initializers.1773for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),1774CEnd = E->capture_init_end();1775C != CEnd; ++C)1776*C = Record.readSubExpr();17771778// The body will be lazily deserialized when needed from the call operator1779// declaration.1780}17811782void1783ASTStmtReader::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {1784VisitExpr(E);1785E->SubExpr = Record.readSubExpr();1786}17871788void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {1789VisitExplicitCastExpr(E);1790SourceRange R = readSourceRange();1791E->Loc = R.getBegin();1792E->RParenLoc = R.getEnd();1793if (CurrentUnpackingBits->getNextBit())1794E->AngleBrackets = readSourceRange();1795}17961797void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {1798return VisitCXXNamedCastExpr(E);1799}18001801void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {1802return VisitCXXNamedCastExpr(E);1803}18041805void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {1806return VisitCXXNamedCastExpr(E);1807}18081809void ASTStmtReader::VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {1810return VisitCXXNamedCastExpr(E);1811}18121813void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {1814return VisitCXXNamedCastExpr(E);1815}18161817void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {1818VisitExplicitCastExpr(E);1819E->setLParenLoc(readSourceLocation());1820E->setRParenLoc(readSourceLocation());1821}18221823void ASTStmtReader::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *E) {1824VisitExplicitCastExpr(E);1825E->KWLoc = readSourceLocation();1826E->RParenLoc = readSourceLocation();1827}18281829void ASTStmtReader::VisitUserDefinedLiteral(UserDefinedLiteral *E) {1830VisitCallExpr(E);1831E->UDSuffixLoc = readSourceLocation();1832}18331834void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {1835VisitExpr(E);1836E->setValue(Record.readInt());1837E->setLocation(readSourceLocation());1838}18391840void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {1841VisitExpr(E);1842E->setLocation(readSourceLocation());1843}18441845void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {1846VisitExpr(E);1847E->setSourceRange(readSourceRange());1848if (E->isTypeOperand())1849E->Operand = readTypeSourceInfo();1850else1851E->Operand = Record.readSubExpr();1852}18531854void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {1855VisitExpr(E);1856E->setLocation(readSourceLocation());1857E->setImplicit(Record.readInt());1858E->setCapturedByCopyInLambdaWithExplicitObjectParameter(Record.readInt());1859}18601861void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {1862VisitExpr(E);1863E->CXXThrowExprBits.ThrowLoc = readSourceLocation();1864E->Operand = Record.readSubExpr();1865E->CXXThrowExprBits.IsThrownVariableInScope = Record.readInt();1866}18671868void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {1869VisitExpr(E);1870E->Param = readDeclAs<ParmVarDecl>();1871E->UsedContext = readDeclAs<DeclContext>();1872E->CXXDefaultArgExprBits.Loc = readSourceLocation();1873E->CXXDefaultArgExprBits.HasRewrittenInit = Record.readInt();1874if (E->CXXDefaultArgExprBits.HasRewrittenInit)1875*E->getTrailingObjects<Expr *>() = Record.readSubExpr();1876}18771878void ASTStmtReader::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {1879VisitExpr(E);1880E->CXXDefaultInitExprBits.HasRewrittenInit = Record.readInt();1881E->Field = readDeclAs<FieldDecl>();1882E->UsedContext = readDeclAs<DeclContext>();1883E->CXXDefaultInitExprBits.Loc = readSourceLocation();1884if (E->CXXDefaultInitExprBits.HasRewrittenInit)1885*E->getTrailingObjects<Expr *>() = Record.readSubExpr();1886}18871888void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {1889VisitExpr(E);1890E->setTemporary(Record.readCXXTemporary());1891E->setSubExpr(Record.readSubExpr());1892}18931894void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {1895VisitExpr(E);1896E->TypeInfo = readTypeSourceInfo();1897E->CXXScalarValueInitExprBits.RParenLoc = readSourceLocation();1898}18991900void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {1901VisitExpr(E);19021903bool IsArray = Record.readInt();1904bool HasInit = Record.readInt();1905unsigned NumPlacementArgs = Record.readInt();1906bool IsParenTypeId = Record.readInt();19071908E->CXXNewExprBits.IsGlobalNew = Record.readInt();1909E->CXXNewExprBits.ShouldPassAlignment = Record.readInt();1910E->CXXNewExprBits.UsualArrayDeleteWantsSize = Record.readInt();1911E->CXXNewExprBits.HasInitializer = Record.readInt();1912E->CXXNewExprBits.StoredInitializationStyle = Record.readInt();19131914assert((IsArray == E->isArray()) && "Wrong IsArray!");1915assert((HasInit == E->hasInitializer()) && "Wrong HasInit!");1916assert((NumPlacementArgs == E->getNumPlacementArgs()) &&1917"Wrong NumPlacementArgs!");1918assert((IsParenTypeId == E->isParenTypeId()) && "Wrong IsParenTypeId!");1919(void)IsArray;1920(void)HasInit;1921(void)NumPlacementArgs;19221923E->setOperatorNew(readDeclAs<FunctionDecl>());1924E->setOperatorDelete(readDeclAs<FunctionDecl>());1925E->AllocatedTypeInfo = readTypeSourceInfo();1926if (IsParenTypeId)1927E->getTrailingObjects<SourceRange>()[0] = readSourceRange();1928E->Range = readSourceRange();1929E->DirectInitRange = readSourceRange();19301931// Install all the subexpressions.1932for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),1933N = E->raw_arg_end();1934I != N; ++I)1935*I = Record.readSubStmt();1936}19371938void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {1939VisitExpr(E);1940E->CXXDeleteExprBits.GlobalDelete = Record.readInt();1941E->CXXDeleteExprBits.ArrayForm = Record.readInt();1942E->CXXDeleteExprBits.ArrayFormAsWritten = Record.readInt();1943E->CXXDeleteExprBits.UsualArrayDeleteWantsSize = Record.readInt();1944E->OperatorDelete = readDeclAs<FunctionDecl>();1945E->Argument = Record.readSubExpr();1946E->CXXDeleteExprBits.Loc = readSourceLocation();1947}19481949void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {1950VisitExpr(E);19511952E->Base = Record.readSubExpr();1953E->IsArrow = Record.readInt();1954E->OperatorLoc = readSourceLocation();1955E->QualifierLoc = Record.readNestedNameSpecifierLoc();1956E->ScopeType = readTypeSourceInfo();1957E->ColonColonLoc = readSourceLocation();1958E->TildeLoc = readSourceLocation();19591960IdentifierInfo *II = Record.readIdentifier();1961if (II)1962E->setDestroyedType(II, readSourceLocation());1963else1964E->setDestroyedType(readTypeSourceInfo());1965}19661967void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) {1968VisitExpr(E);19691970unsigned NumObjects = Record.readInt();1971assert(NumObjects == E->getNumObjects());1972for (unsigned i = 0; i != NumObjects; ++i) {1973unsigned CleanupKind = Record.readInt();1974ExprWithCleanups::CleanupObject Obj;1975if (CleanupKind == COK_Block)1976Obj = readDeclAs<BlockDecl>();1977else if (CleanupKind == COK_CompoundLiteral)1978Obj = cast<CompoundLiteralExpr>(Record.readSubExpr());1979else1980llvm_unreachable("unexpected cleanup object type");1981E->getTrailingObjects<ExprWithCleanups::CleanupObject>()[i] = Obj;1982}19831984E->ExprWithCleanupsBits.CleanupsHaveSideEffects = Record.readInt();1985E->SubExpr = Record.readSubExpr();1986}19871988void ASTStmtReader::VisitCXXDependentScopeMemberExpr(1989CXXDependentScopeMemberExpr *E) {1990VisitExpr(E);19911992unsigned NumTemplateArgs = Record.readInt();1993CurrentUnpackingBits.emplace(Record.readInt());1994bool HasTemplateKWAndArgsInfo = CurrentUnpackingBits->getNextBit();1995bool HasFirstQualifierFoundInScope = CurrentUnpackingBits->getNextBit();19961997assert((HasTemplateKWAndArgsInfo == E->hasTemplateKWAndArgsInfo()) &&1998"Wrong HasTemplateKWAndArgsInfo!");1999assert(2000(HasFirstQualifierFoundInScope == E->hasFirstQualifierFoundInScope()) &&2001"Wrong HasFirstQualifierFoundInScope!");20022003if (HasTemplateKWAndArgsInfo)2004ReadTemplateKWAndArgsInfo(2005*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),2006E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs);20072008assert((NumTemplateArgs == E->getNumTemplateArgs()) &&2009"Wrong NumTemplateArgs!");20102011E->CXXDependentScopeMemberExprBits.IsArrow =2012CurrentUnpackingBits->getNextBit();20132014E->BaseType = Record.readType();2015E->QualifierLoc = Record.readNestedNameSpecifierLoc();2016// not ImplicitAccess2017if (CurrentUnpackingBits->getNextBit())2018E->Base = Record.readSubExpr();2019else2020E->Base = nullptr;20212022E->CXXDependentScopeMemberExprBits.OperatorLoc = readSourceLocation();20232024if (HasFirstQualifierFoundInScope)2025*E->getTrailingObjects<NamedDecl *>() = readDeclAs<NamedDecl>();20262027E->MemberNameInfo = Record.readDeclarationNameInfo();2028}20292030void2031ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {2032VisitExpr(E);20332034if (CurrentUnpackingBits->getNextBit()) // HasTemplateKWAndArgsInfo2035ReadTemplateKWAndArgsInfo(2036*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),2037E->getTrailingObjects<TemplateArgumentLoc>(),2038/*NumTemplateArgs=*/CurrentUnpackingBits->getNextBits(/*Width=*/16));20392040E->QualifierLoc = Record.readNestedNameSpecifierLoc();2041E->NameInfo = Record.readDeclarationNameInfo();2042}20432044void2045ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {2046VisitExpr(E);2047assert(Record.peekInt() == E->getNumArgs() &&2048"Read wrong record during creation ?");2049Record.skipInts(1);2050for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)2051E->setArg(I, Record.readSubExpr());2052E->TypeAndInitForm.setPointer(readTypeSourceInfo());2053E->setLParenLoc(readSourceLocation());2054E->setRParenLoc(readSourceLocation());2055E->TypeAndInitForm.setInt(Record.readInt());2056}20572058void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {2059VisitExpr(E);20602061unsigned NumResults = Record.readInt();2062CurrentUnpackingBits.emplace(Record.readInt());2063bool HasTemplateKWAndArgsInfo = CurrentUnpackingBits->getNextBit();2064assert((E->getNumDecls() == NumResults) && "Wrong NumResults!");2065assert((E->hasTemplateKWAndArgsInfo() == HasTemplateKWAndArgsInfo) &&2066"Wrong HasTemplateKWAndArgsInfo!");20672068if (HasTemplateKWAndArgsInfo) {2069unsigned NumTemplateArgs = Record.readInt();2070ReadTemplateKWAndArgsInfo(*E->getTrailingASTTemplateKWAndArgsInfo(),2071E->getTrailingTemplateArgumentLoc(),2072NumTemplateArgs);2073assert((E->getNumTemplateArgs() == NumTemplateArgs) &&2074"Wrong NumTemplateArgs!");2075}20762077UnresolvedSet<8> Decls;2078for (unsigned I = 0; I != NumResults; ++I) {2079auto *D = readDeclAs<NamedDecl>();2080auto AS = (AccessSpecifier)Record.readInt();2081Decls.addDecl(D, AS);2082}20832084DeclAccessPair *Results = E->getTrailingResults();2085UnresolvedSetIterator Iter = Decls.begin();2086for (unsigned I = 0; I != NumResults; ++I) {2087Results[I] = (Iter + I).getPair();2088}20892090E->NameInfo = Record.readDeclarationNameInfo();2091E->QualifierLoc = Record.readNestedNameSpecifierLoc();2092}20932094void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {2095VisitOverloadExpr(E);2096E->UnresolvedMemberExprBits.IsArrow = CurrentUnpackingBits->getNextBit();2097E->UnresolvedMemberExprBits.HasUnresolvedUsing =2098CurrentUnpackingBits->getNextBit();20992100if (/*!isImplicitAccess=*/CurrentUnpackingBits->getNextBit())2101E->Base = Record.readSubExpr();2102else2103E->Base = nullptr;21042105E->OperatorLoc = readSourceLocation();21062107E->BaseType = Record.readType();2108}21092110void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {2111VisitOverloadExpr(E);2112E->UnresolvedLookupExprBits.RequiresADL = CurrentUnpackingBits->getNextBit();2113E->NamingClass = readDeclAs<CXXRecordDecl>();2114}21152116void ASTStmtReader::VisitTypeTraitExpr(TypeTraitExpr *E) {2117VisitExpr(E);2118E->TypeTraitExprBits.NumArgs = Record.readInt();2119E->TypeTraitExprBits.Kind = Record.readInt();2120E->TypeTraitExprBits.Value = Record.readInt();2121SourceRange Range = readSourceRange();2122E->Loc = Range.getBegin();2123E->RParenLoc = Range.getEnd();21242125auto **Args = E->getTrailingObjects<TypeSourceInfo *>();2126for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)2127Args[I] = readTypeSourceInfo();2128}21292130void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {2131VisitExpr(E);2132E->ATT = (ArrayTypeTrait)Record.readInt();2133E->Value = (unsigned int)Record.readInt();2134SourceRange Range = readSourceRange();2135E->Loc = Range.getBegin();2136E->RParen = Range.getEnd();2137E->QueriedType = readTypeSourceInfo();2138E->Dimension = Record.readSubExpr();2139}21402141void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {2142VisitExpr(E);2143E->ET = (ExpressionTrait)Record.readInt();2144E->Value = (bool)Record.readInt();2145SourceRange Range = readSourceRange();2146E->QueriedExpression = Record.readSubExpr();2147E->Loc = Range.getBegin();2148E->RParen = Range.getEnd();2149}21502151void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {2152VisitExpr(E);2153E->CXXNoexceptExprBits.Value = Record.readInt();2154E->Range = readSourceRange();2155E->Operand = Record.readSubExpr();2156}21572158void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) {2159VisitExpr(E);2160E->EllipsisLoc = readSourceLocation();2161E->NumExpansions = Record.readInt();2162E->Pattern = Record.readSubExpr();2163}21642165void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {2166VisitExpr(E);2167unsigned NumPartialArgs = Record.readInt();2168E->OperatorLoc = readSourceLocation();2169E->PackLoc = readSourceLocation();2170E->RParenLoc = readSourceLocation();2171E->Pack = Record.readDeclAs<NamedDecl>();2172if (E->isPartiallySubstituted()) {2173assert(E->Length == NumPartialArgs);2174for (auto *I = E->getTrailingObjects<TemplateArgument>(),2175*E = I + NumPartialArgs;2176I != E; ++I)2177new (I) TemplateArgument(Record.readTemplateArgument());2178} else if (!E->isValueDependent()) {2179E->Length = Record.readInt();2180}2181}21822183void ASTStmtReader::VisitPackIndexingExpr(PackIndexingExpr *E) {2184VisitExpr(E);2185E->TransformedExpressions = Record.readInt();2186E->ExpandedToEmptyPack = Record.readInt();2187E->EllipsisLoc = readSourceLocation();2188E->RSquareLoc = readSourceLocation();2189E->SubExprs[0] = Record.readStmt();2190E->SubExprs[1] = Record.readStmt();2191auto **Exprs = E->getTrailingObjects<Expr *>();2192for (unsigned I = 0; I < E->TransformedExpressions; ++I)2193Exprs[I] = Record.readExpr();2194}21952196void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr(2197SubstNonTypeTemplateParmExpr *E) {2198VisitExpr(E);2199E->AssociatedDeclAndRef.setPointer(readDeclAs<Decl>());2200E->AssociatedDeclAndRef.setInt(CurrentUnpackingBits->getNextBit());2201E->Index = CurrentUnpackingBits->getNextBits(/*Width=*/12);2202if (CurrentUnpackingBits->getNextBit())2203E->PackIndex = Record.readInt();2204else2205E->PackIndex = 0;2206E->SubstNonTypeTemplateParmExprBits.NameLoc = readSourceLocation();2207E->Replacement = Record.readSubExpr();2208}22092210void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(2211SubstNonTypeTemplateParmPackExpr *E) {2212VisitExpr(E);2213E->AssociatedDecl = readDeclAs<Decl>();2214E->Index = Record.readInt();2215TemplateArgument ArgPack = Record.readTemplateArgument();2216if (ArgPack.getKind() != TemplateArgument::Pack)2217return;22182219E->Arguments = ArgPack.pack_begin();2220E->NumArguments = ArgPack.pack_size();2221E->NameLoc = readSourceLocation();2222}22232224void ASTStmtReader::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {2225VisitExpr(E);2226E->NumParameters = Record.readInt();2227E->ParamPack = readDeclAs<ParmVarDecl>();2228E->NameLoc = readSourceLocation();2229auto **Parms = E->getTrailingObjects<VarDecl *>();2230for (unsigned i = 0, n = E->NumParameters; i != n; ++i)2231Parms[i] = readDeclAs<VarDecl>();2232}22332234void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {2235VisitExpr(E);2236bool HasMaterialzedDecl = Record.readInt();2237if (HasMaterialzedDecl)2238E->State = cast<LifetimeExtendedTemporaryDecl>(Record.readDecl());2239else2240E->State = Record.readSubExpr();2241}22422243void ASTStmtReader::VisitCXXFoldExpr(CXXFoldExpr *E) {2244VisitExpr(E);2245E->LParenLoc = readSourceLocation();2246E->EllipsisLoc = readSourceLocation();2247E->RParenLoc = readSourceLocation();2248E->NumExpansions = Record.readInt();2249E->SubExprs[0] = Record.readSubExpr();2250E->SubExprs[1] = Record.readSubExpr();2251E->SubExprs[2] = Record.readSubExpr();2252E->Opcode = (BinaryOperatorKind)Record.readInt();2253}22542255void ASTStmtReader::VisitCXXParenListInitExpr(CXXParenListInitExpr *E) {2256VisitExpr(E);2257unsigned ExpectedNumExprs = Record.readInt();2258assert(E->NumExprs == ExpectedNumExprs &&2259"expected number of expressions does not equal the actual number of "2260"serialized expressions.");2261E->NumUserSpecifiedExprs = Record.readInt();2262E->InitLoc = readSourceLocation();2263E->LParenLoc = readSourceLocation();2264E->RParenLoc = readSourceLocation();2265for (unsigned I = 0; I < ExpectedNumExprs; I++)2266E->getTrailingObjects<Expr *>()[I] = Record.readSubExpr();22672268bool HasArrayFillerOrUnionDecl = Record.readBool();2269if (HasArrayFillerOrUnionDecl) {2270bool HasArrayFiller = Record.readBool();2271if (HasArrayFiller) {2272E->setArrayFiller(Record.readSubExpr());2273} else {2274E->setInitializedFieldInUnion(readDeclAs<FieldDecl>());2275}2276}2277E->updateDependence();2278}22792280void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {2281VisitExpr(E);2282E->SourceExpr = Record.readSubExpr();2283E->OpaqueValueExprBits.Loc = readSourceLocation();2284E->setIsUnique(Record.readInt());2285}22862287void ASTStmtReader::VisitTypoExpr(TypoExpr *E) {2288llvm_unreachable("Cannot read TypoExpr nodes");2289}22902291void ASTStmtReader::VisitRecoveryExpr(RecoveryExpr *E) {2292VisitExpr(E);2293unsigned NumArgs = Record.readInt();2294E->BeginLoc = readSourceLocation();2295E->EndLoc = readSourceLocation();2296assert((NumArgs + 0LL ==2297std::distance(E->children().begin(), E->children().end())) &&2298"Wrong NumArgs!");2299(void)NumArgs;2300for (Stmt *&Child : E->children())2301Child = Record.readSubStmt();2302}23032304//===----------------------------------------------------------------------===//2305// Microsoft Expressions and Statements2306//===----------------------------------------------------------------------===//2307void ASTStmtReader::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {2308VisitExpr(E);2309E->IsArrow = (Record.readInt() != 0);2310E->BaseExpr = Record.readSubExpr();2311E->QualifierLoc = Record.readNestedNameSpecifierLoc();2312E->MemberLoc = readSourceLocation();2313E->TheDecl = readDeclAs<MSPropertyDecl>();2314}23152316void ASTStmtReader::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) {2317VisitExpr(E);2318E->setBase(Record.readSubExpr());2319E->setIdx(Record.readSubExpr());2320E->setRBracketLoc(readSourceLocation());2321}23222323void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {2324VisitExpr(E);2325E->setSourceRange(readSourceRange());2326E->Guid = readDeclAs<MSGuidDecl>();2327if (E->isTypeOperand())2328E->Operand = readTypeSourceInfo();2329else2330E->Operand = Record.readSubExpr();2331}23322333void ASTStmtReader::VisitSEHLeaveStmt(SEHLeaveStmt *S) {2334VisitStmt(S);2335S->setLeaveLoc(readSourceLocation());2336}23372338void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) {2339VisitStmt(S);2340S->Loc = readSourceLocation();2341S->Children[SEHExceptStmt::FILTER_EXPR] = Record.readSubStmt();2342S->Children[SEHExceptStmt::BLOCK] = Record.readSubStmt();2343}23442345void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) {2346VisitStmt(S);2347S->Loc = readSourceLocation();2348S->Block = Record.readSubStmt();2349}23502351void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) {2352VisitStmt(S);2353S->IsCXXTry = Record.readInt();2354S->TryLoc = readSourceLocation();2355S->Children[SEHTryStmt::TRY] = Record.readSubStmt();2356S->Children[SEHTryStmt::HANDLER] = Record.readSubStmt();2357}23582359//===----------------------------------------------------------------------===//2360// CUDA Expressions and Statements2361//===----------------------------------------------------------------------===//23622363void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {2364VisitCallExpr(E);2365E->setPreArg(CUDAKernelCallExpr::CONFIG, Record.readSubExpr());2366}23672368//===----------------------------------------------------------------------===//2369// OpenCL Expressions and Statements.2370//===----------------------------------------------------------------------===//2371void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {2372VisitExpr(E);2373E->BuiltinLoc = readSourceLocation();2374E->RParenLoc = readSourceLocation();2375E->SrcExpr = Record.readSubExpr();2376}23772378//===----------------------------------------------------------------------===//2379// OpenMP Directives.2380//===----------------------------------------------------------------------===//23812382void ASTStmtReader::VisitOMPCanonicalLoop(OMPCanonicalLoop *S) {2383VisitStmt(S);2384for (Stmt *&SubStmt : S->SubStmts)2385SubStmt = Record.readSubStmt();2386}23872388void ASTStmtReader::VisitOMPExecutableDirective(OMPExecutableDirective *E) {2389Record.readOMPChildren(E->Data);2390E->setLocStart(readSourceLocation());2391E->setLocEnd(readSourceLocation());2392E->setMappedDirective(Record.readEnum<OpenMPDirectiveKind>());2393}23942395void ASTStmtReader::VisitOMPLoopBasedDirective(OMPLoopBasedDirective *D) {2396VisitStmt(D);2397// Field CollapsedNum was read in ReadStmtFromStream.2398Record.skipInts(1);2399VisitOMPExecutableDirective(D);2400}24012402void ASTStmtReader::VisitOMPLoopDirective(OMPLoopDirective *D) {2403VisitOMPLoopBasedDirective(D);2404}24052406void ASTStmtReader::VisitOMPMetaDirective(OMPMetaDirective *D) {2407VisitStmt(D);2408// The NumClauses field was read in ReadStmtFromStream.2409Record.skipInts(1);2410VisitOMPExecutableDirective(D);2411}24122413void ASTStmtReader::VisitOMPParallelDirective(OMPParallelDirective *D) {2414VisitStmt(D);2415VisitOMPExecutableDirective(D);2416D->setHasCancel(Record.readBool());2417}24182419void ASTStmtReader::VisitOMPSimdDirective(OMPSimdDirective *D) {2420VisitOMPLoopDirective(D);2421}24222423void ASTStmtReader::VisitOMPLoopTransformationDirective(2424OMPLoopTransformationDirective *D) {2425VisitOMPLoopBasedDirective(D);2426D->setNumGeneratedLoops(Record.readUInt32());2427}24282429void ASTStmtReader::VisitOMPTileDirective(OMPTileDirective *D) {2430VisitOMPLoopTransformationDirective(D);2431}24322433void ASTStmtReader::VisitOMPUnrollDirective(OMPUnrollDirective *D) {2434VisitOMPLoopTransformationDirective(D);2435}24362437void ASTStmtReader::VisitOMPReverseDirective(OMPReverseDirective *D) {2438VisitOMPLoopTransformationDirective(D);2439}24402441void ASTStmtReader::VisitOMPInterchangeDirective(OMPInterchangeDirective *D) {2442VisitOMPLoopTransformationDirective(D);2443}24442445void ASTStmtReader::VisitOMPForDirective(OMPForDirective *D) {2446VisitOMPLoopDirective(D);2447D->setHasCancel(Record.readBool());2448}24492450void ASTStmtReader::VisitOMPForSimdDirective(OMPForSimdDirective *D) {2451VisitOMPLoopDirective(D);2452}24532454void ASTStmtReader::VisitOMPSectionsDirective(OMPSectionsDirective *D) {2455VisitStmt(D);2456VisitOMPExecutableDirective(D);2457D->setHasCancel(Record.readBool());2458}24592460void ASTStmtReader::VisitOMPSectionDirective(OMPSectionDirective *D) {2461VisitStmt(D);2462VisitOMPExecutableDirective(D);2463D->setHasCancel(Record.readBool());2464}24652466void ASTStmtReader::VisitOMPScopeDirective(OMPScopeDirective *D) {2467VisitStmt(D);2468VisitOMPExecutableDirective(D);2469}24702471void ASTStmtReader::VisitOMPSingleDirective(OMPSingleDirective *D) {2472VisitStmt(D);2473VisitOMPExecutableDirective(D);2474}24752476void ASTStmtReader::VisitOMPMasterDirective(OMPMasterDirective *D) {2477VisitStmt(D);2478VisitOMPExecutableDirective(D);2479}24802481void ASTStmtReader::VisitOMPCriticalDirective(OMPCriticalDirective *D) {2482VisitStmt(D);2483VisitOMPExecutableDirective(D);2484D->DirName = Record.readDeclarationNameInfo();2485}24862487void ASTStmtReader::VisitOMPParallelForDirective(OMPParallelForDirective *D) {2488VisitOMPLoopDirective(D);2489D->setHasCancel(Record.readBool());2490}24912492void ASTStmtReader::VisitOMPParallelForSimdDirective(2493OMPParallelForSimdDirective *D) {2494VisitOMPLoopDirective(D);2495}24962497void ASTStmtReader::VisitOMPParallelMasterDirective(2498OMPParallelMasterDirective *D) {2499VisitStmt(D);2500VisitOMPExecutableDirective(D);2501}25022503void ASTStmtReader::VisitOMPParallelMaskedDirective(2504OMPParallelMaskedDirective *D) {2505VisitStmt(D);2506VisitOMPExecutableDirective(D);2507}25082509void ASTStmtReader::VisitOMPParallelSectionsDirective(2510OMPParallelSectionsDirective *D) {2511VisitStmt(D);2512VisitOMPExecutableDirective(D);2513D->setHasCancel(Record.readBool());2514}25152516void ASTStmtReader::VisitOMPTaskDirective(OMPTaskDirective *D) {2517VisitStmt(D);2518VisitOMPExecutableDirective(D);2519D->setHasCancel(Record.readBool());2520}25212522void ASTStmtReader::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) {2523VisitStmt(D);2524VisitOMPExecutableDirective(D);2525}25262527void ASTStmtReader::VisitOMPBarrierDirective(OMPBarrierDirective *D) {2528VisitStmt(D);2529VisitOMPExecutableDirective(D);2530}25312532void ASTStmtReader::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) {2533VisitStmt(D);2534// The NumClauses field was read in ReadStmtFromStream.2535Record.skipInts(1);2536VisitOMPExecutableDirective(D);2537}25382539void ASTStmtReader::VisitOMPErrorDirective(OMPErrorDirective *D) {2540VisitStmt(D);2541// The NumClauses field was read in ReadStmtFromStream.2542Record.skipInts(1);2543VisitOMPExecutableDirective(D);2544}25452546void ASTStmtReader::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) {2547VisitStmt(D);2548VisitOMPExecutableDirective(D);2549}25502551void ASTStmtReader::VisitOMPFlushDirective(OMPFlushDirective *D) {2552VisitStmt(D);2553VisitOMPExecutableDirective(D);2554}25552556void ASTStmtReader::VisitOMPDepobjDirective(OMPDepobjDirective *D) {2557VisitStmt(D);2558VisitOMPExecutableDirective(D);2559}25602561void ASTStmtReader::VisitOMPScanDirective(OMPScanDirective *D) {2562VisitStmt(D);2563VisitOMPExecutableDirective(D);2564}25652566void ASTStmtReader::VisitOMPOrderedDirective(OMPOrderedDirective *D) {2567VisitStmt(D);2568VisitOMPExecutableDirective(D);2569}25702571void ASTStmtReader::VisitOMPAtomicDirective(OMPAtomicDirective *D) {2572VisitStmt(D);2573VisitOMPExecutableDirective(D);2574D->Flags.IsXLHSInRHSPart = Record.readBool() ? 1 : 0;2575D->Flags.IsPostfixUpdate = Record.readBool() ? 1 : 0;2576D->Flags.IsFailOnly = Record.readBool() ? 1 : 0;2577}25782579void ASTStmtReader::VisitOMPTargetDirective(OMPTargetDirective *D) {2580VisitStmt(D);2581VisitOMPExecutableDirective(D);2582}25832584void ASTStmtReader::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) {2585VisitStmt(D);2586VisitOMPExecutableDirective(D);2587}25882589void ASTStmtReader::VisitOMPTargetEnterDataDirective(2590OMPTargetEnterDataDirective *D) {2591VisitStmt(D);2592VisitOMPExecutableDirective(D);2593}25942595void ASTStmtReader::VisitOMPTargetExitDataDirective(2596OMPTargetExitDataDirective *D) {2597VisitStmt(D);2598VisitOMPExecutableDirective(D);2599}26002601void ASTStmtReader::VisitOMPTargetParallelDirective(2602OMPTargetParallelDirective *D) {2603VisitStmt(D);2604VisitOMPExecutableDirective(D);2605D->setHasCancel(Record.readBool());2606}26072608void ASTStmtReader::VisitOMPTargetParallelForDirective(2609OMPTargetParallelForDirective *D) {2610VisitOMPLoopDirective(D);2611D->setHasCancel(Record.readBool());2612}26132614void ASTStmtReader::VisitOMPTeamsDirective(OMPTeamsDirective *D) {2615VisitStmt(D);2616VisitOMPExecutableDirective(D);2617}26182619void ASTStmtReader::VisitOMPCancellationPointDirective(2620OMPCancellationPointDirective *D) {2621VisitStmt(D);2622VisitOMPExecutableDirective(D);2623D->setCancelRegion(Record.readEnum<OpenMPDirectiveKind>());2624}26252626void ASTStmtReader::VisitOMPCancelDirective(OMPCancelDirective *D) {2627VisitStmt(D);2628VisitOMPExecutableDirective(D);2629D->setCancelRegion(Record.readEnum<OpenMPDirectiveKind>());2630}26312632void ASTStmtReader::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) {2633VisitOMPLoopDirective(D);2634D->setHasCancel(Record.readBool());2635}26362637void ASTStmtReader::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) {2638VisitOMPLoopDirective(D);2639}26402641void ASTStmtReader::VisitOMPMasterTaskLoopDirective(2642OMPMasterTaskLoopDirective *D) {2643VisitOMPLoopDirective(D);2644D->setHasCancel(Record.readBool());2645}26462647void ASTStmtReader::VisitOMPMaskedTaskLoopDirective(2648OMPMaskedTaskLoopDirective *D) {2649VisitOMPLoopDirective(D);2650D->setHasCancel(Record.readBool());2651}26522653void ASTStmtReader::VisitOMPMasterTaskLoopSimdDirective(2654OMPMasterTaskLoopSimdDirective *D) {2655VisitOMPLoopDirective(D);2656}26572658void ASTStmtReader::VisitOMPMaskedTaskLoopSimdDirective(2659OMPMaskedTaskLoopSimdDirective *D) {2660VisitOMPLoopDirective(D);2661}26622663void ASTStmtReader::VisitOMPParallelMasterTaskLoopDirective(2664OMPParallelMasterTaskLoopDirective *D) {2665VisitOMPLoopDirective(D);2666D->setHasCancel(Record.readBool());2667}26682669void ASTStmtReader::VisitOMPParallelMaskedTaskLoopDirective(2670OMPParallelMaskedTaskLoopDirective *D) {2671VisitOMPLoopDirective(D);2672D->setHasCancel(Record.readBool());2673}26742675void ASTStmtReader::VisitOMPParallelMasterTaskLoopSimdDirective(2676OMPParallelMasterTaskLoopSimdDirective *D) {2677VisitOMPLoopDirective(D);2678}26792680void ASTStmtReader::VisitOMPParallelMaskedTaskLoopSimdDirective(2681OMPParallelMaskedTaskLoopSimdDirective *D) {2682VisitOMPLoopDirective(D);2683}26842685void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective *D) {2686VisitOMPLoopDirective(D);2687}26882689void ASTStmtReader::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) {2690VisitStmt(D);2691VisitOMPExecutableDirective(D);2692}26932694void ASTStmtReader::VisitOMPDistributeParallelForDirective(2695OMPDistributeParallelForDirective *D) {2696VisitOMPLoopDirective(D);2697D->setHasCancel(Record.readBool());2698}26992700void ASTStmtReader::VisitOMPDistributeParallelForSimdDirective(2701OMPDistributeParallelForSimdDirective *D) {2702VisitOMPLoopDirective(D);2703}27042705void ASTStmtReader::VisitOMPDistributeSimdDirective(2706OMPDistributeSimdDirective *D) {2707VisitOMPLoopDirective(D);2708}27092710void ASTStmtReader::VisitOMPTargetParallelForSimdDirective(2711OMPTargetParallelForSimdDirective *D) {2712VisitOMPLoopDirective(D);2713}27142715void ASTStmtReader::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *D) {2716VisitOMPLoopDirective(D);2717}27182719void ASTStmtReader::VisitOMPTeamsDistributeDirective(2720OMPTeamsDistributeDirective *D) {2721VisitOMPLoopDirective(D);2722}27232724void ASTStmtReader::VisitOMPTeamsDistributeSimdDirective(2725OMPTeamsDistributeSimdDirective *D) {2726VisitOMPLoopDirective(D);2727}27282729void ASTStmtReader::VisitOMPTeamsDistributeParallelForSimdDirective(2730OMPTeamsDistributeParallelForSimdDirective *D) {2731VisitOMPLoopDirective(D);2732}27332734void ASTStmtReader::VisitOMPTeamsDistributeParallelForDirective(2735OMPTeamsDistributeParallelForDirective *D) {2736VisitOMPLoopDirective(D);2737D->setHasCancel(Record.readBool());2738}27392740void ASTStmtReader::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *D) {2741VisitStmt(D);2742VisitOMPExecutableDirective(D);2743}27442745void ASTStmtReader::VisitOMPTargetTeamsDistributeDirective(2746OMPTargetTeamsDistributeDirective *D) {2747VisitOMPLoopDirective(D);2748}27492750void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForDirective(2751OMPTargetTeamsDistributeParallelForDirective *D) {2752VisitOMPLoopDirective(D);2753D->setHasCancel(Record.readBool());2754}27552756void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForSimdDirective(2757OMPTargetTeamsDistributeParallelForSimdDirective *D) {2758VisitOMPLoopDirective(D);2759}27602761void ASTStmtReader::VisitOMPTargetTeamsDistributeSimdDirective(2762OMPTargetTeamsDistributeSimdDirective *D) {2763VisitOMPLoopDirective(D);2764}27652766void ASTStmtReader::VisitOMPInteropDirective(OMPInteropDirective *D) {2767VisitStmt(D);2768VisitOMPExecutableDirective(D);2769}27702771void ASTStmtReader::VisitOMPDispatchDirective(OMPDispatchDirective *D) {2772VisitStmt(D);2773VisitOMPExecutableDirective(D);2774D->setTargetCallLoc(Record.readSourceLocation());2775}27762777void ASTStmtReader::VisitOMPMaskedDirective(OMPMaskedDirective *D) {2778VisitStmt(D);2779VisitOMPExecutableDirective(D);2780}27812782void ASTStmtReader::VisitOMPGenericLoopDirective(OMPGenericLoopDirective *D) {2783VisitOMPLoopDirective(D);2784}27852786void ASTStmtReader::VisitOMPTeamsGenericLoopDirective(2787OMPTeamsGenericLoopDirective *D) {2788VisitOMPLoopDirective(D);2789}27902791void ASTStmtReader::VisitOMPTargetTeamsGenericLoopDirective(2792OMPTargetTeamsGenericLoopDirective *D) {2793VisitOMPLoopDirective(D);2794D->setCanBeParallelFor(Record.readBool());2795}27962797void ASTStmtReader::VisitOMPParallelGenericLoopDirective(2798OMPParallelGenericLoopDirective *D) {2799VisitOMPLoopDirective(D);2800}28012802void ASTStmtReader::VisitOMPTargetParallelGenericLoopDirective(2803OMPTargetParallelGenericLoopDirective *D) {2804VisitOMPLoopDirective(D);2805}28062807//===----------------------------------------------------------------------===//2808// OpenACC Constructs/Directives.2809//===----------------------------------------------------------------------===//2810void ASTStmtReader::VisitOpenACCConstructStmt(OpenACCConstructStmt *S) {2811(void)Record.readInt();2812S->Kind = Record.readEnum<OpenACCDirectiveKind>();2813S->Range = Record.readSourceRange();2814S->DirectiveLoc = Record.readSourceLocation();2815Record.readOpenACCClauseList(S->Clauses);2816}28172818void ASTStmtReader::VisitOpenACCAssociatedStmtConstruct(2819OpenACCAssociatedStmtConstruct *S) {2820VisitOpenACCConstructStmt(S);2821S->setAssociatedStmt(Record.readSubStmt());2822}28232824void ASTStmtReader::VisitOpenACCComputeConstruct(OpenACCComputeConstruct *S) {2825VisitStmt(S);2826VisitOpenACCAssociatedStmtConstruct(S);2827S->findAndSetChildLoops();2828}28292830void ASTStmtReader::VisitOpenACCLoopConstruct(OpenACCLoopConstruct *S) {2831VisitStmt(S);2832VisitOpenACCAssociatedStmtConstruct(S);2833}28342835//===----------------------------------------------------------------------===//2836// ASTReader Implementation2837//===----------------------------------------------------------------------===//28382839Stmt *ASTReader::ReadStmt(ModuleFile &F) {2840switch (ReadingKind) {2841case Read_None:2842llvm_unreachable("should not call this when not reading anything");2843case Read_Decl:2844case Read_Type:2845return ReadStmtFromStream(F);2846case Read_Stmt:2847return ReadSubStmt();2848}28492850llvm_unreachable("ReadingKind not set ?");2851}28522853Expr *ASTReader::ReadExpr(ModuleFile &F) {2854return cast_or_null<Expr>(ReadStmt(F));2855}28562857Expr *ASTReader::ReadSubExpr() {2858return cast_or_null<Expr>(ReadSubStmt());2859}28602861// Within the bitstream, expressions are stored in Reverse Polish2862// Notation, with each of the subexpressions preceding the2863// expression they are stored in. Subexpressions are stored from last to first.2864// To evaluate expressions, we continue reading expressions and placing them on2865// the stack, with expressions having operands removing those operands from the2866// stack. Evaluation terminates when we see a STMT_STOP record, and2867// the single remaining expression on the stack is our result.2868Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {2869ReadingKindTracker ReadingKind(Read_Stmt, *this);2870llvm::BitstreamCursor &Cursor = F.DeclsCursor;28712872// Map of offset to previously deserialized stmt. The offset points2873// just after the stmt record.2874llvm::DenseMap<uint64_t, Stmt *> StmtEntries;28752876#ifndef NDEBUG2877unsigned PrevNumStmts = StmtStack.size();2878#endif28792880ASTRecordReader Record(*this, F);2881ASTStmtReader Reader(Record, Cursor);2882Stmt::EmptyShell Empty;28832884while (true) {2885llvm::Expected<llvm::BitstreamEntry> MaybeEntry =2886Cursor.advanceSkippingSubblocks();2887if (!MaybeEntry) {2888Error(toString(MaybeEntry.takeError()));2889return nullptr;2890}2891llvm::BitstreamEntry Entry = MaybeEntry.get();28922893switch (Entry.Kind) {2894case llvm::BitstreamEntry::SubBlock: // Handled for us already.2895case llvm::BitstreamEntry::Error:2896Error("malformed block record in AST file");2897return nullptr;2898case llvm::BitstreamEntry::EndBlock:2899goto Done;2900case llvm::BitstreamEntry::Record:2901// The interesting case.2902break;2903}29042905ASTContext &Context = getContext();2906Stmt *S = nullptr;2907bool Finished = false;2908bool IsStmtReference = false;2909Expected<unsigned> MaybeStmtCode = Record.readRecord(Cursor, Entry.ID);2910if (!MaybeStmtCode) {2911Error(toString(MaybeStmtCode.takeError()));2912return nullptr;2913}2914switch ((StmtCode)MaybeStmtCode.get()) {2915case STMT_STOP:2916Finished = true;2917break;29182919case STMT_REF_PTR:2920IsStmtReference = true;2921assert(StmtEntries.contains(Record[0]) &&2922"No stmt was recorded for this offset reference!");2923S = StmtEntries[Record.readInt()];2924break;29252926case STMT_NULL_PTR:2927S = nullptr;2928break;29292930case STMT_NULL:2931S = new (Context) NullStmt(Empty);2932break;29332934case STMT_COMPOUND: {2935unsigned NumStmts = Record[ASTStmtReader::NumStmtFields];2936bool HasFPFeatures = Record[ASTStmtReader::NumStmtFields + 1];2937S = CompoundStmt::CreateEmpty(Context, NumStmts, HasFPFeatures);2938break;2939}29402941case STMT_CASE:2942S = CaseStmt::CreateEmpty(2943Context,2944/*CaseStmtIsGNURange*/ Record[ASTStmtReader::NumStmtFields + 3]);2945break;29462947case STMT_DEFAULT:2948S = new (Context) DefaultStmt(Empty);2949break;29502951case STMT_LABEL:2952S = new (Context) LabelStmt(Empty);2953break;29542955case STMT_ATTRIBUTED:2956S = AttributedStmt::CreateEmpty(2957Context,2958/*NumAttrs*/Record[ASTStmtReader::NumStmtFields]);2959break;29602961case STMT_IF: {2962BitsUnpacker IfStmtBits(Record[ASTStmtReader::NumStmtFields]);2963bool HasElse = IfStmtBits.getNextBit();2964bool HasVar = IfStmtBits.getNextBit();2965bool HasInit = IfStmtBits.getNextBit();2966S = IfStmt::CreateEmpty(Context, HasElse, HasVar, HasInit);2967break;2968}29692970case STMT_SWITCH:2971S = SwitchStmt::CreateEmpty(2972Context,2973/* HasInit=*/Record[ASTStmtReader::NumStmtFields],2974/* HasVar=*/Record[ASTStmtReader::NumStmtFields + 1]);2975break;29762977case STMT_WHILE:2978S = WhileStmt::CreateEmpty(2979Context,2980/* HasVar=*/Record[ASTStmtReader::NumStmtFields]);2981break;29822983case STMT_DO:2984S = new (Context) DoStmt(Empty);2985break;29862987case STMT_FOR:2988S = new (Context) ForStmt(Empty);2989break;29902991case STMT_GOTO:2992S = new (Context) GotoStmt(Empty);2993break;29942995case STMT_INDIRECT_GOTO:2996S = new (Context) IndirectGotoStmt(Empty);2997break;29982999case STMT_CONTINUE:3000S = new (Context) ContinueStmt(Empty);3001break;30023003case STMT_BREAK:3004S = new (Context) BreakStmt(Empty);3005break;30063007case STMT_RETURN:3008S = ReturnStmt::CreateEmpty(3009Context, /* HasNRVOCandidate=*/Record[ASTStmtReader::NumStmtFields]);3010break;30113012case STMT_DECL:3013S = new (Context) DeclStmt(Empty);3014break;30153016case STMT_GCCASM:3017S = new (Context) GCCAsmStmt(Empty);3018break;30193020case STMT_MSASM:3021S = new (Context) MSAsmStmt(Empty);3022break;30233024case STMT_CAPTURED:3025S = CapturedStmt::CreateDeserialized(3026Context, Record[ASTStmtReader::NumStmtFields]);3027break;30283029case EXPR_CONSTANT:3030S = ConstantExpr::CreateEmpty(3031Context, static_cast<ConstantResultStorageKind>(3032/*StorageKind=*/Record[ASTStmtReader::NumExprFields]));3033break;30343035case EXPR_SYCL_UNIQUE_STABLE_NAME:3036S = SYCLUniqueStableNameExpr::CreateEmpty(Context);3037break;30383039case EXPR_PREDEFINED:3040S = PredefinedExpr::CreateEmpty(3041Context,3042/*HasFunctionName*/ Record[ASTStmtReader::NumExprFields]);3043break;30443045case EXPR_DECL_REF: {3046BitsUnpacker DeclRefExprBits(Record[ASTStmtReader::NumExprFields]);3047DeclRefExprBits.advance(5);3048bool HasFoundDecl = DeclRefExprBits.getNextBit();3049bool HasQualifier = DeclRefExprBits.getNextBit();3050bool HasTemplateKWAndArgsInfo = DeclRefExprBits.getNextBit();3051unsigned NumTemplateArgs = HasTemplateKWAndArgsInfo3052? Record[ASTStmtReader::NumExprFields + 1]3053: 0;3054S = DeclRefExpr::CreateEmpty(Context, HasQualifier, HasFoundDecl,3055HasTemplateKWAndArgsInfo, NumTemplateArgs);3056break;3057}30583059case EXPR_INTEGER_LITERAL:3060S = IntegerLiteral::Create(Context, Empty);3061break;30623063case EXPR_FIXEDPOINT_LITERAL:3064S = FixedPointLiteral::Create(Context, Empty);3065break;30663067case EXPR_FLOATING_LITERAL:3068S = FloatingLiteral::Create(Context, Empty);3069break;30703071case EXPR_IMAGINARY_LITERAL:3072S = new (Context) ImaginaryLiteral(Empty);3073break;30743075case EXPR_STRING_LITERAL:3076S = StringLiteral::CreateEmpty(3077Context,3078/* NumConcatenated=*/Record[ASTStmtReader::NumExprFields],3079/* Length=*/Record[ASTStmtReader::NumExprFields + 1],3080/* CharByteWidth=*/Record[ASTStmtReader::NumExprFields + 2]);3081break;30823083case EXPR_CHARACTER_LITERAL:3084S = new (Context) CharacterLiteral(Empty);3085break;30863087case EXPR_PAREN:3088S = new (Context) ParenExpr(Empty);3089break;30903091case EXPR_PAREN_LIST:3092S = ParenListExpr::CreateEmpty(3093Context,3094/* NumExprs=*/Record[ASTStmtReader::NumExprFields]);3095break;30963097case EXPR_UNARY_OPERATOR: {3098BitsUnpacker UnaryOperatorBits(Record[ASTStmtReader::NumStmtFields]);3099UnaryOperatorBits.advance(ASTStmtReader::NumExprBits);3100bool HasFPFeatures = UnaryOperatorBits.getNextBit();3101S = UnaryOperator::CreateEmpty(Context, HasFPFeatures);3102break;3103}31043105case EXPR_OFFSETOF:3106S = OffsetOfExpr::CreateEmpty(Context,3107Record[ASTStmtReader::NumExprFields],3108Record[ASTStmtReader::NumExprFields + 1]);3109break;31103111case EXPR_SIZEOF_ALIGN_OF:3112S = new (Context) UnaryExprOrTypeTraitExpr(Empty);3113break;31143115case EXPR_ARRAY_SUBSCRIPT:3116S = new (Context) ArraySubscriptExpr(Empty);3117break;31183119case EXPR_MATRIX_SUBSCRIPT:3120S = new (Context) MatrixSubscriptExpr(Empty);3121break;31223123case EXPR_ARRAY_SECTION:3124S = new (Context) ArraySectionExpr(Empty);3125break;31263127case EXPR_OMP_ARRAY_SHAPING:3128S = OMPArrayShapingExpr::CreateEmpty(3129Context, Record[ASTStmtReader::NumExprFields]);3130break;31313132case EXPR_OMP_ITERATOR:3133S = OMPIteratorExpr::CreateEmpty(Context,3134Record[ASTStmtReader::NumExprFields]);3135break;31363137case EXPR_CALL: {3138auto NumArgs = Record[ASTStmtReader::NumExprFields];3139BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);3140CallExprBits.advance(1);3141auto HasFPFeatures = CallExprBits.getNextBit();3142S = CallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures, Empty);3143break;3144}31453146case EXPR_RECOVERY:3147S = RecoveryExpr::CreateEmpty(3148Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);3149break;31503151case EXPR_MEMBER: {3152BitsUnpacker ExprMemberBits(Record[ASTStmtReader::NumExprFields]);3153bool HasQualifier = ExprMemberBits.getNextBit();3154bool HasFoundDecl = ExprMemberBits.getNextBit();3155bool HasTemplateInfo = ExprMemberBits.getNextBit();3156unsigned NumTemplateArgs = Record[ASTStmtReader::NumExprFields + 1];3157S = MemberExpr::CreateEmpty(Context, HasQualifier, HasFoundDecl,3158HasTemplateInfo, NumTemplateArgs);3159break;3160}31613162case EXPR_BINARY_OPERATOR: {3163BitsUnpacker BinaryOperatorBits(Record[ASTStmtReader::NumExprFields]);3164BinaryOperatorBits.advance(/*Size of opcode*/ 6);3165bool HasFPFeatures = BinaryOperatorBits.getNextBit();3166S = BinaryOperator::CreateEmpty(Context, HasFPFeatures);3167break;3168}31693170case EXPR_COMPOUND_ASSIGN_OPERATOR: {3171BitsUnpacker BinaryOperatorBits(Record[ASTStmtReader::NumExprFields]);3172BinaryOperatorBits.advance(/*Size of opcode*/ 6);3173bool HasFPFeatures = BinaryOperatorBits.getNextBit();3174S = CompoundAssignOperator::CreateEmpty(Context, HasFPFeatures);3175break;3176}31773178case EXPR_CONDITIONAL_OPERATOR:3179S = new (Context) ConditionalOperator(Empty);3180break;31813182case EXPR_BINARY_CONDITIONAL_OPERATOR:3183S = new (Context) BinaryConditionalOperator(Empty);3184break;31853186case EXPR_IMPLICIT_CAST: {3187unsigned PathSize = Record[ASTStmtReader::NumExprFields];3188BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);3189CastExprBits.advance(7);3190bool HasFPFeatures = CastExprBits.getNextBit();3191S = ImplicitCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);3192break;3193}31943195case EXPR_CSTYLE_CAST: {3196unsigned PathSize = Record[ASTStmtReader::NumExprFields];3197BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);3198CastExprBits.advance(7);3199bool HasFPFeatures = CastExprBits.getNextBit();3200S = CStyleCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);3201break;3202}32033204case EXPR_COMPOUND_LITERAL:3205S = new (Context) CompoundLiteralExpr(Empty);3206break;32073208case EXPR_EXT_VECTOR_ELEMENT:3209S = new (Context) ExtVectorElementExpr(Empty);3210break;32113212case EXPR_INIT_LIST:3213S = new (Context) InitListExpr(Empty);3214break;32153216case EXPR_DESIGNATED_INIT:3217S = DesignatedInitExpr::CreateEmpty(Context,3218Record[ASTStmtReader::NumExprFields] - 1);32193220break;32213222case EXPR_DESIGNATED_INIT_UPDATE:3223S = new (Context) DesignatedInitUpdateExpr(Empty);3224break;32253226case EXPR_IMPLICIT_VALUE_INIT:3227S = new (Context) ImplicitValueInitExpr(Empty);3228break;32293230case EXPR_NO_INIT:3231S = new (Context) NoInitExpr(Empty);3232break;32333234case EXPR_ARRAY_INIT_LOOP:3235S = new (Context) ArrayInitLoopExpr(Empty);3236break;32373238case EXPR_ARRAY_INIT_INDEX:3239S = new (Context) ArrayInitIndexExpr(Empty);3240break;32413242case EXPR_VA_ARG:3243S = new (Context) VAArgExpr(Empty);3244break;32453246case EXPR_SOURCE_LOC:3247S = new (Context) SourceLocExpr(Empty);3248break;32493250case EXPR_BUILTIN_PP_EMBED:3251S = new (Context) EmbedExpr(Empty);3252break;32533254case EXPR_ADDR_LABEL:3255S = new (Context) AddrLabelExpr(Empty);3256break;32573258case EXPR_STMT:3259S = new (Context) StmtExpr(Empty);3260break;32613262case EXPR_CHOOSE:3263S = new (Context) ChooseExpr(Empty);3264break;32653266case EXPR_GNU_NULL:3267S = new (Context) GNUNullExpr(Empty);3268break;32693270case EXPR_SHUFFLE_VECTOR:3271S = new (Context) ShuffleVectorExpr(Empty);3272break;32733274case EXPR_CONVERT_VECTOR:3275S = new (Context) ConvertVectorExpr(Empty);3276break;32773278case EXPR_BLOCK:3279S = new (Context) BlockExpr(Empty);3280break;32813282case EXPR_GENERIC_SELECTION:3283S = GenericSelectionExpr::CreateEmpty(3284Context,3285/*NumAssocs=*/Record[ASTStmtReader::NumExprFields]);3286break;32873288case EXPR_OBJC_STRING_LITERAL:3289S = new (Context) ObjCStringLiteral(Empty);3290break;32913292case EXPR_OBJC_BOXED_EXPRESSION:3293S = new (Context) ObjCBoxedExpr(Empty);3294break;32953296case EXPR_OBJC_ARRAY_LITERAL:3297S = ObjCArrayLiteral::CreateEmpty(Context,3298Record[ASTStmtReader::NumExprFields]);3299break;33003301case EXPR_OBJC_DICTIONARY_LITERAL:3302S = ObjCDictionaryLiteral::CreateEmpty(Context,3303Record[ASTStmtReader::NumExprFields],3304Record[ASTStmtReader::NumExprFields + 1]);3305break;33063307case EXPR_OBJC_ENCODE:3308S = new (Context) ObjCEncodeExpr(Empty);3309break;33103311case EXPR_OBJC_SELECTOR_EXPR:3312S = new (Context) ObjCSelectorExpr(Empty);3313break;33143315case EXPR_OBJC_PROTOCOL_EXPR:3316S = new (Context) ObjCProtocolExpr(Empty);3317break;33183319case EXPR_OBJC_IVAR_REF_EXPR:3320S = new (Context) ObjCIvarRefExpr(Empty);3321break;33223323case EXPR_OBJC_PROPERTY_REF_EXPR:3324S = new (Context) ObjCPropertyRefExpr(Empty);3325break;33263327case EXPR_OBJC_SUBSCRIPT_REF_EXPR:3328S = new (Context) ObjCSubscriptRefExpr(Empty);3329break;33303331case EXPR_OBJC_KVC_REF_EXPR:3332llvm_unreachable("mismatching AST file");33333334case EXPR_OBJC_MESSAGE_EXPR:3335S = ObjCMessageExpr::CreateEmpty(Context,3336Record[ASTStmtReader::NumExprFields],3337Record[ASTStmtReader::NumExprFields + 1]);3338break;33393340case EXPR_OBJC_ISA:3341S = new (Context) ObjCIsaExpr(Empty);3342break;33433344case EXPR_OBJC_INDIRECT_COPY_RESTORE:3345S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);3346break;33473348case EXPR_OBJC_BRIDGED_CAST:3349S = new (Context) ObjCBridgedCastExpr(Empty);3350break;33513352case STMT_OBJC_FOR_COLLECTION:3353S = new (Context) ObjCForCollectionStmt(Empty);3354break;33553356case STMT_OBJC_CATCH:3357S = new (Context) ObjCAtCatchStmt(Empty);3358break;33593360case STMT_OBJC_FINALLY:3361S = new (Context) ObjCAtFinallyStmt(Empty);3362break;33633364case STMT_OBJC_AT_TRY:3365S = ObjCAtTryStmt::CreateEmpty(Context,3366Record[ASTStmtReader::NumStmtFields],3367Record[ASTStmtReader::NumStmtFields + 1]);3368break;33693370case STMT_OBJC_AT_SYNCHRONIZED:3371S = new (Context) ObjCAtSynchronizedStmt(Empty);3372break;33733374case STMT_OBJC_AT_THROW:3375S = new (Context) ObjCAtThrowStmt(Empty);3376break;33773378case STMT_OBJC_AUTORELEASE_POOL:3379S = new (Context) ObjCAutoreleasePoolStmt(Empty);3380break;33813382case EXPR_OBJC_BOOL_LITERAL:3383S = new (Context) ObjCBoolLiteralExpr(Empty);3384break;33853386case EXPR_OBJC_AVAILABILITY_CHECK:3387S = new (Context) ObjCAvailabilityCheckExpr(Empty);3388break;33893390case STMT_SEH_LEAVE:3391S = new (Context) SEHLeaveStmt(Empty);3392break;33933394case STMT_SEH_EXCEPT:3395S = new (Context) SEHExceptStmt(Empty);3396break;33973398case STMT_SEH_FINALLY:3399S = new (Context) SEHFinallyStmt(Empty);3400break;34013402case STMT_SEH_TRY:3403S = new (Context) SEHTryStmt(Empty);3404break;34053406case STMT_CXX_CATCH:3407S = new (Context) CXXCatchStmt(Empty);3408break;34093410case STMT_CXX_TRY:3411S = CXXTryStmt::Create(Context, Empty,3412/*numHandlers=*/Record[ASTStmtReader::NumStmtFields]);3413break;34143415case STMT_CXX_FOR_RANGE:3416S = new (Context) CXXForRangeStmt(Empty);3417break;34183419case STMT_MS_DEPENDENT_EXISTS:3420S = new (Context) MSDependentExistsStmt(SourceLocation(), true,3421NestedNameSpecifierLoc(),3422DeclarationNameInfo(),3423nullptr);3424break;34253426case STMT_OMP_CANONICAL_LOOP:3427S = OMPCanonicalLoop::createEmpty(Context);3428break;34293430case STMT_OMP_META_DIRECTIVE:3431S = OMPMetaDirective::CreateEmpty(3432Context, Record[ASTStmtReader::NumStmtFields], Empty);3433break;34343435case STMT_OMP_PARALLEL_DIRECTIVE:3436S =3437OMPParallelDirective::CreateEmpty(Context,3438Record[ASTStmtReader::NumStmtFields],3439Empty);3440break;34413442case STMT_OMP_SIMD_DIRECTIVE: {3443unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3444unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3445S = OMPSimdDirective::CreateEmpty(Context, NumClauses,3446CollapsedNum, Empty);3447break;3448}34493450case STMT_OMP_TILE_DIRECTIVE: {3451unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];3452unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3453S = OMPTileDirective::CreateEmpty(Context, NumClauses, NumLoops);3454break;3455}34563457case STMT_OMP_UNROLL_DIRECTIVE: {3458assert(Record[ASTStmtReader::NumStmtFields] == 1 && "Unroll directive accepts only a single loop");3459unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3460S = OMPUnrollDirective::CreateEmpty(Context, NumClauses);3461break;3462}34633464case STMT_OMP_REVERSE_DIRECTIVE: {3465assert(Record[ASTStmtReader::NumStmtFields] == 1 &&3466"Reverse directive accepts only a single loop");3467assert(Record[ASTStmtReader::NumStmtFields + 1] == 0 &&3468"Reverse directive has no clauses");3469S = OMPReverseDirective::CreateEmpty(Context);3470break;3471}34723473case STMT_OMP_INTERCHANGE_DIRECTIVE: {3474unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];3475unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3476S = OMPInterchangeDirective::CreateEmpty(Context, NumClauses, NumLoops);3477break;3478}34793480case STMT_OMP_FOR_DIRECTIVE: {3481unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3482unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3483S = OMPForDirective::CreateEmpty(Context, NumClauses, CollapsedNum,3484Empty);3485break;3486}34873488case STMT_OMP_FOR_SIMD_DIRECTIVE: {3489unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3490unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3491S = OMPForSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum,3492Empty);3493break;3494}34953496case STMT_OMP_SECTIONS_DIRECTIVE:3497S = OMPSectionsDirective::CreateEmpty(3498Context, Record[ASTStmtReader::NumStmtFields], Empty);3499break;35003501case STMT_OMP_SECTION_DIRECTIVE:3502S = OMPSectionDirective::CreateEmpty(Context, Empty);3503break;35043505case STMT_OMP_SCOPE_DIRECTIVE:3506S = OMPScopeDirective::CreateEmpty(3507Context, Record[ASTStmtReader::NumStmtFields], Empty);3508break;35093510case STMT_OMP_SINGLE_DIRECTIVE:3511S = OMPSingleDirective::CreateEmpty(3512Context, Record[ASTStmtReader::NumStmtFields], Empty);3513break;35143515case STMT_OMP_MASTER_DIRECTIVE:3516S = OMPMasterDirective::CreateEmpty(Context, Empty);3517break;35183519case STMT_OMP_CRITICAL_DIRECTIVE:3520S = OMPCriticalDirective::CreateEmpty(3521Context, Record[ASTStmtReader::NumStmtFields], Empty);3522break;35233524case STMT_OMP_PARALLEL_FOR_DIRECTIVE: {3525unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3526unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3527S = OMPParallelForDirective::CreateEmpty(Context, NumClauses,3528CollapsedNum, Empty);3529break;3530}35313532case STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE: {3533unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3534unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3535S = OMPParallelForSimdDirective::CreateEmpty(Context, NumClauses,3536CollapsedNum, Empty);3537break;3538}35393540case STMT_OMP_PARALLEL_MASTER_DIRECTIVE:3541S = OMPParallelMasterDirective::CreateEmpty(3542Context, Record[ASTStmtReader::NumStmtFields], Empty);3543break;35443545case STMT_OMP_PARALLEL_MASKED_DIRECTIVE:3546S = OMPParallelMaskedDirective::CreateEmpty(3547Context, Record[ASTStmtReader::NumStmtFields], Empty);3548break;35493550case STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE:3551S = OMPParallelSectionsDirective::CreateEmpty(3552Context, Record[ASTStmtReader::NumStmtFields], Empty);3553break;35543555case STMT_OMP_TASK_DIRECTIVE:3556S = OMPTaskDirective::CreateEmpty(3557Context, Record[ASTStmtReader::NumStmtFields], Empty);3558break;35593560case STMT_OMP_TASKYIELD_DIRECTIVE:3561S = OMPTaskyieldDirective::CreateEmpty(Context, Empty);3562break;35633564case STMT_OMP_BARRIER_DIRECTIVE:3565S = OMPBarrierDirective::CreateEmpty(Context, Empty);3566break;35673568case STMT_OMP_TASKWAIT_DIRECTIVE:3569S = OMPTaskwaitDirective::CreateEmpty(3570Context, Record[ASTStmtReader::NumStmtFields], Empty);3571break;35723573case STMT_OMP_ERROR_DIRECTIVE:3574S = OMPErrorDirective::CreateEmpty(3575Context, Record[ASTStmtReader::NumStmtFields], Empty);3576break;35773578case STMT_OMP_TASKGROUP_DIRECTIVE:3579S = OMPTaskgroupDirective::CreateEmpty(3580Context, Record[ASTStmtReader::NumStmtFields], Empty);3581break;35823583case STMT_OMP_FLUSH_DIRECTIVE:3584S = OMPFlushDirective::CreateEmpty(3585Context, Record[ASTStmtReader::NumStmtFields], Empty);3586break;35873588case STMT_OMP_DEPOBJ_DIRECTIVE:3589S = OMPDepobjDirective::CreateEmpty(3590Context, Record[ASTStmtReader::NumStmtFields], Empty);3591break;35923593case STMT_OMP_SCAN_DIRECTIVE:3594S = OMPScanDirective::CreateEmpty(3595Context, Record[ASTStmtReader::NumStmtFields], Empty);3596break;35973598case STMT_OMP_ORDERED_DIRECTIVE: {3599unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];3600bool HasAssociatedStmt = Record[ASTStmtReader::NumStmtFields + 2];3601S = OMPOrderedDirective::CreateEmpty(Context, NumClauses,3602!HasAssociatedStmt, Empty);3603break;3604}36053606case STMT_OMP_ATOMIC_DIRECTIVE:3607S = OMPAtomicDirective::CreateEmpty(3608Context, Record[ASTStmtReader::NumStmtFields], Empty);3609break;36103611case STMT_OMP_TARGET_DIRECTIVE:3612S = OMPTargetDirective::CreateEmpty(3613Context, Record[ASTStmtReader::NumStmtFields], Empty);3614break;36153616case STMT_OMP_TARGET_DATA_DIRECTIVE:3617S = OMPTargetDataDirective::CreateEmpty(3618Context, Record[ASTStmtReader::NumStmtFields], Empty);3619break;36203621case STMT_OMP_TARGET_ENTER_DATA_DIRECTIVE:3622S = OMPTargetEnterDataDirective::CreateEmpty(3623Context, Record[ASTStmtReader::NumStmtFields], Empty);3624break;36253626case STMT_OMP_TARGET_EXIT_DATA_DIRECTIVE:3627S = OMPTargetExitDataDirective::CreateEmpty(3628Context, Record[ASTStmtReader::NumStmtFields], Empty);3629break;36303631case STMT_OMP_TARGET_PARALLEL_DIRECTIVE:3632S = OMPTargetParallelDirective::CreateEmpty(3633Context, Record[ASTStmtReader::NumStmtFields], Empty);3634break;36353636case STMT_OMP_TARGET_PARALLEL_FOR_DIRECTIVE: {3637unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3638unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3639S = OMPTargetParallelForDirective::CreateEmpty(Context, NumClauses,3640CollapsedNum, Empty);3641break;3642}36433644case STMT_OMP_TARGET_UPDATE_DIRECTIVE:3645S = OMPTargetUpdateDirective::CreateEmpty(3646Context, Record[ASTStmtReader::NumStmtFields], Empty);3647break;36483649case STMT_OMP_TEAMS_DIRECTIVE:3650S = OMPTeamsDirective::CreateEmpty(3651Context, Record[ASTStmtReader::NumStmtFields], Empty);3652break;36533654case STMT_OMP_CANCELLATION_POINT_DIRECTIVE:3655S = OMPCancellationPointDirective::CreateEmpty(Context, Empty);3656break;36573658case STMT_OMP_CANCEL_DIRECTIVE:3659S = OMPCancelDirective::CreateEmpty(3660Context, Record[ASTStmtReader::NumStmtFields], Empty);3661break;36623663case STMT_OMP_TASKLOOP_DIRECTIVE: {3664unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3665unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3666S = OMPTaskLoopDirective::CreateEmpty(Context, NumClauses, CollapsedNum,3667Empty);3668break;3669}36703671case STMT_OMP_TASKLOOP_SIMD_DIRECTIVE: {3672unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3673unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3674S = OMPTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,3675CollapsedNum, Empty);3676break;3677}36783679case STMT_OMP_MASTER_TASKLOOP_DIRECTIVE: {3680unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3681unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3682S = OMPMasterTaskLoopDirective::CreateEmpty(Context, NumClauses,3683CollapsedNum, Empty);3684break;3685}36863687case STMT_OMP_MASKED_TASKLOOP_DIRECTIVE: {3688unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3689unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3690S = OMPMaskedTaskLoopDirective::CreateEmpty(Context, NumClauses,3691CollapsedNum, Empty);3692break;3693}36943695case STMT_OMP_MASTER_TASKLOOP_SIMD_DIRECTIVE: {3696unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3697unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3698S = OMPMasterTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,3699CollapsedNum, Empty);3700break;3701}37023703case STMT_OMP_MASKED_TASKLOOP_SIMD_DIRECTIVE: {3704unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3705unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3706S = OMPMaskedTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,3707CollapsedNum, Empty);3708break;3709}37103711case STMT_OMP_PARALLEL_MASTER_TASKLOOP_DIRECTIVE: {3712unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3713unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3714S = OMPParallelMasterTaskLoopDirective::CreateEmpty(Context, NumClauses,3715CollapsedNum, Empty);3716break;3717}37183719case STMT_OMP_PARALLEL_MASKED_TASKLOOP_DIRECTIVE: {3720unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3721unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3722S = OMPParallelMaskedTaskLoopDirective::CreateEmpty(Context, NumClauses,3723CollapsedNum, Empty);3724break;3725}37263727case STMT_OMP_PARALLEL_MASTER_TASKLOOP_SIMD_DIRECTIVE: {3728unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3729unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3730S = OMPParallelMasterTaskLoopSimdDirective::CreateEmpty(3731Context, NumClauses, CollapsedNum, Empty);3732break;3733}37343735case STMT_OMP_PARALLEL_MASKED_TASKLOOP_SIMD_DIRECTIVE: {3736unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3737unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3738S = OMPParallelMaskedTaskLoopSimdDirective::CreateEmpty(3739Context, NumClauses, CollapsedNum, Empty);3740break;3741}37423743case STMT_OMP_DISTRIBUTE_DIRECTIVE: {3744unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3745unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3746S = OMPDistributeDirective::CreateEmpty(Context, NumClauses, CollapsedNum,3747Empty);3748break;3749}37503751case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: {3752unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3753unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3754S = OMPDistributeParallelForDirective::CreateEmpty(Context, NumClauses,3755CollapsedNum, Empty);3756break;3757}37583759case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: {3760unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3761unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3762S = OMPDistributeParallelForSimdDirective::CreateEmpty(Context, NumClauses,3763CollapsedNum,3764Empty);3765break;3766}37673768case STMT_OMP_DISTRIBUTE_SIMD_DIRECTIVE: {3769unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3770unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3771S = OMPDistributeSimdDirective::CreateEmpty(Context, NumClauses,3772CollapsedNum, Empty);3773break;3774}37753776case STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE: {3777unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3778unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3779S = OMPTargetParallelForSimdDirective::CreateEmpty(Context, NumClauses,3780CollapsedNum, Empty);3781break;3782}37833784case STMT_OMP_TARGET_SIMD_DIRECTIVE: {3785unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3786unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3787S = OMPTargetSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum,3788Empty);3789break;3790}37913792case STMT_OMP_TEAMS_DISTRIBUTE_DIRECTIVE: {3793unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3794unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3795S = OMPTeamsDistributeDirective::CreateEmpty(Context, NumClauses,3796CollapsedNum, Empty);3797break;3798}37993800case STMT_OMP_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE: {3801unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3802unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3803S = OMPTeamsDistributeSimdDirective::CreateEmpty(Context, NumClauses,3804CollapsedNum, Empty);3805break;3806}38073808case STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: {3809unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3810unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3811S = OMPTeamsDistributeParallelForSimdDirective::CreateEmpty(3812Context, NumClauses, CollapsedNum, Empty);3813break;3814}38153816case STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: {3817unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3818unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3819S = OMPTeamsDistributeParallelForDirective::CreateEmpty(3820Context, NumClauses, CollapsedNum, Empty);3821break;3822}38233824case STMT_OMP_TARGET_TEAMS_DIRECTIVE:3825S = OMPTargetTeamsDirective::CreateEmpty(3826Context, Record[ASTStmtReader::NumStmtFields], Empty);3827break;38283829case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_DIRECTIVE: {3830unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3831unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3832S = OMPTargetTeamsDistributeDirective::CreateEmpty(Context, NumClauses,3833CollapsedNum, Empty);3834break;3835}38363837case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: {3838unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3839unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3840S = OMPTargetTeamsDistributeParallelForDirective::CreateEmpty(3841Context, NumClauses, CollapsedNum, Empty);3842break;3843}38443845case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: {3846unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3847unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3848S = OMPTargetTeamsDistributeParallelForSimdDirective::CreateEmpty(3849Context, NumClauses, CollapsedNum, Empty);3850break;3851}38523853case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE: {3854unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3855unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3856S = OMPTargetTeamsDistributeSimdDirective::CreateEmpty(3857Context, NumClauses, CollapsedNum, Empty);3858break;3859}38603861case STMT_OMP_INTEROP_DIRECTIVE:3862S = OMPInteropDirective::CreateEmpty(3863Context, Record[ASTStmtReader::NumStmtFields], Empty);3864break;38653866case STMT_OMP_DISPATCH_DIRECTIVE:3867S = OMPDispatchDirective::CreateEmpty(3868Context, Record[ASTStmtReader::NumStmtFields], Empty);3869break;38703871case STMT_OMP_MASKED_DIRECTIVE:3872S = OMPMaskedDirective::CreateEmpty(3873Context, Record[ASTStmtReader::NumStmtFields], Empty);3874break;38753876case STMT_OMP_GENERIC_LOOP_DIRECTIVE: {3877unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3878unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3879S = OMPGenericLoopDirective::CreateEmpty(Context, NumClauses,3880CollapsedNum, Empty);3881break;3882}38833884case STMT_OMP_TEAMS_GENERIC_LOOP_DIRECTIVE: {3885unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3886unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3887S = OMPTeamsGenericLoopDirective::CreateEmpty(Context, NumClauses,3888CollapsedNum, Empty);3889break;3890}38913892case STMT_OMP_TARGET_TEAMS_GENERIC_LOOP_DIRECTIVE: {3893unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3894unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3895S = OMPTargetTeamsGenericLoopDirective::CreateEmpty(Context, NumClauses,3896CollapsedNum, Empty);3897break;3898}38993900case STMT_OMP_PARALLEL_GENERIC_LOOP_DIRECTIVE: {3901unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3902unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3903S = OMPParallelGenericLoopDirective::CreateEmpty(Context, NumClauses,3904CollapsedNum, Empty);3905break;3906}39073908case STMT_OMP_TARGET_PARALLEL_GENERIC_LOOP_DIRECTIVE: {3909unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];3910unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];3911S = OMPTargetParallelGenericLoopDirective::CreateEmpty(3912Context, NumClauses, CollapsedNum, Empty);3913break;3914}39153916case EXPR_CXX_OPERATOR_CALL: {3917auto NumArgs = Record[ASTStmtReader::NumExprFields];3918BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);3919CallExprBits.advance(1);3920auto HasFPFeatures = CallExprBits.getNextBit();3921S = CXXOperatorCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,3922Empty);3923break;3924}39253926case EXPR_CXX_MEMBER_CALL: {3927auto NumArgs = Record[ASTStmtReader::NumExprFields];3928BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);3929CallExprBits.advance(1);3930auto HasFPFeatures = CallExprBits.getNextBit();3931S = CXXMemberCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,3932Empty);3933break;3934}39353936case EXPR_CXX_REWRITTEN_BINARY_OPERATOR:3937S = new (Context) CXXRewrittenBinaryOperator(Empty);3938break;39393940case EXPR_CXX_CONSTRUCT:3941S = CXXConstructExpr::CreateEmpty(3942Context,3943/* NumArgs=*/Record[ASTStmtReader::NumExprFields]);3944break;39453946case EXPR_CXX_INHERITED_CTOR_INIT:3947S = new (Context) CXXInheritedCtorInitExpr(Empty);3948break;39493950case EXPR_CXX_TEMPORARY_OBJECT:3951S = CXXTemporaryObjectExpr::CreateEmpty(3952Context,3953/* NumArgs=*/Record[ASTStmtReader::NumExprFields]);3954break;39553956case EXPR_CXX_STATIC_CAST: {3957unsigned PathSize = Record[ASTStmtReader::NumExprFields];3958BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);3959CastExprBits.advance(7);3960bool HasFPFeatures = CastExprBits.getNextBit();3961S = CXXStaticCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);3962break;3963}39643965case EXPR_CXX_DYNAMIC_CAST: {3966unsigned PathSize = Record[ASTStmtReader::NumExprFields];3967S = CXXDynamicCastExpr::CreateEmpty(Context, PathSize);3968break;3969}39703971case EXPR_CXX_REINTERPRET_CAST: {3972unsigned PathSize = Record[ASTStmtReader::NumExprFields];3973S = CXXReinterpretCastExpr::CreateEmpty(Context, PathSize);3974break;3975}39763977case EXPR_CXX_CONST_CAST:3978S = CXXConstCastExpr::CreateEmpty(Context);3979break;39803981case EXPR_CXX_ADDRSPACE_CAST:3982S = CXXAddrspaceCastExpr::CreateEmpty(Context);3983break;39843985case EXPR_CXX_FUNCTIONAL_CAST: {3986unsigned PathSize = Record[ASTStmtReader::NumExprFields];3987BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);3988CastExprBits.advance(7);3989bool HasFPFeatures = CastExprBits.getNextBit();3990S = CXXFunctionalCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);3991break;3992}39933994case EXPR_BUILTIN_BIT_CAST: {3995#ifndef NDEBUG3996unsigned PathSize = Record[ASTStmtReader::NumExprFields];3997assert(PathSize == 0 && "Wrong PathSize!");3998#endif3999S = new (Context) BuiltinBitCastExpr(Empty);4000break;4001}40024003case EXPR_USER_DEFINED_LITERAL: {4004auto NumArgs = Record[ASTStmtReader::NumExprFields];4005BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);4006CallExprBits.advance(1);4007auto HasFPFeatures = CallExprBits.getNextBit();4008S = UserDefinedLiteral::CreateEmpty(Context, NumArgs, HasFPFeatures,4009Empty);4010break;4011}40124013case EXPR_CXX_STD_INITIALIZER_LIST:4014S = new (Context) CXXStdInitializerListExpr(Empty);4015break;40164017case EXPR_CXX_BOOL_LITERAL:4018S = new (Context) CXXBoolLiteralExpr(Empty);4019break;40204021case EXPR_CXX_NULL_PTR_LITERAL:4022S = new (Context) CXXNullPtrLiteralExpr(Empty);4023break;40244025case EXPR_CXX_TYPEID_EXPR:4026S = new (Context) CXXTypeidExpr(Empty, true);4027break;40284029case EXPR_CXX_TYPEID_TYPE:4030S = new (Context) CXXTypeidExpr(Empty, false);4031break;40324033case EXPR_CXX_UUIDOF_EXPR:4034S = new (Context) CXXUuidofExpr(Empty, true);4035break;40364037case EXPR_CXX_PROPERTY_REF_EXPR:4038S = new (Context) MSPropertyRefExpr(Empty);4039break;40404041case EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR:4042S = new (Context) MSPropertySubscriptExpr(Empty);4043break;40444045case EXPR_CXX_UUIDOF_TYPE:4046S = new (Context) CXXUuidofExpr(Empty, false);4047break;40484049case EXPR_CXX_THIS:4050S = CXXThisExpr::CreateEmpty(Context);4051break;40524053case EXPR_CXX_THROW:4054S = new (Context) CXXThrowExpr(Empty);4055break;40564057case EXPR_CXX_DEFAULT_ARG:4058S = CXXDefaultArgExpr::CreateEmpty(4059Context, /*HasRewrittenInit=*/Record[ASTStmtReader::NumExprFields]);4060break;40614062case EXPR_CXX_DEFAULT_INIT:4063S = CXXDefaultInitExpr::CreateEmpty(4064Context, /*HasRewrittenInit=*/Record[ASTStmtReader::NumExprFields]);4065break;40664067case EXPR_CXX_BIND_TEMPORARY:4068S = new (Context) CXXBindTemporaryExpr(Empty);4069break;40704071case EXPR_CXX_SCALAR_VALUE_INIT:4072S = new (Context) CXXScalarValueInitExpr(Empty);4073break;40744075case EXPR_CXX_NEW:4076S = CXXNewExpr::CreateEmpty(4077Context,4078/*IsArray=*/Record[ASTStmtReader::NumExprFields],4079/*HasInit=*/Record[ASTStmtReader::NumExprFields + 1],4080/*NumPlacementArgs=*/Record[ASTStmtReader::NumExprFields + 2],4081/*IsParenTypeId=*/Record[ASTStmtReader::NumExprFields + 3]);4082break;40834084case EXPR_CXX_DELETE:4085S = new (Context) CXXDeleteExpr(Empty);4086break;40874088case EXPR_CXX_PSEUDO_DESTRUCTOR:4089S = new (Context) CXXPseudoDestructorExpr(Empty);4090break;40914092case EXPR_EXPR_WITH_CLEANUPS:4093S = ExprWithCleanups::Create(Context, Empty,4094Record[ASTStmtReader::NumExprFields]);4095break;40964097case EXPR_CXX_DEPENDENT_SCOPE_MEMBER: {4098unsigned NumTemplateArgs = Record[ASTStmtReader::NumExprFields];4099BitsUnpacker DependentScopeMemberBits(4100Record[ASTStmtReader::NumExprFields + 1]);4101bool HasTemplateKWAndArgsInfo = DependentScopeMemberBits.getNextBit();41024103bool HasFirstQualifierFoundInScope =4104DependentScopeMemberBits.getNextBit();4105S = CXXDependentScopeMemberExpr::CreateEmpty(4106Context, HasTemplateKWAndArgsInfo, NumTemplateArgs,4107HasFirstQualifierFoundInScope);4108break;4109}41104111case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF: {4112BitsUnpacker DependentScopeDeclRefBits(4113Record[ASTStmtReader::NumStmtFields]);4114DependentScopeDeclRefBits.advance(ASTStmtReader::NumExprBits);4115bool HasTemplateKWAndArgsInfo = DependentScopeDeclRefBits.getNextBit();4116unsigned NumTemplateArgs =4117HasTemplateKWAndArgsInfo4118? DependentScopeDeclRefBits.getNextBits(/*Width=*/16)4119: 0;4120S = DependentScopeDeclRefExpr::CreateEmpty(4121Context, HasTemplateKWAndArgsInfo, NumTemplateArgs);4122break;4123}41244125case EXPR_CXX_UNRESOLVED_CONSTRUCT:4126S = CXXUnresolvedConstructExpr::CreateEmpty(Context,4127/*NumArgs=*/Record[ASTStmtReader::NumExprFields]);4128break;41294130case EXPR_CXX_UNRESOLVED_MEMBER: {4131auto NumResults = Record[ASTStmtReader::NumExprFields];4132BitsUnpacker OverloadExprBits(Record[ASTStmtReader::NumExprFields + 1]);4133auto HasTemplateKWAndArgsInfo = OverloadExprBits.getNextBit();4134auto NumTemplateArgs = HasTemplateKWAndArgsInfo4135? Record[ASTStmtReader::NumExprFields + 2]4136: 0;4137S = UnresolvedMemberExpr::CreateEmpty(4138Context, NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);4139break;4140}41414142case EXPR_CXX_UNRESOLVED_LOOKUP: {4143auto NumResults = Record[ASTStmtReader::NumExprFields];4144BitsUnpacker OverloadExprBits(Record[ASTStmtReader::NumExprFields + 1]);4145auto HasTemplateKWAndArgsInfo = OverloadExprBits.getNextBit();4146auto NumTemplateArgs = HasTemplateKWAndArgsInfo4147? Record[ASTStmtReader::NumExprFields + 2]4148: 0;4149S = UnresolvedLookupExpr::CreateEmpty(4150Context, NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);4151break;4152}41534154case EXPR_TYPE_TRAIT:4155S = TypeTraitExpr::CreateDeserialized(Context,4156Record[ASTStmtReader::NumExprFields]);4157break;41584159case EXPR_ARRAY_TYPE_TRAIT:4160S = new (Context) ArrayTypeTraitExpr(Empty);4161break;41624163case EXPR_CXX_EXPRESSION_TRAIT:4164S = new (Context) ExpressionTraitExpr(Empty);4165break;41664167case EXPR_CXX_NOEXCEPT:4168S = new (Context) CXXNoexceptExpr(Empty);4169break;41704171case EXPR_PACK_EXPANSION:4172S = new (Context) PackExpansionExpr(Empty);4173break;41744175case EXPR_SIZEOF_PACK:4176S = SizeOfPackExpr::CreateDeserialized(4177Context,4178/*NumPartialArgs=*/Record[ASTStmtReader::NumExprFields]);4179break;41804181case EXPR_PACK_INDEXING:4182S = PackIndexingExpr::CreateDeserialized(4183Context,4184/*TransformedExprs=*/Record[ASTStmtReader::NumExprFields]);4185break;41864187case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:4188S = new (Context) SubstNonTypeTemplateParmExpr(Empty);4189break;41904191case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:4192S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);4193break;41944195case EXPR_FUNCTION_PARM_PACK:4196S = FunctionParmPackExpr::CreateEmpty(Context,4197Record[ASTStmtReader::NumExprFields]);4198break;41994200case EXPR_MATERIALIZE_TEMPORARY:4201S = new (Context) MaterializeTemporaryExpr(Empty);4202break;42034204case EXPR_CXX_FOLD:4205S = new (Context) CXXFoldExpr(Empty);4206break;42074208case EXPR_CXX_PAREN_LIST_INIT:4209S = CXXParenListInitExpr::CreateEmpty(4210Context, /*numExprs=*/Record[ASTStmtReader::NumExprFields], Empty);4211break;42124213case EXPR_OPAQUE_VALUE:4214S = new (Context) OpaqueValueExpr(Empty);4215break;42164217case EXPR_CUDA_KERNEL_CALL: {4218auto NumArgs = Record[ASTStmtReader::NumExprFields];4219BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);4220CallExprBits.advance(1);4221auto HasFPFeatures = CallExprBits.getNextBit();4222S = CUDAKernelCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,4223Empty);4224break;4225}42264227case EXPR_ASTYPE:4228S = new (Context) AsTypeExpr(Empty);4229break;42304231case EXPR_PSEUDO_OBJECT: {4232unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields];4233S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs);4234break;4235}42364237case EXPR_ATOMIC:4238S = new (Context) AtomicExpr(Empty);4239break;42404241case EXPR_LAMBDA: {4242unsigned NumCaptures = Record[ASTStmtReader::NumExprFields];4243S = LambdaExpr::CreateDeserialized(Context, NumCaptures);4244break;4245}42464247case STMT_COROUTINE_BODY: {4248unsigned NumParams = Record[ASTStmtReader::NumStmtFields];4249S = CoroutineBodyStmt::Create(Context, Empty, NumParams);4250break;4251}42524253case STMT_CORETURN:4254S = new (Context) CoreturnStmt(Empty);4255break;42564257case EXPR_COAWAIT:4258S = new (Context) CoawaitExpr(Empty);4259break;42604261case EXPR_COYIELD:4262S = new (Context) CoyieldExpr(Empty);4263break;42644265case EXPR_DEPENDENT_COAWAIT:4266S = new (Context) DependentCoawaitExpr(Empty);4267break;42684269case EXPR_CONCEPT_SPECIALIZATION: {4270S = new (Context) ConceptSpecializationExpr(Empty);4271break;4272}4273case STMT_OPENACC_COMPUTE_CONSTRUCT: {4274unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4275S = OpenACCComputeConstruct::CreateEmpty(Context, NumClauses);4276break;4277}4278case STMT_OPENACC_LOOP_CONSTRUCT: {4279unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];4280S = OpenACCLoopConstruct::CreateEmpty(Context, NumClauses);4281break;4282}4283case EXPR_REQUIRES:4284unsigned numLocalParameters = Record[ASTStmtReader::NumExprFields];4285unsigned numRequirement = Record[ASTStmtReader::NumExprFields + 1];4286S = RequiresExpr::Create(Context, Empty, numLocalParameters,4287numRequirement);4288break;4289}42904291// We hit a STMT_STOP, so we're done with this expression.4292if (Finished)4293break;42944295++NumStatementsRead;42964297if (S && !IsStmtReference) {4298Reader.Visit(S);4299StmtEntries[Cursor.GetCurrentBitNo()] = S;4300}43014302assert(Record.getIdx() == Record.size() &&4303"Invalid deserialization of statement");4304StmtStack.push_back(S);4305}4306Done:4307assert(StmtStack.size() > PrevNumStmts && "Read too many sub-stmts!");4308assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");4309return StmtStack.pop_back_val();4310}431143124313