xref: /netbsd-src/external/apache2/llvm/dist/clang/lib/Serialization/ASTWriterStmt.cpp (revision e038c9c4676b0f19b1b7dd08a940c6ed64a6d5ae)
17330f729Sjoerg //===--- ASTWriterStmt.cpp - Statement and Expression Serialization -------===//
27330f729Sjoerg //
37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg //
77330f729Sjoerg //===----------------------------------------------------------------------===//
87330f729Sjoerg ///
97330f729Sjoerg /// \file
107330f729Sjoerg /// Implements serialization for Statements and Expressions.
117330f729Sjoerg ///
127330f729Sjoerg //===----------------------------------------------------------------------===//
137330f729Sjoerg 
14*e038c9c4Sjoerg #include "clang/AST/ExprOpenMP.h"
15*e038c9c4Sjoerg #include "clang/Serialization/ASTRecordWriter.h"
16*e038c9c4Sjoerg #include "clang/Sema/DeclSpec.h"
177330f729Sjoerg #include "clang/AST/ASTContext.h"
187330f729Sjoerg #include "clang/AST/DeclCXX.h"
197330f729Sjoerg #include "clang/AST/DeclObjC.h"
207330f729Sjoerg #include "clang/AST/DeclTemplate.h"
217330f729Sjoerg #include "clang/AST/StmtVisitor.h"
227330f729Sjoerg #include "clang/Lex/Token.h"
237330f729Sjoerg #include "llvm/Bitstream/BitstreamWriter.h"
247330f729Sjoerg using namespace clang;
257330f729Sjoerg 
267330f729Sjoerg //===----------------------------------------------------------------------===//
277330f729Sjoerg // Statement/expression serialization
287330f729Sjoerg //===----------------------------------------------------------------------===//
297330f729Sjoerg 
307330f729Sjoerg namespace clang {
317330f729Sjoerg 
327330f729Sjoerg   class ASTStmtWriter : public StmtVisitor<ASTStmtWriter, void> {
337330f729Sjoerg     ASTWriter &Writer;
347330f729Sjoerg     ASTRecordWriter Record;
357330f729Sjoerg 
367330f729Sjoerg     serialization::StmtCode Code;
377330f729Sjoerg     unsigned AbbrevToUse;
387330f729Sjoerg 
397330f729Sjoerg   public:
ASTStmtWriter(ASTWriter & Writer,ASTWriter::RecordData & Record)407330f729Sjoerg     ASTStmtWriter(ASTWriter &Writer, ASTWriter::RecordData &Record)
417330f729Sjoerg         : Writer(Writer), Record(Writer, Record),
427330f729Sjoerg           Code(serialization::STMT_NULL_PTR), AbbrevToUse(0) {}
437330f729Sjoerg 
447330f729Sjoerg     ASTStmtWriter(const ASTStmtWriter&) = delete;
457330f729Sjoerg 
Emit()467330f729Sjoerg     uint64_t Emit() {
477330f729Sjoerg       assert(Code != serialization::STMT_NULL_PTR &&
487330f729Sjoerg              "unhandled sub-statement writing AST file");
497330f729Sjoerg       return Record.EmitStmt(Code, AbbrevToUse);
507330f729Sjoerg     }
517330f729Sjoerg 
527330f729Sjoerg     void AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo &ArgInfo,
537330f729Sjoerg                                   const TemplateArgumentLoc *Args);
547330f729Sjoerg 
557330f729Sjoerg     void VisitStmt(Stmt *S);
567330f729Sjoerg #define STMT(Type, Base) \
577330f729Sjoerg     void Visit##Type(Type *);
587330f729Sjoerg #include "clang/AST/StmtNodes.inc"
597330f729Sjoerg   };
607330f729Sjoerg }
617330f729Sjoerg 
AddTemplateKWAndArgsInfo(const ASTTemplateKWAndArgsInfo & ArgInfo,const TemplateArgumentLoc * Args)627330f729Sjoerg void ASTStmtWriter::AddTemplateKWAndArgsInfo(
637330f729Sjoerg     const ASTTemplateKWAndArgsInfo &ArgInfo, const TemplateArgumentLoc *Args) {
647330f729Sjoerg   Record.AddSourceLocation(ArgInfo.TemplateKWLoc);
657330f729Sjoerg   Record.AddSourceLocation(ArgInfo.LAngleLoc);
667330f729Sjoerg   Record.AddSourceLocation(ArgInfo.RAngleLoc);
677330f729Sjoerg   for (unsigned i = 0; i != ArgInfo.NumTemplateArgs; ++i)
687330f729Sjoerg     Record.AddTemplateArgumentLoc(Args[i]);
697330f729Sjoerg }
707330f729Sjoerg 
VisitStmt(Stmt * S)717330f729Sjoerg void ASTStmtWriter::VisitStmt(Stmt *S) {
727330f729Sjoerg }
737330f729Sjoerg 
VisitNullStmt(NullStmt * S)747330f729Sjoerg void ASTStmtWriter::VisitNullStmt(NullStmt *S) {
757330f729Sjoerg   VisitStmt(S);
767330f729Sjoerg   Record.AddSourceLocation(S->getSemiLoc());
777330f729Sjoerg   Record.push_back(S->NullStmtBits.HasLeadingEmptyMacro);
787330f729Sjoerg   Code = serialization::STMT_NULL;
797330f729Sjoerg }
807330f729Sjoerg 
VisitCompoundStmt(CompoundStmt * S)817330f729Sjoerg void ASTStmtWriter::VisitCompoundStmt(CompoundStmt *S) {
827330f729Sjoerg   VisitStmt(S);
837330f729Sjoerg   Record.push_back(S->size());
847330f729Sjoerg   for (auto *CS : S->body())
857330f729Sjoerg     Record.AddStmt(CS);
867330f729Sjoerg   Record.AddSourceLocation(S->getLBracLoc());
877330f729Sjoerg   Record.AddSourceLocation(S->getRBracLoc());
887330f729Sjoerg   Code = serialization::STMT_COMPOUND;
897330f729Sjoerg }
907330f729Sjoerg 
VisitSwitchCase(SwitchCase * S)917330f729Sjoerg void ASTStmtWriter::VisitSwitchCase(SwitchCase *S) {
927330f729Sjoerg   VisitStmt(S);
937330f729Sjoerg   Record.push_back(Writer.getSwitchCaseID(S));
947330f729Sjoerg   Record.AddSourceLocation(S->getKeywordLoc());
957330f729Sjoerg   Record.AddSourceLocation(S->getColonLoc());
967330f729Sjoerg }
977330f729Sjoerg 
VisitCaseStmt(CaseStmt * S)987330f729Sjoerg void ASTStmtWriter::VisitCaseStmt(CaseStmt *S) {
997330f729Sjoerg   VisitSwitchCase(S);
1007330f729Sjoerg   Record.push_back(S->caseStmtIsGNURange());
1017330f729Sjoerg   Record.AddStmt(S->getLHS());
1027330f729Sjoerg   Record.AddStmt(S->getSubStmt());
1037330f729Sjoerg   if (S->caseStmtIsGNURange()) {
1047330f729Sjoerg     Record.AddStmt(S->getRHS());
1057330f729Sjoerg     Record.AddSourceLocation(S->getEllipsisLoc());
1067330f729Sjoerg   }
1077330f729Sjoerg   Code = serialization::STMT_CASE;
1087330f729Sjoerg }
1097330f729Sjoerg 
VisitDefaultStmt(DefaultStmt * S)1107330f729Sjoerg void ASTStmtWriter::VisitDefaultStmt(DefaultStmt *S) {
1117330f729Sjoerg   VisitSwitchCase(S);
1127330f729Sjoerg   Record.AddStmt(S->getSubStmt());
1137330f729Sjoerg   Code = serialization::STMT_DEFAULT;
1147330f729Sjoerg }
1157330f729Sjoerg 
VisitLabelStmt(LabelStmt * S)1167330f729Sjoerg void ASTStmtWriter::VisitLabelStmt(LabelStmt *S) {
1177330f729Sjoerg   VisitStmt(S);
118*e038c9c4Sjoerg   Record.push_back(S->isSideEntry());
1197330f729Sjoerg   Record.AddDeclRef(S->getDecl());
1207330f729Sjoerg   Record.AddStmt(S->getSubStmt());
1217330f729Sjoerg   Record.AddSourceLocation(S->getIdentLoc());
1227330f729Sjoerg   Code = serialization::STMT_LABEL;
1237330f729Sjoerg }
1247330f729Sjoerg 
VisitAttributedStmt(AttributedStmt * S)1257330f729Sjoerg void ASTStmtWriter::VisitAttributedStmt(AttributedStmt *S) {
1267330f729Sjoerg   VisitStmt(S);
1277330f729Sjoerg   Record.push_back(S->getAttrs().size());
1287330f729Sjoerg   Record.AddAttributes(S->getAttrs());
1297330f729Sjoerg   Record.AddStmt(S->getSubStmt());
1307330f729Sjoerg   Record.AddSourceLocation(S->getAttrLoc());
1317330f729Sjoerg   Code = serialization::STMT_ATTRIBUTED;
1327330f729Sjoerg }
1337330f729Sjoerg 
VisitIfStmt(IfStmt * S)1347330f729Sjoerg void ASTStmtWriter::VisitIfStmt(IfStmt *S) {
1357330f729Sjoerg   VisitStmt(S);
1367330f729Sjoerg 
1377330f729Sjoerg   bool HasElse = S->getElse() != nullptr;
1387330f729Sjoerg   bool HasVar = S->getConditionVariableDeclStmt() != nullptr;
1397330f729Sjoerg   bool HasInit = S->getInit() != nullptr;
1407330f729Sjoerg 
1417330f729Sjoerg   Record.push_back(S->isConstexpr());
1427330f729Sjoerg   Record.push_back(HasElse);
1437330f729Sjoerg   Record.push_back(HasVar);
1447330f729Sjoerg   Record.push_back(HasInit);
1457330f729Sjoerg 
1467330f729Sjoerg   Record.AddStmt(S->getCond());
1477330f729Sjoerg   Record.AddStmt(S->getThen());
1487330f729Sjoerg   if (HasElse)
1497330f729Sjoerg     Record.AddStmt(S->getElse());
1507330f729Sjoerg   if (HasVar)
1517330f729Sjoerg     Record.AddDeclRef(S->getConditionVariable());
1527330f729Sjoerg   if (HasInit)
1537330f729Sjoerg     Record.AddStmt(S->getInit());
1547330f729Sjoerg 
1557330f729Sjoerg   Record.AddSourceLocation(S->getIfLoc());
156*e038c9c4Sjoerg   Record.AddSourceLocation(S->getLParenLoc());
157*e038c9c4Sjoerg   Record.AddSourceLocation(S->getRParenLoc());
1587330f729Sjoerg   if (HasElse)
1597330f729Sjoerg     Record.AddSourceLocation(S->getElseLoc());
1607330f729Sjoerg 
1617330f729Sjoerg   Code = serialization::STMT_IF;
1627330f729Sjoerg }
1637330f729Sjoerg 
VisitSwitchStmt(SwitchStmt * S)1647330f729Sjoerg void ASTStmtWriter::VisitSwitchStmt(SwitchStmt *S) {
1657330f729Sjoerg   VisitStmt(S);
1667330f729Sjoerg 
1677330f729Sjoerg   bool HasInit = S->getInit() != nullptr;
1687330f729Sjoerg   bool HasVar = S->getConditionVariableDeclStmt() != nullptr;
1697330f729Sjoerg   Record.push_back(HasInit);
1707330f729Sjoerg   Record.push_back(HasVar);
1717330f729Sjoerg   Record.push_back(S->isAllEnumCasesCovered());
1727330f729Sjoerg 
1737330f729Sjoerg   Record.AddStmt(S->getCond());
1747330f729Sjoerg   Record.AddStmt(S->getBody());
1757330f729Sjoerg   if (HasInit)
1767330f729Sjoerg     Record.AddStmt(S->getInit());
1777330f729Sjoerg   if (HasVar)
1787330f729Sjoerg     Record.AddDeclRef(S->getConditionVariable());
1797330f729Sjoerg 
1807330f729Sjoerg   Record.AddSourceLocation(S->getSwitchLoc());
181*e038c9c4Sjoerg   Record.AddSourceLocation(S->getLParenLoc());
182*e038c9c4Sjoerg   Record.AddSourceLocation(S->getRParenLoc());
1837330f729Sjoerg 
1847330f729Sjoerg   for (SwitchCase *SC = S->getSwitchCaseList(); SC;
1857330f729Sjoerg        SC = SC->getNextSwitchCase())
1867330f729Sjoerg     Record.push_back(Writer.RecordSwitchCaseID(SC));
1877330f729Sjoerg   Code = serialization::STMT_SWITCH;
1887330f729Sjoerg }
1897330f729Sjoerg 
VisitWhileStmt(WhileStmt * S)1907330f729Sjoerg void ASTStmtWriter::VisitWhileStmt(WhileStmt *S) {
1917330f729Sjoerg   VisitStmt(S);
1927330f729Sjoerg 
1937330f729Sjoerg   bool HasVar = S->getConditionVariableDeclStmt() != nullptr;
1947330f729Sjoerg   Record.push_back(HasVar);
1957330f729Sjoerg 
1967330f729Sjoerg   Record.AddStmt(S->getCond());
1977330f729Sjoerg   Record.AddStmt(S->getBody());
1987330f729Sjoerg   if (HasVar)
1997330f729Sjoerg     Record.AddDeclRef(S->getConditionVariable());
2007330f729Sjoerg 
2017330f729Sjoerg   Record.AddSourceLocation(S->getWhileLoc());
202*e038c9c4Sjoerg   Record.AddSourceLocation(S->getLParenLoc());
203*e038c9c4Sjoerg   Record.AddSourceLocation(S->getRParenLoc());
2047330f729Sjoerg   Code = serialization::STMT_WHILE;
2057330f729Sjoerg }
2067330f729Sjoerg 
VisitDoStmt(DoStmt * S)2077330f729Sjoerg void ASTStmtWriter::VisitDoStmt(DoStmt *S) {
2087330f729Sjoerg   VisitStmt(S);
2097330f729Sjoerg   Record.AddStmt(S->getCond());
2107330f729Sjoerg   Record.AddStmt(S->getBody());
2117330f729Sjoerg   Record.AddSourceLocation(S->getDoLoc());
2127330f729Sjoerg   Record.AddSourceLocation(S->getWhileLoc());
2137330f729Sjoerg   Record.AddSourceLocation(S->getRParenLoc());
2147330f729Sjoerg   Code = serialization::STMT_DO;
2157330f729Sjoerg }
2167330f729Sjoerg 
VisitForStmt(ForStmt * S)2177330f729Sjoerg void ASTStmtWriter::VisitForStmt(ForStmt *S) {
2187330f729Sjoerg   VisitStmt(S);
2197330f729Sjoerg   Record.AddStmt(S->getInit());
2207330f729Sjoerg   Record.AddStmt(S->getCond());
2217330f729Sjoerg   Record.AddDeclRef(S->getConditionVariable());
2227330f729Sjoerg   Record.AddStmt(S->getInc());
2237330f729Sjoerg   Record.AddStmt(S->getBody());
2247330f729Sjoerg   Record.AddSourceLocation(S->getForLoc());
2257330f729Sjoerg   Record.AddSourceLocation(S->getLParenLoc());
2267330f729Sjoerg   Record.AddSourceLocation(S->getRParenLoc());
2277330f729Sjoerg   Code = serialization::STMT_FOR;
2287330f729Sjoerg }
2297330f729Sjoerg 
VisitGotoStmt(GotoStmt * S)2307330f729Sjoerg void ASTStmtWriter::VisitGotoStmt(GotoStmt *S) {
2317330f729Sjoerg   VisitStmt(S);
2327330f729Sjoerg   Record.AddDeclRef(S->getLabel());
2337330f729Sjoerg   Record.AddSourceLocation(S->getGotoLoc());
2347330f729Sjoerg   Record.AddSourceLocation(S->getLabelLoc());
2357330f729Sjoerg   Code = serialization::STMT_GOTO;
2367330f729Sjoerg }
2377330f729Sjoerg 
VisitIndirectGotoStmt(IndirectGotoStmt * S)2387330f729Sjoerg void ASTStmtWriter::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
2397330f729Sjoerg   VisitStmt(S);
2407330f729Sjoerg   Record.AddSourceLocation(S->getGotoLoc());
2417330f729Sjoerg   Record.AddSourceLocation(S->getStarLoc());
2427330f729Sjoerg   Record.AddStmt(S->getTarget());
2437330f729Sjoerg   Code = serialization::STMT_INDIRECT_GOTO;
2447330f729Sjoerg }
2457330f729Sjoerg 
VisitContinueStmt(ContinueStmt * S)2467330f729Sjoerg void ASTStmtWriter::VisitContinueStmt(ContinueStmt *S) {
2477330f729Sjoerg   VisitStmt(S);
2487330f729Sjoerg   Record.AddSourceLocation(S->getContinueLoc());
2497330f729Sjoerg   Code = serialization::STMT_CONTINUE;
2507330f729Sjoerg }
2517330f729Sjoerg 
VisitBreakStmt(BreakStmt * S)2527330f729Sjoerg void ASTStmtWriter::VisitBreakStmt(BreakStmt *S) {
2537330f729Sjoerg   VisitStmt(S);
2547330f729Sjoerg   Record.AddSourceLocation(S->getBreakLoc());
2557330f729Sjoerg   Code = serialization::STMT_BREAK;
2567330f729Sjoerg }
2577330f729Sjoerg 
VisitReturnStmt(ReturnStmt * S)2587330f729Sjoerg void ASTStmtWriter::VisitReturnStmt(ReturnStmt *S) {
2597330f729Sjoerg   VisitStmt(S);
2607330f729Sjoerg 
2617330f729Sjoerg   bool HasNRVOCandidate = S->getNRVOCandidate() != nullptr;
2627330f729Sjoerg   Record.push_back(HasNRVOCandidate);
2637330f729Sjoerg 
2647330f729Sjoerg   Record.AddStmt(S->getRetValue());
2657330f729Sjoerg   if (HasNRVOCandidate)
2667330f729Sjoerg     Record.AddDeclRef(S->getNRVOCandidate());
2677330f729Sjoerg 
2687330f729Sjoerg   Record.AddSourceLocation(S->getReturnLoc());
2697330f729Sjoerg   Code = serialization::STMT_RETURN;
2707330f729Sjoerg }
2717330f729Sjoerg 
VisitDeclStmt(DeclStmt * S)2727330f729Sjoerg void ASTStmtWriter::VisitDeclStmt(DeclStmt *S) {
2737330f729Sjoerg   VisitStmt(S);
2747330f729Sjoerg   Record.AddSourceLocation(S->getBeginLoc());
2757330f729Sjoerg   Record.AddSourceLocation(S->getEndLoc());
2767330f729Sjoerg   DeclGroupRef DG = S->getDeclGroup();
2777330f729Sjoerg   for (DeclGroupRef::iterator D = DG.begin(), DEnd = DG.end(); D != DEnd; ++D)
2787330f729Sjoerg     Record.AddDeclRef(*D);
2797330f729Sjoerg   Code = serialization::STMT_DECL;
2807330f729Sjoerg }
2817330f729Sjoerg 
VisitAsmStmt(AsmStmt * S)2827330f729Sjoerg void ASTStmtWriter::VisitAsmStmt(AsmStmt *S) {
2837330f729Sjoerg   VisitStmt(S);
2847330f729Sjoerg   Record.push_back(S->getNumOutputs());
2857330f729Sjoerg   Record.push_back(S->getNumInputs());
2867330f729Sjoerg   Record.push_back(S->getNumClobbers());
2877330f729Sjoerg   Record.AddSourceLocation(S->getAsmLoc());
2887330f729Sjoerg   Record.push_back(S->isVolatile());
2897330f729Sjoerg   Record.push_back(S->isSimple());
2907330f729Sjoerg }
2917330f729Sjoerg 
VisitGCCAsmStmt(GCCAsmStmt * S)2927330f729Sjoerg void ASTStmtWriter::VisitGCCAsmStmt(GCCAsmStmt *S) {
2937330f729Sjoerg   VisitAsmStmt(S);
2947330f729Sjoerg   Record.push_back(S->getNumLabels());
2957330f729Sjoerg   Record.AddSourceLocation(S->getRParenLoc());
2967330f729Sjoerg   Record.AddStmt(S->getAsmString());
2977330f729Sjoerg 
2987330f729Sjoerg   // Outputs
2997330f729Sjoerg   for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
3007330f729Sjoerg     Record.AddIdentifierRef(S->getOutputIdentifier(I));
3017330f729Sjoerg     Record.AddStmt(S->getOutputConstraintLiteral(I));
3027330f729Sjoerg     Record.AddStmt(S->getOutputExpr(I));
3037330f729Sjoerg   }
3047330f729Sjoerg 
3057330f729Sjoerg   // Inputs
3067330f729Sjoerg   for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
3077330f729Sjoerg     Record.AddIdentifierRef(S->getInputIdentifier(I));
3087330f729Sjoerg     Record.AddStmt(S->getInputConstraintLiteral(I));
3097330f729Sjoerg     Record.AddStmt(S->getInputExpr(I));
3107330f729Sjoerg   }
3117330f729Sjoerg 
3127330f729Sjoerg   // Clobbers
3137330f729Sjoerg   for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I)
3147330f729Sjoerg     Record.AddStmt(S->getClobberStringLiteral(I));
3157330f729Sjoerg 
3167330f729Sjoerg   // Labels
3177330f729Sjoerg   for (auto *E : S->labels()) Record.AddStmt(E);
3187330f729Sjoerg 
3197330f729Sjoerg   Code = serialization::STMT_GCCASM;
3207330f729Sjoerg }
3217330f729Sjoerg 
VisitMSAsmStmt(MSAsmStmt * S)3227330f729Sjoerg void ASTStmtWriter::VisitMSAsmStmt(MSAsmStmt *S) {
3237330f729Sjoerg   VisitAsmStmt(S);
3247330f729Sjoerg   Record.AddSourceLocation(S->getLBraceLoc());
3257330f729Sjoerg   Record.AddSourceLocation(S->getEndLoc());
3267330f729Sjoerg   Record.push_back(S->getNumAsmToks());
3277330f729Sjoerg   Record.AddString(S->getAsmString());
3287330f729Sjoerg 
3297330f729Sjoerg   // Tokens
3307330f729Sjoerg   for (unsigned I = 0, N = S->getNumAsmToks(); I != N; ++I) {
3317330f729Sjoerg     // FIXME: Move this to ASTRecordWriter?
3327330f729Sjoerg     Writer.AddToken(S->getAsmToks()[I], Record.getRecordData());
3337330f729Sjoerg   }
3347330f729Sjoerg 
3357330f729Sjoerg   // Clobbers
3367330f729Sjoerg   for (unsigned I = 0, N = S->getNumClobbers(); I != N; ++I) {
3377330f729Sjoerg     Record.AddString(S->getClobber(I));
3387330f729Sjoerg   }
3397330f729Sjoerg 
3407330f729Sjoerg   // Outputs
3417330f729Sjoerg   for (unsigned I = 0, N = S->getNumOutputs(); I != N; ++I) {
3427330f729Sjoerg     Record.AddStmt(S->getOutputExpr(I));
3437330f729Sjoerg     Record.AddString(S->getOutputConstraint(I));
3447330f729Sjoerg   }
3457330f729Sjoerg 
3467330f729Sjoerg   // Inputs
3477330f729Sjoerg   for (unsigned I = 0, N = S->getNumInputs(); I != N; ++I) {
3487330f729Sjoerg     Record.AddStmt(S->getInputExpr(I));
3497330f729Sjoerg     Record.AddString(S->getInputConstraint(I));
3507330f729Sjoerg   }
3517330f729Sjoerg 
3527330f729Sjoerg   Code = serialization::STMT_MSASM;
3537330f729Sjoerg }
3547330f729Sjoerg 
VisitCoroutineBodyStmt(CoroutineBodyStmt * CoroStmt)3557330f729Sjoerg void ASTStmtWriter::VisitCoroutineBodyStmt(CoroutineBodyStmt *CoroStmt) {
3567330f729Sjoerg   VisitStmt(CoroStmt);
3577330f729Sjoerg   Record.push_back(CoroStmt->getParamMoves().size());
3587330f729Sjoerg   for (Stmt *S : CoroStmt->children())
3597330f729Sjoerg     Record.AddStmt(S);
3607330f729Sjoerg   Code = serialization::STMT_COROUTINE_BODY;
3617330f729Sjoerg }
3627330f729Sjoerg 
VisitCoreturnStmt(CoreturnStmt * S)3637330f729Sjoerg void ASTStmtWriter::VisitCoreturnStmt(CoreturnStmt *S) {
3647330f729Sjoerg   VisitStmt(S);
3657330f729Sjoerg   Record.AddSourceLocation(S->getKeywordLoc());
3667330f729Sjoerg   Record.AddStmt(S->getOperand());
3677330f729Sjoerg   Record.AddStmt(S->getPromiseCall());
3687330f729Sjoerg   Record.push_back(S->isImplicit());
3697330f729Sjoerg   Code = serialization::STMT_CORETURN;
3707330f729Sjoerg }
3717330f729Sjoerg 
VisitCoroutineSuspendExpr(CoroutineSuspendExpr * E)3727330f729Sjoerg void ASTStmtWriter::VisitCoroutineSuspendExpr(CoroutineSuspendExpr *E) {
3737330f729Sjoerg   VisitExpr(E);
3747330f729Sjoerg   Record.AddSourceLocation(E->getKeywordLoc());
3757330f729Sjoerg   for (Stmt *S : E->children())
3767330f729Sjoerg     Record.AddStmt(S);
3777330f729Sjoerg   Record.AddStmt(E->getOpaqueValue());
3787330f729Sjoerg }
3797330f729Sjoerg 
VisitCoawaitExpr(CoawaitExpr * E)3807330f729Sjoerg void ASTStmtWriter::VisitCoawaitExpr(CoawaitExpr *E) {
3817330f729Sjoerg   VisitCoroutineSuspendExpr(E);
3827330f729Sjoerg   Record.push_back(E->isImplicit());
3837330f729Sjoerg   Code = serialization::EXPR_COAWAIT;
3847330f729Sjoerg }
3857330f729Sjoerg 
VisitCoyieldExpr(CoyieldExpr * E)3867330f729Sjoerg void ASTStmtWriter::VisitCoyieldExpr(CoyieldExpr *E) {
3877330f729Sjoerg   VisitCoroutineSuspendExpr(E);
3887330f729Sjoerg   Code = serialization::EXPR_COYIELD;
3897330f729Sjoerg }
3907330f729Sjoerg 
VisitDependentCoawaitExpr(DependentCoawaitExpr * E)3917330f729Sjoerg void ASTStmtWriter::VisitDependentCoawaitExpr(DependentCoawaitExpr *E) {
3927330f729Sjoerg   VisitExpr(E);
3937330f729Sjoerg   Record.AddSourceLocation(E->getKeywordLoc());
3947330f729Sjoerg   for (Stmt *S : E->children())
3957330f729Sjoerg     Record.AddStmt(S);
3967330f729Sjoerg   Code = serialization::EXPR_DEPENDENT_COAWAIT;
3977330f729Sjoerg }
3987330f729Sjoerg 
399*e038c9c4Sjoerg static void
addConstraintSatisfaction(ASTRecordWriter & Record,const ASTConstraintSatisfaction & Satisfaction)400*e038c9c4Sjoerg addConstraintSatisfaction(ASTRecordWriter &Record,
401*e038c9c4Sjoerg                           const ASTConstraintSatisfaction &Satisfaction) {
402*e038c9c4Sjoerg   Record.push_back(Satisfaction.IsSatisfied);
403*e038c9c4Sjoerg   if (!Satisfaction.IsSatisfied) {
404*e038c9c4Sjoerg     Record.push_back(Satisfaction.NumRecords);
405*e038c9c4Sjoerg     for (const auto &DetailRecord : Satisfaction) {
406*e038c9c4Sjoerg       Record.AddStmt(const_cast<Expr *>(DetailRecord.first));
407*e038c9c4Sjoerg       auto *E = DetailRecord.second.dyn_cast<Expr *>();
408*e038c9c4Sjoerg       Record.push_back(E == nullptr);
409*e038c9c4Sjoerg       if (E)
410*e038c9c4Sjoerg         Record.AddStmt(E);
411*e038c9c4Sjoerg       else {
412*e038c9c4Sjoerg         auto *Diag = DetailRecord.second.get<std::pair<SourceLocation,
413*e038c9c4Sjoerg                                                        StringRef> *>();
414*e038c9c4Sjoerg         Record.AddSourceLocation(Diag->first);
415*e038c9c4Sjoerg         Record.AddString(Diag->second);
416*e038c9c4Sjoerg       }
417*e038c9c4Sjoerg     }
418*e038c9c4Sjoerg   }
419*e038c9c4Sjoerg }
420*e038c9c4Sjoerg 
421*e038c9c4Sjoerg static void
addSubstitutionDiagnostic(ASTRecordWriter & Record,const concepts::Requirement::SubstitutionDiagnostic * D)422*e038c9c4Sjoerg addSubstitutionDiagnostic(
423*e038c9c4Sjoerg     ASTRecordWriter &Record,
424*e038c9c4Sjoerg     const concepts::Requirement::SubstitutionDiagnostic *D) {
425*e038c9c4Sjoerg   Record.AddString(D->SubstitutedEntity);
426*e038c9c4Sjoerg   Record.AddSourceLocation(D->DiagLoc);
427*e038c9c4Sjoerg   Record.AddString(D->DiagMessage);
428*e038c9c4Sjoerg }
429*e038c9c4Sjoerg 
VisitConceptSpecializationExpr(ConceptSpecializationExpr * E)4307330f729Sjoerg void ASTStmtWriter::VisitConceptSpecializationExpr(
4317330f729Sjoerg         ConceptSpecializationExpr *E) {
4327330f729Sjoerg   VisitExpr(E);
4337330f729Sjoerg   ArrayRef<TemplateArgument> TemplateArgs = E->getTemplateArguments();
4347330f729Sjoerg   Record.push_back(TemplateArgs.size());
4357330f729Sjoerg   Record.AddNestedNameSpecifierLoc(E->getNestedNameSpecifierLoc());
4367330f729Sjoerg   Record.AddSourceLocation(E->getTemplateKWLoc());
437*e038c9c4Sjoerg   Record.AddDeclarationNameInfo(E->getConceptNameInfo());
4387330f729Sjoerg   Record.AddDeclRef(E->getNamedConcept());
439*e038c9c4Sjoerg   Record.AddDeclRef(E->getFoundDecl());
4407330f729Sjoerg   Record.AddASTTemplateArgumentListInfo(E->getTemplateArgsAsWritten());
4417330f729Sjoerg   for (const TemplateArgument &Arg : TemplateArgs)
4427330f729Sjoerg     Record.AddTemplateArgument(Arg);
443*e038c9c4Sjoerg   if (!E->isValueDependent())
444*e038c9c4Sjoerg     addConstraintSatisfaction(Record, E->getSatisfaction());
445*e038c9c4Sjoerg 
4467330f729Sjoerg   Code = serialization::EXPR_CONCEPT_SPECIALIZATION;
4477330f729Sjoerg }
4487330f729Sjoerg 
VisitRequiresExpr(RequiresExpr * E)449*e038c9c4Sjoerg void ASTStmtWriter::VisitRequiresExpr(RequiresExpr *E) {
450*e038c9c4Sjoerg   VisitExpr(E);
451*e038c9c4Sjoerg   Record.push_back(E->getLocalParameters().size());
452*e038c9c4Sjoerg   Record.push_back(E->getRequirements().size());
453*e038c9c4Sjoerg   Record.AddSourceLocation(E->RequiresExprBits.RequiresKWLoc);
454*e038c9c4Sjoerg   Record.push_back(E->RequiresExprBits.IsSatisfied);
455*e038c9c4Sjoerg   Record.AddDeclRef(E->getBody());
456*e038c9c4Sjoerg   for (ParmVarDecl *P : E->getLocalParameters())
457*e038c9c4Sjoerg     Record.AddDeclRef(P);
458*e038c9c4Sjoerg   for (concepts::Requirement *R : E->getRequirements()) {
459*e038c9c4Sjoerg     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(R)) {
460*e038c9c4Sjoerg       Record.push_back(concepts::Requirement::RK_Type);
461*e038c9c4Sjoerg       Record.push_back(TypeReq->Status);
462*e038c9c4Sjoerg       if (TypeReq->Status == concepts::TypeRequirement::SS_SubstitutionFailure)
463*e038c9c4Sjoerg         addSubstitutionDiagnostic(Record, TypeReq->getSubstitutionDiagnostic());
464*e038c9c4Sjoerg       else
465*e038c9c4Sjoerg         Record.AddTypeSourceInfo(TypeReq->getType());
466*e038c9c4Sjoerg     } else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(R)) {
467*e038c9c4Sjoerg       Record.push_back(ExprReq->getKind());
468*e038c9c4Sjoerg       Record.push_back(ExprReq->Status);
469*e038c9c4Sjoerg       if (ExprReq->isExprSubstitutionFailure()) {
470*e038c9c4Sjoerg         addSubstitutionDiagnostic(Record,
471*e038c9c4Sjoerg          ExprReq->Value.get<concepts::Requirement::SubstitutionDiagnostic *>());
472*e038c9c4Sjoerg       } else
473*e038c9c4Sjoerg         Record.AddStmt(ExprReq->Value.get<Expr *>());
474*e038c9c4Sjoerg       if (ExprReq->getKind() == concepts::Requirement::RK_Compound) {
475*e038c9c4Sjoerg         Record.AddSourceLocation(ExprReq->NoexceptLoc);
476*e038c9c4Sjoerg         const auto &RetReq = ExprReq->getReturnTypeRequirement();
477*e038c9c4Sjoerg         if (RetReq.isSubstitutionFailure()) {
478*e038c9c4Sjoerg           Record.push_back(2);
479*e038c9c4Sjoerg           addSubstitutionDiagnostic(Record, RetReq.getSubstitutionDiagnostic());
480*e038c9c4Sjoerg         } else if (RetReq.isTypeConstraint()) {
481*e038c9c4Sjoerg           Record.push_back(1);
482*e038c9c4Sjoerg           Record.AddTemplateParameterList(
483*e038c9c4Sjoerg               RetReq.getTypeConstraintTemplateParameterList());
484*e038c9c4Sjoerg           if (ExprReq->Status >=
485*e038c9c4Sjoerg               concepts::ExprRequirement::SS_ConstraintsNotSatisfied)
486*e038c9c4Sjoerg             Record.AddStmt(
487*e038c9c4Sjoerg                 ExprReq->getReturnTypeRequirementSubstitutedConstraintExpr());
488*e038c9c4Sjoerg         } else {
489*e038c9c4Sjoerg           assert(RetReq.isEmpty());
490*e038c9c4Sjoerg           Record.push_back(0);
491*e038c9c4Sjoerg         }
492*e038c9c4Sjoerg       }
493*e038c9c4Sjoerg     } else {
494*e038c9c4Sjoerg       auto *NestedReq = cast<concepts::NestedRequirement>(R);
495*e038c9c4Sjoerg       Record.push_back(concepts::Requirement::RK_Nested);
496*e038c9c4Sjoerg       Record.push_back(NestedReq->isSubstitutionFailure());
497*e038c9c4Sjoerg       if (NestedReq->isSubstitutionFailure()){
498*e038c9c4Sjoerg         addSubstitutionDiagnostic(Record,
499*e038c9c4Sjoerg                                   NestedReq->getSubstitutionDiagnostic());
500*e038c9c4Sjoerg       } else {
501*e038c9c4Sjoerg         Record.AddStmt(NestedReq->Value.get<Expr *>());
502*e038c9c4Sjoerg         if (!NestedReq->isDependent())
503*e038c9c4Sjoerg           addConstraintSatisfaction(Record, *NestedReq->Satisfaction);
504*e038c9c4Sjoerg       }
505*e038c9c4Sjoerg     }
506*e038c9c4Sjoerg   }
507*e038c9c4Sjoerg   Record.AddSourceLocation(E->getEndLoc());
508*e038c9c4Sjoerg 
509*e038c9c4Sjoerg   Code = serialization::EXPR_REQUIRES;
510*e038c9c4Sjoerg }
511*e038c9c4Sjoerg 
5127330f729Sjoerg 
VisitCapturedStmt(CapturedStmt * S)5137330f729Sjoerg void ASTStmtWriter::VisitCapturedStmt(CapturedStmt *S) {
5147330f729Sjoerg   VisitStmt(S);
5157330f729Sjoerg   // NumCaptures
5167330f729Sjoerg   Record.push_back(std::distance(S->capture_begin(), S->capture_end()));
5177330f729Sjoerg 
5187330f729Sjoerg   // CapturedDecl and captured region kind
5197330f729Sjoerg   Record.AddDeclRef(S->getCapturedDecl());
5207330f729Sjoerg   Record.push_back(S->getCapturedRegionKind());
5217330f729Sjoerg 
5227330f729Sjoerg   Record.AddDeclRef(S->getCapturedRecordDecl());
5237330f729Sjoerg 
5247330f729Sjoerg   // Capture inits
5257330f729Sjoerg   for (auto *I : S->capture_inits())
5267330f729Sjoerg     Record.AddStmt(I);
5277330f729Sjoerg 
5287330f729Sjoerg   // Body
5297330f729Sjoerg   Record.AddStmt(S->getCapturedStmt());
5307330f729Sjoerg 
5317330f729Sjoerg   // Captures
5327330f729Sjoerg   for (const auto &I : S->captures()) {
5337330f729Sjoerg     if (I.capturesThis() || I.capturesVariableArrayType())
5347330f729Sjoerg       Record.AddDeclRef(nullptr);
5357330f729Sjoerg     else
5367330f729Sjoerg       Record.AddDeclRef(I.getCapturedVar());
5377330f729Sjoerg     Record.push_back(I.getCaptureKind());
5387330f729Sjoerg     Record.AddSourceLocation(I.getLocation());
5397330f729Sjoerg   }
5407330f729Sjoerg 
5417330f729Sjoerg   Code = serialization::STMT_CAPTURED;
5427330f729Sjoerg }
5437330f729Sjoerg 
VisitExpr(Expr * E)5447330f729Sjoerg void ASTStmtWriter::VisitExpr(Expr *E) {
5457330f729Sjoerg   VisitStmt(E);
5467330f729Sjoerg   Record.AddTypeRef(E->getType());
5477330f729Sjoerg   Record.push_back(E->isTypeDependent());
5487330f729Sjoerg   Record.push_back(E->isValueDependent());
5497330f729Sjoerg   Record.push_back(E->isInstantiationDependent());
5507330f729Sjoerg   Record.push_back(E->containsUnexpandedParameterPack());
551*e038c9c4Sjoerg   Record.push_back(E->containsErrors());
5527330f729Sjoerg   Record.push_back(E->getValueKind());
5537330f729Sjoerg   Record.push_back(E->getObjectKind());
5547330f729Sjoerg }
5557330f729Sjoerg 
VisitConstantExpr(ConstantExpr * E)5567330f729Sjoerg void ASTStmtWriter::VisitConstantExpr(ConstantExpr *E) {
5577330f729Sjoerg   VisitExpr(E);
558*e038c9c4Sjoerg   Record.push_back(E->ConstantExprBits.ResultKind);
559*e038c9c4Sjoerg 
560*e038c9c4Sjoerg   Record.push_back(E->ConstantExprBits.APValueKind);
561*e038c9c4Sjoerg   Record.push_back(E->ConstantExprBits.IsUnsigned);
562*e038c9c4Sjoerg   Record.push_back(E->ConstantExprBits.BitWidth);
563*e038c9c4Sjoerg   // HasCleanup not serialized since we can just query the APValue.
564*e038c9c4Sjoerg   Record.push_back(E->ConstantExprBits.IsImmediateInvocation);
565*e038c9c4Sjoerg 
5667330f729Sjoerg   switch (E->ConstantExprBits.ResultKind) {
567*e038c9c4Sjoerg   case ConstantExpr::RSK_None:
568*e038c9c4Sjoerg     break;
5697330f729Sjoerg   case ConstantExpr::RSK_Int64:
5707330f729Sjoerg     Record.push_back(E->Int64Result());
5717330f729Sjoerg     break;
5727330f729Sjoerg   case ConstantExpr::RSK_APValue:
5737330f729Sjoerg     Record.AddAPValue(E->APValueResult());
574*e038c9c4Sjoerg     break;
575*e038c9c4Sjoerg   default:
576*e038c9c4Sjoerg     llvm_unreachable("unexpected ResultKind!");
5777330f729Sjoerg   }
578*e038c9c4Sjoerg 
5797330f729Sjoerg   Record.AddStmt(E->getSubExpr());
5807330f729Sjoerg   Code = serialization::EXPR_CONSTANT;
5817330f729Sjoerg }
5827330f729Sjoerg 
VisitPredefinedExpr(PredefinedExpr * E)5837330f729Sjoerg void ASTStmtWriter::VisitPredefinedExpr(PredefinedExpr *E) {
5847330f729Sjoerg   VisitExpr(E);
5857330f729Sjoerg 
5867330f729Sjoerg   bool HasFunctionName = E->getFunctionName() != nullptr;
5877330f729Sjoerg   Record.push_back(HasFunctionName);
5887330f729Sjoerg   Record.push_back(E->getIdentKind()); // FIXME: stable encoding
5897330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
5907330f729Sjoerg   if (HasFunctionName)
5917330f729Sjoerg     Record.AddStmt(E->getFunctionName());
5927330f729Sjoerg   Code = serialization::EXPR_PREDEFINED;
5937330f729Sjoerg }
5947330f729Sjoerg 
VisitDeclRefExpr(DeclRefExpr * E)5957330f729Sjoerg void ASTStmtWriter::VisitDeclRefExpr(DeclRefExpr *E) {
5967330f729Sjoerg   VisitExpr(E);
5977330f729Sjoerg 
5987330f729Sjoerg   Record.push_back(E->hasQualifier());
5997330f729Sjoerg   Record.push_back(E->getDecl() != E->getFoundDecl());
6007330f729Sjoerg   Record.push_back(E->hasTemplateKWAndArgsInfo());
6017330f729Sjoerg   Record.push_back(E->hadMultipleCandidates());
6027330f729Sjoerg   Record.push_back(E->refersToEnclosingVariableOrCapture());
6037330f729Sjoerg   Record.push_back(E->isNonOdrUse());
6047330f729Sjoerg 
6057330f729Sjoerg   if (E->hasTemplateKWAndArgsInfo()) {
6067330f729Sjoerg     unsigned NumTemplateArgs = E->getNumTemplateArgs();
6077330f729Sjoerg     Record.push_back(NumTemplateArgs);
6087330f729Sjoerg   }
6097330f729Sjoerg 
6107330f729Sjoerg   DeclarationName::NameKind nk = (E->getDecl()->getDeclName().getNameKind());
6117330f729Sjoerg 
6127330f729Sjoerg   if ((!E->hasTemplateKWAndArgsInfo()) && (!E->hasQualifier()) &&
6137330f729Sjoerg       (E->getDecl() == E->getFoundDecl()) &&
6147330f729Sjoerg       nk == DeclarationName::Identifier &&
6157330f729Sjoerg       !E->refersToEnclosingVariableOrCapture() && !E->isNonOdrUse()) {
6167330f729Sjoerg     AbbrevToUse = Writer.getDeclRefExprAbbrev();
6177330f729Sjoerg   }
6187330f729Sjoerg 
6197330f729Sjoerg   if (E->hasQualifier())
6207330f729Sjoerg     Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
6217330f729Sjoerg 
6227330f729Sjoerg   if (E->getDecl() != E->getFoundDecl())
6237330f729Sjoerg     Record.AddDeclRef(E->getFoundDecl());
6247330f729Sjoerg 
6257330f729Sjoerg   if (E->hasTemplateKWAndArgsInfo())
6267330f729Sjoerg     AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
6277330f729Sjoerg                              E->getTrailingObjects<TemplateArgumentLoc>());
6287330f729Sjoerg 
6297330f729Sjoerg   Record.AddDeclRef(E->getDecl());
6307330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
6317330f729Sjoerg   Record.AddDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName());
6327330f729Sjoerg   Code = serialization::EXPR_DECL_REF;
6337330f729Sjoerg }
6347330f729Sjoerg 
VisitIntegerLiteral(IntegerLiteral * E)6357330f729Sjoerg void ASTStmtWriter::VisitIntegerLiteral(IntegerLiteral *E) {
6367330f729Sjoerg   VisitExpr(E);
6377330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
6387330f729Sjoerg   Record.AddAPInt(E->getValue());
6397330f729Sjoerg 
6407330f729Sjoerg   if (E->getValue().getBitWidth() == 32) {
6417330f729Sjoerg     AbbrevToUse = Writer.getIntegerLiteralAbbrev();
6427330f729Sjoerg   }
6437330f729Sjoerg 
6447330f729Sjoerg   Code = serialization::EXPR_INTEGER_LITERAL;
6457330f729Sjoerg }
6467330f729Sjoerg 
VisitFixedPointLiteral(FixedPointLiteral * E)6477330f729Sjoerg void ASTStmtWriter::VisitFixedPointLiteral(FixedPointLiteral *E) {
6487330f729Sjoerg   VisitExpr(E);
6497330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
650*e038c9c4Sjoerg   Record.push_back(E->getScale());
6517330f729Sjoerg   Record.AddAPInt(E->getValue());
652*e038c9c4Sjoerg   Code = serialization::EXPR_FIXEDPOINT_LITERAL;
6537330f729Sjoerg }
6547330f729Sjoerg 
VisitFloatingLiteral(FloatingLiteral * E)6557330f729Sjoerg void ASTStmtWriter::VisitFloatingLiteral(FloatingLiteral *E) {
6567330f729Sjoerg   VisitExpr(E);
6577330f729Sjoerg   Record.push_back(E->getRawSemantics());
6587330f729Sjoerg   Record.push_back(E->isExact());
6597330f729Sjoerg   Record.AddAPFloat(E->getValue());
6607330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
6617330f729Sjoerg   Code = serialization::EXPR_FLOATING_LITERAL;
6627330f729Sjoerg }
6637330f729Sjoerg 
VisitImaginaryLiteral(ImaginaryLiteral * E)6647330f729Sjoerg void ASTStmtWriter::VisitImaginaryLiteral(ImaginaryLiteral *E) {
6657330f729Sjoerg   VisitExpr(E);
6667330f729Sjoerg   Record.AddStmt(E->getSubExpr());
6677330f729Sjoerg   Code = serialization::EXPR_IMAGINARY_LITERAL;
6687330f729Sjoerg }
6697330f729Sjoerg 
VisitStringLiteral(StringLiteral * E)6707330f729Sjoerg void ASTStmtWriter::VisitStringLiteral(StringLiteral *E) {
6717330f729Sjoerg   VisitExpr(E);
6727330f729Sjoerg 
6737330f729Sjoerg   // Store the various bits of data of StringLiteral.
6747330f729Sjoerg   Record.push_back(E->getNumConcatenated());
6757330f729Sjoerg   Record.push_back(E->getLength());
6767330f729Sjoerg   Record.push_back(E->getCharByteWidth());
6777330f729Sjoerg   Record.push_back(E->getKind());
6787330f729Sjoerg   Record.push_back(E->isPascal());
6797330f729Sjoerg 
6807330f729Sjoerg   // Store the trailing array of SourceLocation.
6817330f729Sjoerg   for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
6827330f729Sjoerg     Record.AddSourceLocation(E->getStrTokenLoc(I));
6837330f729Sjoerg 
6847330f729Sjoerg   // Store the trailing array of char holding the string data.
6857330f729Sjoerg   StringRef StrData = E->getBytes();
6867330f729Sjoerg   for (unsigned I = 0, N = E->getByteLength(); I != N; ++I)
6877330f729Sjoerg     Record.push_back(StrData[I]);
6887330f729Sjoerg 
6897330f729Sjoerg   Code = serialization::EXPR_STRING_LITERAL;
6907330f729Sjoerg }
6917330f729Sjoerg 
VisitCharacterLiteral(CharacterLiteral * E)6927330f729Sjoerg void ASTStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) {
6937330f729Sjoerg   VisitExpr(E);
6947330f729Sjoerg   Record.push_back(E->getValue());
6957330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
6967330f729Sjoerg   Record.push_back(E->getKind());
6977330f729Sjoerg 
6987330f729Sjoerg   AbbrevToUse = Writer.getCharacterLiteralAbbrev();
6997330f729Sjoerg 
7007330f729Sjoerg   Code = serialization::EXPR_CHARACTER_LITERAL;
7017330f729Sjoerg }
7027330f729Sjoerg 
VisitParenExpr(ParenExpr * E)7037330f729Sjoerg void ASTStmtWriter::VisitParenExpr(ParenExpr *E) {
7047330f729Sjoerg   VisitExpr(E);
7057330f729Sjoerg   Record.AddSourceLocation(E->getLParen());
7067330f729Sjoerg   Record.AddSourceLocation(E->getRParen());
7077330f729Sjoerg   Record.AddStmt(E->getSubExpr());
7087330f729Sjoerg   Code = serialization::EXPR_PAREN;
7097330f729Sjoerg }
7107330f729Sjoerg 
VisitParenListExpr(ParenListExpr * E)7117330f729Sjoerg void ASTStmtWriter::VisitParenListExpr(ParenListExpr *E) {
7127330f729Sjoerg   VisitExpr(E);
7137330f729Sjoerg   Record.push_back(E->getNumExprs());
7147330f729Sjoerg   for (auto *SubStmt : E->exprs())
7157330f729Sjoerg     Record.AddStmt(SubStmt);
7167330f729Sjoerg   Record.AddSourceLocation(E->getLParenLoc());
7177330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
7187330f729Sjoerg   Code = serialization::EXPR_PAREN_LIST;
7197330f729Sjoerg }
7207330f729Sjoerg 
VisitUnaryOperator(UnaryOperator * E)7217330f729Sjoerg void ASTStmtWriter::VisitUnaryOperator(UnaryOperator *E) {
7227330f729Sjoerg   VisitExpr(E);
723*e038c9c4Sjoerg   bool HasFPFeatures = E->hasStoredFPFeatures();
724*e038c9c4Sjoerg   // Write this first for easy access when deserializing, as they affect the
725*e038c9c4Sjoerg   // size of the UnaryOperator.
726*e038c9c4Sjoerg   Record.push_back(HasFPFeatures);
7277330f729Sjoerg   Record.AddStmt(E->getSubExpr());
7287330f729Sjoerg   Record.push_back(E->getOpcode()); // FIXME: stable encoding
7297330f729Sjoerg   Record.AddSourceLocation(E->getOperatorLoc());
7307330f729Sjoerg   Record.push_back(E->canOverflow());
731*e038c9c4Sjoerg   if (HasFPFeatures)
732*e038c9c4Sjoerg     Record.push_back(E->getStoredFPFeatures().getAsOpaqueInt());
7337330f729Sjoerg   Code = serialization::EXPR_UNARY_OPERATOR;
7347330f729Sjoerg }
7357330f729Sjoerg 
VisitOffsetOfExpr(OffsetOfExpr * E)7367330f729Sjoerg void ASTStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {
7377330f729Sjoerg   VisitExpr(E);
7387330f729Sjoerg   Record.push_back(E->getNumComponents());
7397330f729Sjoerg   Record.push_back(E->getNumExpressions());
7407330f729Sjoerg   Record.AddSourceLocation(E->getOperatorLoc());
7417330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
7427330f729Sjoerg   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
7437330f729Sjoerg   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
7447330f729Sjoerg     const OffsetOfNode &ON = E->getComponent(I);
7457330f729Sjoerg     Record.push_back(ON.getKind()); // FIXME: Stable encoding
7467330f729Sjoerg     Record.AddSourceLocation(ON.getSourceRange().getBegin());
7477330f729Sjoerg     Record.AddSourceLocation(ON.getSourceRange().getEnd());
7487330f729Sjoerg     switch (ON.getKind()) {
7497330f729Sjoerg     case OffsetOfNode::Array:
7507330f729Sjoerg       Record.push_back(ON.getArrayExprIndex());
7517330f729Sjoerg       break;
7527330f729Sjoerg 
7537330f729Sjoerg     case OffsetOfNode::Field:
7547330f729Sjoerg       Record.AddDeclRef(ON.getField());
7557330f729Sjoerg       break;
7567330f729Sjoerg 
7577330f729Sjoerg     case OffsetOfNode::Identifier:
7587330f729Sjoerg       Record.AddIdentifierRef(ON.getFieldName());
7597330f729Sjoerg       break;
7607330f729Sjoerg 
7617330f729Sjoerg     case OffsetOfNode::Base:
7627330f729Sjoerg       Record.AddCXXBaseSpecifier(*ON.getBase());
7637330f729Sjoerg       break;
7647330f729Sjoerg     }
7657330f729Sjoerg   }
7667330f729Sjoerg   for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
7677330f729Sjoerg     Record.AddStmt(E->getIndexExpr(I));
7687330f729Sjoerg   Code = serialization::EXPR_OFFSETOF;
7697330f729Sjoerg }
7707330f729Sjoerg 
VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * E)7717330f729Sjoerg void ASTStmtWriter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
7727330f729Sjoerg   VisitExpr(E);
7737330f729Sjoerg   Record.push_back(E->getKind());
7747330f729Sjoerg   if (E->isArgumentType())
7757330f729Sjoerg     Record.AddTypeSourceInfo(E->getArgumentTypeInfo());
7767330f729Sjoerg   else {
7777330f729Sjoerg     Record.push_back(0);
7787330f729Sjoerg     Record.AddStmt(E->getArgumentExpr());
7797330f729Sjoerg   }
7807330f729Sjoerg   Record.AddSourceLocation(E->getOperatorLoc());
7817330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
7827330f729Sjoerg   Code = serialization::EXPR_SIZEOF_ALIGN_OF;
7837330f729Sjoerg }
7847330f729Sjoerg 
VisitArraySubscriptExpr(ArraySubscriptExpr * E)7857330f729Sjoerg void ASTStmtWriter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
7867330f729Sjoerg   VisitExpr(E);
7877330f729Sjoerg   Record.AddStmt(E->getLHS());
7887330f729Sjoerg   Record.AddStmt(E->getRHS());
7897330f729Sjoerg   Record.AddSourceLocation(E->getRBracketLoc());
7907330f729Sjoerg   Code = serialization::EXPR_ARRAY_SUBSCRIPT;
7917330f729Sjoerg }
7927330f729Sjoerg 
VisitMatrixSubscriptExpr(MatrixSubscriptExpr * E)793*e038c9c4Sjoerg void ASTStmtWriter::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
794*e038c9c4Sjoerg   VisitExpr(E);
795*e038c9c4Sjoerg   Record.AddStmt(E->getBase());
796*e038c9c4Sjoerg   Record.AddStmt(E->getRowIdx());
797*e038c9c4Sjoerg   Record.AddStmt(E->getColumnIdx());
798*e038c9c4Sjoerg   Record.AddSourceLocation(E->getRBracketLoc());
799*e038c9c4Sjoerg   Code = serialization::EXPR_ARRAY_SUBSCRIPT;
800*e038c9c4Sjoerg }
801*e038c9c4Sjoerg 
VisitOMPArraySectionExpr(OMPArraySectionExpr * E)8027330f729Sjoerg void ASTStmtWriter::VisitOMPArraySectionExpr(OMPArraySectionExpr *E) {
8037330f729Sjoerg   VisitExpr(E);
8047330f729Sjoerg   Record.AddStmt(E->getBase());
8057330f729Sjoerg   Record.AddStmt(E->getLowerBound());
8067330f729Sjoerg   Record.AddStmt(E->getLength());
807*e038c9c4Sjoerg   Record.AddStmt(E->getStride());
808*e038c9c4Sjoerg   Record.AddSourceLocation(E->getColonLocFirst());
809*e038c9c4Sjoerg   Record.AddSourceLocation(E->getColonLocSecond());
8107330f729Sjoerg   Record.AddSourceLocation(E->getRBracketLoc());
8117330f729Sjoerg   Code = serialization::EXPR_OMP_ARRAY_SECTION;
8127330f729Sjoerg }
8137330f729Sjoerg 
VisitOMPArrayShapingExpr(OMPArrayShapingExpr * E)814*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
815*e038c9c4Sjoerg   VisitExpr(E);
816*e038c9c4Sjoerg   Record.push_back(E->getDimensions().size());
817*e038c9c4Sjoerg   Record.AddStmt(E->getBase());
818*e038c9c4Sjoerg   for (Expr *Dim : E->getDimensions())
819*e038c9c4Sjoerg     Record.AddStmt(Dim);
820*e038c9c4Sjoerg   for (SourceRange SR : E->getBracketsRanges())
821*e038c9c4Sjoerg     Record.AddSourceRange(SR);
822*e038c9c4Sjoerg   Record.AddSourceLocation(E->getLParenLoc());
823*e038c9c4Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
824*e038c9c4Sjoerg   Code = serialization::EXPR_OMP_ARRAY_SHAPING;
825*e038c9c4Sjoerg }
826*e038c9c4Sjoerg 
VisitOMPIteratorExpr(OMPIteratorExpr * E)827*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPIteratorExpr(OMPIteratorExpr *E) {
828*e038c9c4Sjoerg   VisitExpr(E);
829*e038c9c4Sjoerg   Record.push_back(E->numOfIterators());
830*e038c9c4Sjoerg   Record.AddSourceLocation(E->getIteratorKwLoc());
831*e038c9c4Sjoerg   Record.AddSourceLocation(E->getLParenLoc());
832*e038c9c4Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
833*e038c9c4Sjoerg   for (unsigned I = 0, End = E->numOfIterators(); I < End; ++I) {
834*e038c9c4Sjoerg     Record.AddDeclRef(E->getIteratorDecl(I));
835*e038c9c4Sjoerg     Record.AddSourceLocation(E->getAssignLoc(I));
836*e038c9c4Sjoerg     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
837*e038c9c4Sjoerg     Record.AddStmt(Range.Begin);
838*e038c9c4Sjoerg     Record.AddStmt(Range.End);
839*e038c9c4Sjoerg     Record.AddStmt(Range.Step);
840*e038c9c4Sjoerg     Record.AddSourceLocation(E->getColonLoc(I));
841*e038c9c4Sjoerg     if (Range.Step)
842*e038c9c4Sjoerg       Record.AddSourceLocation(E->getSecondColonLoc(I));
843*e038c9c4Sjoerg     // Serialize helpers
844*e038c9c4Sjoerg     OMPIteratorHelperData &HD = E->getHelper(I);
845*e038c9c4Sjoerg     Record.AddDeclRef(HD.CounterVD);
846*e038c9c4Sjoerg     Record.AddStmt(HD.Upper);
847*e038c9c4Sjoerg     Record.AddStmt(HD.Update);
848*e038c9c4Sjoerg     Record.AddStmt(HD.CounterUpdate);
849*e038c9c4Sjoerg   }
850*e038c9c4Sjoerg   Code = serialization::EXPR_OMP_ITERATOR;
851*e038c9c4Sjoerg }
852*e038c9c4Sjoerg 
VisitCallExpr(CallExpr * E)8537330f729Sjoerg void ASTStmtWriter::VisitCallExpr(CallExpr *E) {
8547330f729Sjoerg   VisitExpr(E);
8557330f729Sjoerg   Record.push_back(E->getNumArgs());
856*e038c9c4Sjoerg   Record.push_back(E->hasStoredFPFeatures());
8577330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
8587330f729Sjoerg   Record.AddStmt(E->getCallee());
8597330f729Sjoerg   for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
8607330f729Sjoerg        Arg != ArgEnd; ++Arg)
8617330f729Sjoerg     Record.AddStmt(*Arg);
8627330f729Sjoerg   Record.push_back(static_cast<unsigned>(E->getADLCallKind()));
863*e038c9c4Sjoerg   if (E->hasStoredFPFeatures())
864*e038c9c4Sjoerg     Record.push_back(E->getFPFeatures().getAsOpaqueInt());
8657330f729Sjoerg   Code = serialization::EXPR_CALL;
8667330f729Sjoerg }
8677330f729Sjoerg 
VisitRecoveryExpr(RecoveryExpr * E)868*e038c9c4Sjoerg void ASTStmtWriter::VisitRecoveryExpr(RecoveryExpr *E) {
869*e038c9c4Sjoerg   VisitExpr(E);
870*e038c9c4Sjoerg   Record.push_back(std::distance(E->children().begin(), E->children().end()));
871*e038c9c4Sjoerg   Record.AddSourceLocation(E->getBeginLoc());
872*e038c9c4Sjoerg   Record.AddSourceLocation(E->getEndLoc());
873*e038c9c4Sjoerg   for (Stmt *Child : E->children())
874*e038c9c4Sjoerg     Record.AddStmt(Child);
875*e038c9c4Sjoerg   Code = serialization::EXPR_RECOVERY;
876*e038c9c4Sjoerg }
877*e038c9c4Sjoerg 
VisitMemberExpr(MemberExpr * E)8787330f729Sjoerg void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) {
8797330f729Sjoerg   VisitExpr(E);
8807330f729Sjoerg 
8817330f729Sjoerg   bool HasQualifier = E->hasQualifier();
8827330f729Sjoerg   bool HasFoundDecl =
8837330f729Sjoerg       E->hasQualifierOrFoundDecl() &&
8847330f729Sjoerg       (E->getFoundDecl().getDecl() != E->getMemberDecl() ||
8857330f729Sjoerg        E->getFoundDecl().getAccess() != E->getMemberDecl()->getAccess());
8867330f729Sjoerg   bool HasTemplateInfo = E->hasTemplateKWAndArgsInfo();
8877330f729Sjoerg   unsigned NumTemplateArgs = E->getNumTemplateArgs();
8887330f729Sjoerg 
8897330f729Sjoerg   // Write these first for easy access when deserializing, as they affect the
8907330f729Sjoerg   // size of the MemberExpr.
8917330f729Sjoerg   Record.push_back(HasQualifier);
8927330f729Sjoerg   Record.push_back(HasFoundDecl);
8937330f729Sjoerg   Record.push_back(HasTemplateInfo);
8947330f729Sjoerg   Record.push_back(NumTemplateArgs);
8957330f729Sjoerg 
8967330f729Sjoerg   Record.AddStmt(E->getBase());
8977330f729Sjoerg   Record.AddDeclRef(E->getMemberDecl());
8987330f729Sjoerg   Record.AddDeclarationNameLoc(E->MemberDNLoc,
8997330f729Sjoerg                                E->getMemberDecl()->getDeclName());
9007330f729Sjoerg   Record.AddSourceLocation(E->getMemberLoc());
9017330f729Sjoerg   Record.push_back(E->isArrow());
9027330f729Sjoerg   Record.push_back(E->hadMultipleCandidates());
9037330f729Sjoerg   Record.push_back(E->isNonOdrUse());
9047330f729Sjoerg   Record.AddSourceLocation(E->getOperatorLoc());
9057330f729Sjoerg 
9067330f729Sjoerg   if (HasFoundDecl) {
9077330f729Sjoerg     DeclAccessPair FoundDecl = E->getFoundDecl();
9087330f729Sjoerg     Record.AddDeclRef(FoundDecl.getDecl());
9097330f729Sjoerg     Record.push_back(FoundDecl.getAccess());
9107330f729Sjoerg   }
9117330f729Sjoerg 
9127330f729Sjoerg   if (HasQualifier)
9137330f729Sjoerg     Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
9147330f729Sjoerg 
9157330f729Sjoerg   if (HasTemplateInfo)
9167330f729Sjoerg     AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
9177330f729Sjoerg                              E->getTrailingObjects<TemplateArgumentLoc>());
9187330f729Sjoerg 
9197330f729Sjoerg   Code = serialization::EXPR_MEMBER;
9207330f729Sjoerg }
9217330f729Sjoerg 
VisitObjCIsaExpr(ObjCIsaExpr * E)9227330f729Sjoerg void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
9237330f729Sjoerg   VisitExpr(E);
9247330f729Sjoerg   Record.AddStmt(E->getBase());
9257330f729Sjoerg   Record.AddSourceLocation(E->getIsaMemberLoc());
9267330f729Sjoerg   Record.AddSourceLocation(E->getOpLoc());
9277330f729Sjoerg   Record.push_back(E->isArrow());
9287330f729Sjoerg   Code = serialization::EXPR_OBJC_ISA;
9297330f729Sjoerg }
9307330f729Sjoerg 
9317330f729Sjoerg void ASTStmtWriter::
VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr * E)9327330f729Sjoerg VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
9337330f729Sjoerg   VisitExpr(E);
9347330f729Sjoerg   Record.AddStmt(E->getSubExpr());
9357330f729Sjoerg   Record.push_back(E->shouldCopy());
9367330f729Sjoerg   Code = serialization::EXPR_OBJC_INDIRECT_COPY_RESTORE;
9377330f729Sjoerg }
9387330f729Sjoerg 
VisitObjCBridgedCastExpr(ObjCBridgedCastExpr * E)9397330f729Sjoerg void ASTStmtWriter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
9407330f729Sjoerg   VisitExplicitCastExpr(E);
9417330f729Sjoerg   Record.AddSourceLocation(E->getLParenLoc());
9427330f729Sjoerg   Record.AddSourceLocation(E->getBridgeKeywordLoc());
9437330f729Sjoerg   Record.push_back(E->getBridgeKind()); // FIXME: Stable encoding
9447330f729Sjoerg   Code = serialization::EXPR_OBJC_BRIDGED_CAST;
9457330f729Sjoerg }
9467330f729Sjoerg 
VisitCastExpr(CastExpr * E)9477330f729Sjoerg void ASTStmtWriter::VisitCastExpr(CastExpr *E) {
9487330f729Sjoerg   VisitExpr(E);
9497330f729Sjoerg   Record.push_back(E->path_size());
950*e038c9c4Sjoerg   Record.push_back(E->hasStoredFPFeatures());
9517330f729Sjoerg   Record.AddStmt(E->getSubExpr());
9527330f729Sjoerg   Record.push_back(E->getCastKind()); // FIXME: stable encoding
9537330f729Sjoerg 
9547330f729Sjoerg   for (CastExpr::path_iterator
9557330f729Sjoerg          PI = E->path_begin(), PE = E->path_end(); PI != PE; ++PI)
9567330f729Sjoerg     Record.AddCXXBaseSpecifier(**PI);
957*e038c9c4Sjoerg 
958*e038c9c4Sjoerg   if (E->hasStoredFPFeatures())
959*e038c9c4Sjoerg     Record.push_back(E->getFPFeatures().getAsOpaqueInt());
9607330f729Sjoerg }
9617330f729Sjoerg 
VisitBinaryOperator(BinaryOperator * E)9627330f729Sjoerg void ASTStmtWriter::VisitBinaryOperator(BinaryOperator *E) {
9637330f729Sjoerg   VisitExpr(E);
964*e038c9c4Sjoerg   bool HasFPFeatures = E->hasStoredFPFeatures();
965*e038c9c4Sjoerg   // Write this first for easy access when deserializing, as they affect the
966*e038c9c4Sjoerg   // size of the UnaryOperator.
967*e038c9c4Sjoerg   Record.push_back(HasFPFeatures);
968*e038c9c4Sjoerg   Record.push_back(E->getOpcode()); // FIXME: stable encoding
9697330f729Sjoerg   Record.AddStmt(E->getLHS());
9707330f729Sjoerg   Record.AddStmt(E->getRHS());
9717330f729Sjoerg   Record.AddSourceLocation(E->getOperatorLoc());
972*e038c9c4Sjoerg   if (HasFPFeatures)
973*e038c9c4Sjoerg     Record.push_back(E->getStoredFPFeatures().getAsOpaqueInt());
9747330f729Sjoerg   Code = serialization::EXPR_BINARY_OPERATOR;
9757330f729Sjoerg }
9767330f729Sjoerg 
VisitCompoundAssignOperator(CompoundAssignOperator * E)9777330f729Sjoerg void ASTStmtWriter::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
9787330f729Sjoerg   VisitBinaryOperator(E);
9797330f729Sjoerg   Record.AddTypeRef(E->getComputationLHSType());
9807330f729Sjoerg   Record.AddTypeRef(E->getComputationResultType());
9817330f729Sjoerg   Code = serialization::EXPR_COMPOUND_ASSIGN_OPERATOR;
9827330f729Sjoerg }
9837330f729Sjoerg 
VisitConditionalOperator(ConditionalOperator * E)9847330f729Sjoerg void ASTStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {
9857330f729Sjoerg   VisitExpr(E);
9867330f729Sjoerg   Record.AddStmt(E->getCond());
9877330f729Sjoerg   Record.AddStmt(E->getLHS());
9887330f729Sjoerg   Record.AddStmt(E->getRHS());
9897330f729Sjoerg   Record.AddSourceLocation(E->getQuestionLoc());
9907330f729Sjoerg   Record.AddSourceLocation(E->getColonLoc());
9917330f729Sjoerg   Code = serialization::EXPR_CONDITIONAL_OPERATOR;
9927330f729Sjoerg }
9937330f729Sjoerg 
9947330f729Sjoerg void
VisitBinaryConditionalOperator(BinaryConditionalOperator * E)9957330f729Sjoerg ASTStmtWriter::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
9967330f729Sjoerg   VisitExpr(E);
9977330f729Sjoerg   Record.AddStmt(E->getOpaqueValue());
9987330f729Sjoerg   Record.AddStmt(E->getCommon());
9997330f729Sjoerg   Record.AddStmt(E->getCond());
10007330f729Sjoerg   Record.AddStmt(E->getTrueExpr());
10017330f729Sjoerg   Record.AddStmt(E->getFalseExpr());
10027330f729Sjoerg   Record.AddSourceLocation(E->getQuestionLoc());
10037330f729Sjoerg   Record.AddSourceLocation(E->getColonLoc());
10047330f729Sjoerg   Code = serialization::EXPR_BINARY_CONDITIONAL_OPERATOR;
10057330f729Sjoerg }
10067330f729Sjoerg 
VisitImplicitCastExpr(ImplicitCastExpr * E)10077330f729Sjoerg void ASTStmtWriter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
10087330f729Sjoerg   VisitCastExpr(E);
10097330f729Sjoerg   Record.push_back(E->isPartOfExplicitCast());
10107330f729Sjoerg 
1011*e038c9c4Sjoerg   if (E->path_size() == 0 && !E->hasStoredFPFeatures())
10127330f729Sjoerg     AbbrevToUse = Writer.getExprImplicitCastAbbrev();
10137330f729Sjoerg 
10147330f729Sjoerg   Code = serialization::EXPR_IMPLICIT_CAST;
10157330f729Sjoerg }
10167330f729Sjoerg 
VisitExplicitCastExpr(ExplicitCastExpr * E)10177330f729Sjoerg void ASTStmtWriter::VisitExplicitCastExpr(ExplicitCastExpr *E) {
10187330f729Sjoerg   VisitCastExpr(E);
10197330f729Sjoerg   Record.AddTypeSourceInfo(E->getTypeInfoAsWritten());
10207330f729Sjoerg }
10217330f729Sjoerg 
VisitCStyleCastExpr(CStyleCastExpr * E)10227330f729Sjoerg void ASTStmtWriter::VisitCStyleCastExpr(CStyleCastExpr *E) {
10237330f729Sjoerg   VisitExplicitCastExpr(E);
10247330f729Sjoerg   Record.AddSourceLocation(E->getLParenLoc());
10257330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
10267330f729Sjoerg   Code = serialization::EXPR_CSTYLE_CAST;
10277330f729Sjoerg }
10287330f729Sjoerg 
VisitCompoundLiteralExpr(CompoundLiteralExpr * E)10297330f729Sjoerg void ASTStmtWriter::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
10307330f729Sjoerg   VisitExpr(E);
10317330f729Sjoerg   Record.AddSourceLocation(E->getLParenLoc());
10327330f729Sjoerg   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
10337330f729Sjoerg   Record.AddStmt(E->getInitializer());
10347330f729Sjoerg   Record.push_back(E->isFileScope());
10357330f729Sjoerg   Code = serialization::EXPR_COMPOUND_LITERAL;
10367330f729Sjoerg }
10377330f729Sjoerg 
VisitExtVectorElementExpr(ExtVectorElementExpr * E)10387330f729Sjoerg void ASTStmtWriter::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
10397330f729Sjoerg   VisitExpr(E);
10407330f729Sjoerg   Record.AddStmt(E->getBase());
10417330f729Sjoerg   Record.AddIdentifierRef(&E->getAccessor());
10427330f729Sjoerg   Record.AddSourceLocation(E->getAccessorLoc());
10437330f729Sjoerg   Code = serialization::EXPR_EXT_VECTOR_ELEMENT;
10447330f729Sjoerg }
10457330f729Sjoerg 
VisitInitListExpr(InitListExpr * E)10467330f729Sjoerg void ASTStmtWriter::VisitInitListExpr(InitListExpr *E) {
10477330f729Sjoerg   VisitExpr(E);
10487330f729Sjoerg   // NOTE: only add the (possibly null) syntactic form.
10497330f729Sjoerg   // No need to serialize the isSemanticForm flag and the semantic form.
10507330f729Sjoerg   Record.AddStmt(E->getSyntacticForm());
10517330f729Sjoerg   Record.AddSourceLocation(E->getLBraceLoc());
10527330f729Sjoerg   Record.AddSourceLocation(E->getRBraceLoc());
10537330f729Sjoerg   bool isArrayFiller = E->ArrayFillerOrUnionFieldInit.is<Expr*>();
10547330f729Sjoerg   Record.push_back(isArrayFiller);
10557330f729Sjoerg   if (isArrayFiller)
10567330f729Sjoerg     Record.AddStmt(E->getArrayFiller());
10577330f729Sjoerg   else
10587330f729Sjoerg     Record.AddDeclRef(E->getInitializedFieldInUnion());
10597330f729Sjoerg   Record.push_back(E->hadArrayRangeDesignator());
10607330f729Sjoerg   Record.push_back(E->getNumInits());
10617330f729Sjoerg   if (isArrayFiller) {
10627330f729Sjoerg     // ArrayFiller may have filled "holes" due to designated initializer.
10637330f729Sjoerg     // Replace them by 0 to indicate that the filler goes in that place.
10647330f729Sjoerg     Expr *filler = E->getArrayFiller();
10657330f729Sjoerg     for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
10667330f729Sjoerg       Record.AddStmt(E->getInit(I) != filler ? E->getInit(I) : nullptr);
10677330f729Sjoerg   } else {
10687330f729Sjoerg     for (unsigned I = 0, N = E->getNumInits(); I != N; ++I)
10697330f729Sjoerg       Record.AddStmt(E->getInit(I));
10707330f729Sjoerg   }
10717330f729Sjoerg   Code = serialization::EXPR_INIT_LIST;
10727330f729Sjoerg }
10737330f729Sjoerg 
VisitDesignatedInitExpr(DesignatedInitExpr * E)10747330f729Sjoerg void ASTStmtWriter::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
10757330f729Sjoerg   VisitExpr(E);
10767330f729Sjoerg   Record.push_back(E->getNumSubExprs());
10777330f729Sjoerg   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
10787330f729Sjoerg     Record.AddStmt(E->getSubExpr(I));
10797330f729Sjoerg   Record.AddSourceLocation(E->getEqualOrColonLoc());
10807330f729Sjoerg   Record.push_back(E->usesGNUSyntax());
10817330f729Sjoerg   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10827330f729Sjoerg     if (D.isFieldDesignator()) {
10837330f729Sjoerg       if (FieldDecl *Field = D.getField()) {
10847330f729Sjoerg         Record.push_back(serialization::DESIG_FIELD_DECL);
10857330f729Sjoerg         Record.AddDeclRef(Field);
10867330f729Sjoerg       } else {
10877330f729Sjoerg         Record.push_back(serialization::DESIG_FIELD_NAME);
10887330f729Sjoerg         Record.AddIdentifierRef(D.getFieldName());
10897330f729Sjoerg       }
10907330f729Sjoerg       Record.AddSourceLocation(D.getDotLoc());
10917330f729Sjoerg       Record.AddSourceLocation(D.getFieldLoc());
10927330f729Sjoerg     } else if (D.isArrayDesignator()) {
10937330f729Sjoerg       Record.push_back(serialization::DESIG_ARRAY);
10947330f729Sjoerg       Record.push_back(D.getFirstExprIndex());
10957330f729Sjoerg       Record.AddSourceLocation(D.getLBracketLoc());
10967330f729Sjoerg       Record.AddSourceLocation(D.getRBracketLoc());
10977330f729Sjoerg     } else {
10987330f729Sjoerg       assert(D.isArrayRangeDesignator() && "Unknown designator");
10997330f729Sjoerg       Record.push_back(serialization::DESIG_ARRAY_RANGE);
11007330f729Sjoerg       Record.push_back(D.getFirstExprIndex());
11017330f729Sjoerg       Record.AddSourceLocation(D.getLBracketLoc());
11027330f729Sjoerg       Record.AddSourceLocation(D.getEllipsisLoc());
11037330f729Sjoerg       Record.AddSourceLocation(D.getRBracketLoc());
11047330f729Sjoerg     }
11057330f729Sjoerg   }
11067330f729Sjoerg   Code = serialization::EXPR_DESIGNATED_INIT;
11077330f729Sjoerg }
11087330f729Sjoerg 
VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr * E)11097330f729Sjoerg void ASTStmtWriter::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {
11107330f729Sjoerg   VisitExpr(E);
11117330f729Sjoerg   Record.AddStmt(E->getBase());
11127330f729Sjoerg   Record.AddStmt(E->getUpdater());
11137330f729Sjoerg   Code = serialization::EXPR_DESIGNATED_INIT_UPDATE;
11147330f729Sjoerg }
11157330f729Sjoerg 
VisitNoInitExpr(NoInitExpr * E)11167330f729Sjoerg void ASTStmtWriter::VisitNoInitExpr(NoInitExpr *E) {
11177330f729Sjoerg   VisitExpr(E);
11187330f729Sjoerg   Code = serialization::EXPR_NO_INIT;
11197330f729Sjoerg }
11207330f729Sjoerg 
VisitArrayInitLoopExpr(ArrayInitLoopExpr * E)11217330f729Sjoerg void ASTStmtWriter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11227330f729Sjoerg   VisitExpr(E);
11237330f729Sjoerg   Record.AddStmt(E->SubExprs[0]);
11247330f729Sjoerg   Record.AddStmt(E->SubExprs[1]);
11257330f729Sjoerg   Code = serialization::EXPR_ARRAY_INIT_LOOP;
11267330f729Sjoerg }
11277330f729Sjoerg 
VisitArrayInitIndexExpr(ArrayInitIndexExpr * E)11287330f729Sjoerg void ASTStmtWriter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11297330f729Sjoerg   VisitExpr(E);
11307330f729Sjoerg   Code = serialization::EXPR_ARRAY_INIT_INDEX;
11317330f729Sjoerg }
11327330f729Sjoerg 
VisitImplicitValueInitExpr(ImplicitValueInitExpr * E)11337330f729Sjoerg void ASTStmtWriter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
11347330f729Sjoerg   VisitExpr(E);
11357330f729Sjoerg   Code = serialization::EXPR_IMPLICIT_VALUE_INIT;
11367330f729Sjoerg }
11377330f729Sjoerg 
VisitVAArgExpr(VAArgExpr * E)11387330f729Sjoerg void ASTStmtWriter::VisitVAArgExpr(VAArgExpr *E) {
11397330f729Sjoerg   VisitExpr(E);
11407330f729Sjoerg   Record.AddStmt(E->getSubExpr());
11417330f729Sjoerg   Record.AddTypeSourceInfo(E->getWrittenTypeInfo());
11427330f729Sjoerg   Record.AddSourceLocation(E->getBuiltinLoc());
11437330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
11447330f729Sjoerg   Record.push_back(E->isMicrosoftABI());
11457330f729Sjoerg   Code = serialization::EXPR_VA_ARG;
11467330f729Sjoerg }
11477330f729Sjoerg 
VisitSourceLocExpr(SourceLocExpr * E)11487330f729Sjoerg void ASTStmtWriter::VisitSourceLocExpr(SourceLocExpr *E) {
11497330f729Sjoerg   VisitExpr(E);
11507330f729Sjoerg   Record.AddDeclRef(cast_or_null<Decl>(E->getParentContext()));
11517330f729Sjoerg   Record.AddSourceLocation(E->getBeginLoc());
11527330f729Sjoerg   Record.AddSourceLocation(E->getEndLoc());
11537330f729Sjoerg   Record.push_back(E->getIdentKind());
11547330f729Sjoerg   Code = serialization::EXPR_SOURCE_LOC;
11557330f729Sjoerg }
11567330f729Sjoerg 
VisitAddrLabelExpr(AddrLabelExpr * E)11577330f729Sjoerg void ASTStmtWriter::VisitAddrLabelExpr(AddrLabelExpr *E) {
11587330f729Sjoerg   VisitExpr(E);
11597330f729Sjoerg   Record.AddSourceLocation(E->getAmpAmpLoc());
11607330f729Sjoerg   Record.AddSourceLocation(E->getLabelLoc());
11617330f729Sjoerg   Record.AddDeclRef(E->getLabel());
11627330f729Sjoerg   Code = serialization::EXPR_ADDR_LABEL;
11637330f729Sjoerg }
11647330f729Sjoerg 
VisitStmtExpr(StmtExpr * E)11657330f729Sjoerg void ASTStmtWriter::VisitStmtExpr(StmtExpr *E) {
11667330f729Sjoerg   VisitExpr(E);
11677330f729Sjoerg   Record.AddStmt(E->getSubStmt());
11687330f729Sjoerg   Record.AddSourceLocation(E->getLParenLoc());
11697330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
1170*e038c9c4Sjoerg   Record.push_back(E->getTemplateDepth());
11717330f729Sjoerg   Code = serialization::EXPR_STMT;
11727330f729Sjoerg }
11737330f729Sjoerg 
VisitChooseExpr(ChooseExpr * E)11747330f729Sjoerg void ASTStmtWriter::VisitChooseExpr(ChooseExpr *E) {
11757330f729Sjoerg   VisitExpr(E);
11767330f729Sjoerg   Record.AddStmt(E->getCond());
11777330f729Sjoerg   Record.AddStmt(E->getLHS());
11787330f729Sjoerg   Record.AddStmt(E->getRHS());
11797330f729Sjoerg   Record.AddSourceLocation(E->getBuiltinLoc());
11807330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
11817330f729Sjoerg   Record.push_back(E->isConditionDependent() ? false : E->isConditionTrue());
11827330f729Sjoerg   Code = serialization::EXPR_CHOOSE;
11837330f729Sjoerg }
11847330f729Sjoerg 
VisitGNUNullExpr(GNUNullExpr * E)11857330f729Sjoerg void ASTStmtWriter::VisitGNUNullExpr(GNUNullExpr *E) {
11867330f729Sjoerg   VisitExpr(E);
11877330f729Sjoerg   Record.AddSourceLocation(E->getTokenLocation());
11887330f729Sjoerg   Code = serialization::EXPR_GNU_NULL;
11897330f729Sjoerg }
11907330f729Sjoerg 
VisitShuffleVectorExpr(ShuffleVectorExpr * E)11917330f729Sjoerg void ASTStmtWriter::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
11927330f729Sjoerg   VisitExpr(E);
11937330f729Sjoerg   Record.push_back(E->getNumSubExprs());
11947330f729Sjoerg   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
11957330f729Sjoerg     Record.AddStmt(E->getExpr(I));
11967330f729Sjoerg   Record.AddSourceLocation(E->getBuiltinLoc());
11977330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
11987330f729Sjoerg   Code = serialization::EXPR_SHUFFLE_VECTOR;
11997330f729Sjoerg }
12007330f729Sjoerg 
VisitConvertVectorExpr(ConvertVectorExpr * E)12017330f729Sjoerg void ASTStmtWriter::VisitConvertVectorExpr(ConvertVectorExpr *E) {
12027330f729Sjoerg   VisitExpr(E);
12037330f729Sjoerg   Record.AddSourceLocation(E->getBuiltinLoc());
12047330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
12057330f729Sjoerg   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
12067330f729Sjoerg   Record.AddStmt(E->getSrcExpr());
12077330f729Sjoerg   Code = serialization::EXPR_CONVERT_VECTOR;
12087330f729Sjoerg }
12097330f729Sjoerg 
VisitBlockExpr(BlockExpr * E)12107330f729Sjoerg void ASTStmtWriter::VisitBlockExpr(BlockExpr *E) {
12117330f729Sjoerg   VisitExpr(E);
12127330f729Sjoerg   Record.AddDeclRef(E->getBlockDecl());
12137330f729Sjoerg   Code = serialization::EXPR_BLOCK;
12147330f729Sjoerg }
12157330f729Sjoerg 
VisitGenericSelectionExpr(GenericSelectionExpr * E)12167330f729Sjoerg void ASTStmtWriter::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
12177330f729Sjoerg   VisitExpr(E);
12187330f729Sjoerg 
12197330f729Sjoerg   Record.push_back(E->getNumAssocs());
12207330f729Sjoerg   Record.push_back(E->ResultIndex);
12217330f729Sjoerg   Record.AddSourceLocation(E->getGenericLoc());
12227330f729Sjoerg   Record.AddSourceLocation(E->getDefaultLoc());
12237330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
12247330f729Sjoerg 
12257330f729Sjoerg   Stmt **Stmts = E->getTrailingObjects<Stmt *>();
12267330f729Sjoerg   // Add 1 to account for the controlling expression which is the first
12277330f729Sjoerg   // expression in the trailing array of Stmt *. This is not needed for
12287330f729Sjoerg   // the trailing array of TypeSourceInfo *.
12297330f729Sjoerg   for (unsigned I = 0, N = E->getNumAssocs() + 1; I < N; ++I)
12307330f729Sjoerg     Record.AddStmt(Stmts[I]);
12317330f729Sjoerg 
12327330f729Sjoerg   TypeSourceInfo **TSIs = E->getTrailingObjects<TypeSourceInfo *>();
12337330f729Sjoerg   for (unsigned I = 0, N = E->getNumAssocs(); I < N; ++I)
12347330f729Sjoerg     Record.AddTypeSourceInfo(TSIs[I]);
12357330f729Sjoerg 
12367330f729Sjoerg   Code = serialization::EXPR_GENERIC_SELECTION;
12377330f729Sjoerg }
12387330f729Sjoerg 
VisitPseudoObjectExpr(PseudoObjectExpr * E)12397330f729Sjoerg void ASTStmtWriter::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
12407330f729Sjoerg   VisitExpr(E);
12417330f729Sjoerg   Record.push_back(E->getNumSemanticExprs());
12427330f729Sjoerg 
12437330f729Sjoerg   // Push the result index.  Currently, this needs to exactly match
12447330f729Sjoerg   // the encoding used internally for ResultIndex.
12457330f729Sjoerg   unsigned result = E->getResultExprIndex();
12467330f729Sjoerg   result = (result == PseudoObjectExpr::NoResult ? 0 : result + 1);
12477330f729Sjoerg   Record.push_back(result);
12487330f729Sjoerg 
12497330f729Sjoerg   Record.AddStmt(E->getSyntacticForm());
12507330f729Sjoerg   for (PseudoObjectExpr::semantics_iterator
12517330f729Sjoerg          i = E->semantics_begin(), e = E->semantics_end(); i != e; ++i) {
12527330f729Sjoerg     Record.AddStmt(*i);
12537330f729Sjoerg   }
12547330f729Sjoerg   Code = serialization::EXPR_PSEUDO_OBJECT;
12557330f729Sjoerg }
12567330f729Sjoerg 
VisitAtomicExpr(AtomicExpr * E)12577330f729Sjoerg void ASTStmtWriter::VisitAtomicExpr(AtomicExpr *E) {
12587330f729Sjoerg   VisitExpr(E);
12597330f729Sjoerg   Record.push_back(E->getOp());
12607330f729Sjoerg   for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I)
12617330f729Sjoerg     Record.AddStmt(E->getSubExprs()[I]);
12627330f729Sjoerg   Record.AddSourceLocation(E->getBuiltinLoc());
12637330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
12647330f729Sjoerg   Code = serialization::EXPR_ATOMIC;
12657330f729Sjoerg }
12667330f729Sjoerg 
12677330f729Sjoerg //===----------------------------------------------------------------------===//
12687330f729Sjoerg // Objective-C Expressions and Statements.
12697330f729Sjoerg //===----------------------------------------------------------------------===//
12707330f729Sjoerg 
VisitObjCStringLiteral(ObjCStringLiteral * E)12717330f729Sjoerg void ASTStmtWriter::VisitObjCStringLiteral(ObjCStringLiteral *E) {
12727330f729Sjoerg   VisitExpr(E);
12737330f729Sjoerg   Record.AddStmt(E->getString());
12747330f729Sjoerg   Record.AddSourceLocation(E->getAtLoc());
12757330f729Sjoerg   Code = serialization::EXPR_OBJC_STRING_LITERAL;
12767330f729Sjoerg }
12777330f729Sjoerg 
VisitObjCBoxedExpr(ObjCBoxedExpr * E)12787330f729Sjoerg void ASTStmtWriter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
12797330f729Sjoerg   VisitExpr(E);
12807330f729Sjoerg   Record.AddStmt(E->getSubExpr());
12817330f729Sjoerg   Record.AddDeclRef(E->getBoxingMethod());
12827330f729Sjoerg   Record.AddSourceRange(E->getSourceRange());
12837330f729Sjoerg   Code = serialization::EXPR_OBJC_BOXED_EXPRESSION;
12847330f729Sjoerg }
12857330f729Sjoerg 
VisitObjCArrayLiteral(ObjCArrayLiteral * E)12867330f729Sjoerg void ASTStmtWriter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
12877330f729Sjoerg   VisitExpr(E);
12887330f729Sjoerg   Record.push_back(E->getNumElements());
12897330f729Sjoerg   for (unsigned i = 0; i < E->getNumElements(); i++)
12907330f729Sjoerg     Record.AddStmt(E->getElement(i));
12917330f729Sjoerg   Record.AddDeclRef(E->getArrayWithObjectsMethod());
12927330f729Sjoerg   Record.AddSourceRange(E->getSourceRange());
12937330f729Sjoerg   Code = serialization::EXPR_OBJC_ARRAY_LITERAL;
12947330f729Sjoerg }
12957330f729Sjoerg 
VisitObjCDictionaryLiteral(ObjCDictionaryLiteral * E)12967330f729Sjoerg void ASTStmtWriter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
12977330f729Sjoerg   VisitExpr(E);
12987330f729Sjoerg   Record.push_back(E->getNumElements());
12997330f729Sjoerg   Record.push_back(E->HasPackExpansions);
13007330f729Sjoerg   for (unsigned i = 0; i < E->getNumElements(); i++) {
13017330f729Sjoerg     ObjCDictionaryElement Element = E->getKeyValueElement(i);
13027330f729Sjoerg     Record.AddStmt(Element.Key);
13037330f729Sjoerg     Record.AddStmt(Element.Value);
13047330f729Sjoerg     if (E->HasPackExpansions) {
13057330f729Sjoerg       Record.AddSourceLocation(Element.EllipsisLoc);
13067330f729Sjoerg       unsigned NumExpansions = 0;
13077330f729Sjoerg       if (Element.NumExpansions)
13087330f729Sjoerg         NumExpansions = *Element.NumExpansions + 1;
13097330f729Sjoerg       Record.push_back(NumExpansions);
13107330f729Sjoerg     }
13117330f729Sjoerg   }
13127330f729Sjoerg 
13137330f729Sjoerg   Record.AddDeclRef(E->getDictWithObjectsMethod());
13147330f729Sjoerg   Record.AddSourceRange(E->getSourceRange());
13157330f729Sjoerg   Code = serialization::EXPR_OBJC_DICTIONARY_LITERAL;
13167330f729Sjoerg }
13177330f729Sjoerg 
VisitObjCEncodeExpr(ObjCEncodeExpr * E)13187330f729Sjoerg void ASTStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
13197330f729Sjoerg   VisitExpr(E);
13207330f729Sjoerg   Record.AddTypeSourceInfo(E->getEncodedTypeSourceInfo());
13217330f729Sjoerg   Record.AddSourceLocation(E->getAtLoc());
13227330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
13237330f729Sjoerg   Code = serialization::EXPR_OBJC_ENCODE;
13247330f729Sjoerg }
13257330f729Sjoerg 
VisitObjCSelectorExpr(ObjCSelectorExpr * E)13267330f729Sjoerg void ASTStmtWriter::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
13277330f729Sjoerg   VisitExpr(E);
13287330f729Sjoerg   Record.AddSelectorRef(E->getSelector());
13297330f729Sjoerg   Record.AddSourceLocation(E->getAtLoc());
13307330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
13317330f729Sjoerg   Code = serialization::EXPR_OBJC_SELECTOR_EXPR;
13327330f729Sjoerg }
13337330f729Sjoerg 
VisitObjCProtocolExpr(ObjCProtocolExpr * E)13347330f729Sjoerg void ASTStmtWriter::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
13357330f729Sjoerg   VisitExpr(E);
13367330f729Sjoerg   Record.AddDeclRef(E->getProtocol());
13377330f729Sjoerg   Record.AddSourceLocation(E->getAtLoc());
13387330f729Sjoerg   Record.AddSourceLocation(E->ProtoLoc);
13397330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
13407330f729Sjoerg   Code = serialization::EXPR_OBJC_PROTOCOL_EXPR;
13417330f729Sjoerg }
13427330f729Sjoerg 
VisitObjCIvarRefExpr(ObjCIvarRefExpr * E)13437330f729Sjoerg void ASTStmtWriter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13447330f729Sjoerg   VisitExpr(E);
13457330f729Sjoerg   Record.AddDeclRef(E->getDecl());
13467330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
13477330f729Sjoerg   Record.AddSourceLocation(E->getOpLoc());
13487330f729Sjoerg   Record.AddStmt(E->getBase());
13497330f729Sjoerg   Record.push_back(E->isArrow());
13507330f729Sjoerg   Record.push_back(E->isFreeIvar());
13517330f729Sjoerg   Code = serialization::EXPR_OBJC_IVAR_REF_EXPR;
13527330f729Sjoerg }
13537330f729Sjoerg 
VisitObjCPropertyRefExpr(ObjCPropertyRefExpr * E)13547330f729Sjoerg void ASTStmtWriter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13557330f729Sjoerg   VisitExpr(E);
13567330f729Sjoerg   Record.push_back(E->SetterAndMethodRefFlags.getInt());
13577330f729Sjoerg   Record.push_back(E->isImplicitProperty());
13587330f729Sjoerg   if (E->isImplicitProperty()) {
13597330f729Sjoerg     Record.AddDeclRef(E->getImplicitPropertyGetter());
13607330f729Sjoerg     Record.AddDeclRef(E->getImplicitPropertySetter());
13617330f729Sjoerg   } else {
13627330f729Sjoerg     Record.AddDeclRef(E->getExplicitProperty());
13637330f729Sjoerg   }
13647330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
13657330f729Sjoerg   Record.AddSourceLocation(E->getReceiverLocation());
13667330f729Sjoerg   if (E->isObjectReceiver()) {
13677330f729Sjoerg     Record.push_back(0);
13687330f729Sjoerg     Record.AddStmt(E->getBase());
13697330f729Sjoerg   } else if (E->isSuperReceiver()) {
13707330f729Sjoerg     Record.push_back(1);
13717330f729Sjoerg     Record.AddTypeRef(E->getSuperReceiverType());
13727330f729Sjoerg   } else {
13737330f729Sjoerg     Record.push_back(2);
13747330f729Sjoerg     Record.AddDeclRef(E->getClassReceiver());
13757330f729Sjoerg   }
13767330f729Sjoerg 
13777330f729Sjoerg   Code = serialization::EXPR_OBJC_PROPERTY_REF_EXPR;
13787330f729Sjoerg }
13797330f729Sjoerg 
VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr * E)13807330f729Sjoerg void ASTStmtWriter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13817330f729Sjoerg   VisitExpr(E);
13827330f729Sjoerg   Record.AddSourceLocation(E->getRBracket());
13837330f729Sjoerg   Record.AddStmt(E->getBaseExpr());
13847330f729Sjoerg   Record.AddStmt(E->getKeyExpr());
13857330f729Sjoerg   Record.AddDeclRef(E->getAtIndexMethodDecl());
13867330f729Sjoerg   Record.AddDeclRef(E->setAtIndexMethodDecl());
13877330f729Sjoerg 
13887330f729Sjoerg   Code = serialization::EXPR_OBJC_SUBSCRIPT_REF_EXPR;
13897330f729Sjoerg }
13907330f729Sjoerg 
VisitObjCMessageExpr(ObjCMessageExpr * E)13917330f729Sjoerg void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
13927330f729Sjoerg   VisitExpr(E);
13937330f729Sjoerg   Record.push_back(E->getNumArgs());
13947330f729Sjoerg   Record.push_back(E->getNumStoredSelLocs());
13957330f729Sjoerg   Record.push_back(E->SelLocsKind);
13967330f729Sjoerg   Record.push_back(E->isDelegateInitCall());
13977330f729Sjoerg   Record.push_back(E->IsImplicit);
13987330f729Sjoerg   Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding
13997330f729Sjoerg   switch (E->getReceiverKind()) {
14007330f729Sjoerg   case ObjCMessageExpr::Instance:
14017330f729Sjoerg     Record.AddStmt(E->getInstanceReceiver());
14027330f729Sjoerg     break;
14037330f729Sjoerg 
14047330f729Sjoerg   case ObjCMessageExpr::Class:
14057330f729Sjoerg     Record.AddTypeSourceInfo(E->getClassReceiverTypeInfo());
14067330f729Sjoerg     break;
14077330f729Sjoerg 
14087330f729Sjoerg   case ObjCMessageExpr::SuperClass:
14097330f729Sjoerg   case ObjCMessageExpr::SuperInstance:
14107330f729Sjoerg     Record.AddTypeRef(E->getSuperType());
14117330f729Sjoerg     Record.AddSourceLocation(E->getSuperLoc());
14127330f729Sjoerg     break;
14137330f729Sjoerg   }
14147330f729Sjoerg 
14157330f729Sjoerg   if (E->getMethodDecl()) {
14167330f729Sjoerg     Record.push_back(1);
14177330f729Sjoerg     Record.AddDeclRef(E->getMethodDecl());
14187330f729Sjoerg   } else {
14197330f729Sjoerg     Record.push_back(0);
14207330f729Sjoerg     Record.AddSelectorRef(E->getSelector());
14217330f729Sjoerg   }
14227330f729Sjoerg 
14237330f729Sjoerg   Record.AddSourceLocation(E->getLeftLoc());
14247330f729Sjoerg   Record.AddSourceLocation(E->getRightLoc());
14257330f729Sjoerg 
14267330f729Sjoerg   for (CallExpr::arg_iterator Arg = E->arg_begin(), ArgEnd = E->arg_end();
14277330f729Sjoerg        Arg != ArgEnd; ++Arg)
14287330f729Sjoerg     Record.AddStmt(*Arg);
14297330f729Sjoerg 
14307330f729Sjoerg   SourceLocation *Locs = E->getStoredSelLocs();
14317330f729Sjoerg   for (unsigned i = 0, e = E->getNumStoredSelLocs(); i != e; ++i)
14327330f729Sjoerg     Record.AddSourceLocation(Locs[i]);
14337330f729Sjoerg 
14347330f729Sjoerg   Code = serialization::EXPR_OBJC_MESSAGE_EXPR;
14357330f729Sjoerg }
14367330f729Sjoerg 
VisitObjCForCollectionStmt(ObjCForCollectionStmt * S)14377330f729Sjoerg void ASTStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
14387330f729Sjoerg   VisitStmt(S);
14397330f729Sjoerg   Record.AddStmt(S->getElement());
14407330f729Sjoerg   Record.AddStmt(S->getCollection());
14417330f729Sjoerg   Record.AddStmt(S->getBody());
14427330f729Sjoerg   Record.AddSourceLocation(S->getForLoc());
14437330f729Sjoerg   Record.AddSourceLocation(S->getRParenLoc());
14447330f729Sjoerg   Code = serialization::STMT_OBJC_FOR_COLLECTION;
14457330f729Sjoerg }
14467330f729Sjoerg 
VisitObjCAtCatchStmt(ObjCAtCatchStmt * S)14477330f729Sjoerg void ASTStmtWriter::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
14487330f729Sjoerg   VisitStmt(S);
14497330f729Sjoerg   Record.AddStmt(S->getCatchBody());
14507330f729Sjoerg   Record.AddDeclRef(S->getCatchParamDecl());
14517330f729Sjoerg   Record.AddSourceLocation(S->getAtCatchLoc());
14527330f729Sjoerg   Record.AddSourceLocation(S->getRParenLoc());
14537330f729Sjoerg   Code = serialization::STMT_OBJC_CATCH;
14547330f729Sjoerg }
14557330f729Sjoerg 
VisitObjCAtFinallyStmt(ObjCAtFinallyStmt * S)14567330f729Sjoerg void ASTStmtWriter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
14577330f729Sjoerg   VisitStmt(S);
14587330f729Sjoerg   Record.AddStmt(S->getFinallyBody());
14597330f729Sjoerg   Record.AddSourceLocation(S->getAtFinallyLoc());
14607330f729Sjoerg   Code = serialization::STMT_OBJC_FINALLY;
14617330f729Sjoerg }
14627330f729Sjoerg 
VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt * S)14637330f729Sjoerg void ASTStmtWriter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
14647330f729Sjoerg   VisitStmt(S); // FIXME: no test coverage.
14657330f729Sjoerg   Record.AddStmt(S->getSubStmt());
14667330f729Sjoerg   Record.AddSourceLocation(S->getAtLoc());
14677330f729Sjoerg   Code = serialization::STMT_OBJC_AUTORELEASE_POOL;
14687330f729Sjoerg }
14697330f729Sjoerg 
VisitObjCAtTryStmt(ObjCAtTryStmt * S)14707330f729Sjoerg void ASTStmtWriter::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
14717330f729Sjoerg   VisitStmt(S);
14727330f729Sjoerg   Record.push_back(S->getNumCatchStmts());
14737330f729Sjoerg   Record.push_back(S->getFinallyStmt() != nullptr);
14747330f729Sjoerg   Record.AddStmt(S->getTryBody());
14757330f729Sjoerg   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
14767330f729Sjoerg     Record.AddStmt(S->getCatchStmt(I));
14777330f729Sjoerg   if (S->getFinallyStmt())
14787330f729Sjoerg     Record.AddStmt(S->getFinallyStmt());
14797330f729Sjoerg   Record.AddSourceLocation(S->getAtTryLoc());
14807330f729Sjoerg   Code = serialization::STMT_OBJC_AT_TRY;
14817330f729Sjoerg }
14827330f729Sjoerg 
VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * S)14837330f729Sjoerg void ASTStmtWriter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
14847330f729Sjoerg   VisitStmt(S); // FIXME: no test coverage.
14857330f729Sjoerg   Record.AddStmt(S->getSynchExpr());
14867330f729Sjoerg   Record.AddStmt(S->getSynchBody());
14877330f729Sjoerg   Record.AddSourceLocation(S->getAtSynchronizedLoc());
14887330f729Sjoerg   Code = serialization::STMT_OBJC_AT_SYNCHRONIZED;
14897330f729Sjoerg }
14907330f729Sjoerg 
VisitObjCAtThrowStmt(ObjCAtThrowStmt * S)14917330f729Sjoerg void ASTStmtWriter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
14927330f729Sjoerg   VisitStmt(S); // FIXME: no test coverage.
14937330f729Sjoerg   Record.AddStmt(S->getThrowExpr());
14947330f729Sjoerg   Record.AddSourceLocation(S->getThrowLoc());
14957330f729Sjoerg   Code = serialization::STMT_OBJC_AT_THROW;
14967330f729Sjoerg }
14977330f729Sjoerg 
VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr * E)14987330f729Sjoerg void ASTStmtWriter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
14997330f729Sjoerg   VisitExpr(E);
15007330f729Sjoerg   Record.push_back(E->getValue());
15017330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
15027330f729Sjoerg   Code = serialization::EXPR_OBJC_BOOL_LITERAL;
15037330f729Sjoerg }
15047330f729Sjoerg 
VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr * E)15057330f729Sjoerg void ASTStmtWriter::VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr *E) {
15067330f729Sjoerg   VisitExpr(E);
15077330f729Sjoerg   Record.AddSourceRange(E->getSourceRange());
15087330f729Sjoerg   Record.AddVersionTuple(E->getVersion());
15097330f729Sjoerg   Code = serialization::EXPR_OBJC_AVAILABILITY_CHECK;
15107330f729Sjoerg }
15117330f729Sjoerg 
15127330f729Sjoerg //===----------------------------------------------------------------------===//
15137330f729Sjoerg // C++ Expressions and Statements.
15147330f729Sjoerg //===----------------------------------------------------------------------===//
15157330f729Sjoerg 
VisitCXXCatchStmt(CXXCatchStmt * S)15167330f729Sjoerg void ASTStmtWriter::VisitCXXCatchStmt(CXXCatchStmt *S) {
15177330f729Sjoerg   VisitStmt(S);
15187330f729Sjoerg   Record.AddSourceLocation(S->getCatchLoc());
15197330f729Sjoerg   Record.AddDeclRef(S->getExceptionDecl());
15207330f729Sjoerg   Record.AddStmt(S->getHandlerBlock());
15217330f729Sjoerg   Code = serialization::STMT_CXX_CATCH;
15227330f729Sjoerg }
15237330f729Sjoerg 
VisitCXXTryStmt(CXXTryStmt * S)15247330f729Sjoerg void ASTStmtWriter::VisitCXXTryStmt(CXXTryStmt *S) {
15257330f729Sjoerg   VisitStmt(S);
15267330f729Sjoerg   Record.push_back(S->getNumHandlers());
15277330f729Sjoerg   Record.AddSourceLocation(S->getTryLoc());
15287330f729Sjoerg   Record.AddStmt(S->getTryBlock());
15297330f729Sjoerg   for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
15307330f729Sjoerg     Record.AddStmt(S->getHandler(i));
15317330f729Sjoerg   Code = serialization::STMT_CXX_TRY;
15327330f729Sjoerg }
15337330f729Sjoerg 
VisitCXXForRangeStmt(CXXForRangeStmt * S)15347330f729Sjoerg void ASTStmtWriter::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
15357330f729Sjoerg   VisitStmt(S);
15367330f729Sjoerg   Record.AddSourceLocation(S->getForLoc());
15377330f729Sjoerg   Record.AddSourceLocation(S->getCoawaitLoc());
15387330f729Sjoerg   Record.AddSourceLocation(S->getColonLoc());
15397330f729Sjoerg   Record.AddSourceLocation(S->getRParenLoc());
15407330f729Sjoerg   Record.AddStmt(S->getInit());
15417330f729Sjoerg   Record.AddStmt(S->getRangeStmt());
15427330f729Sjoerg   Record.AddStmt(S->getBeginStmt());
15437330f729Sjoerg   Record.AddStmt(S->getEndStmt());
15447330f729Sjoerg   Record.AddStmt(S->getCond());
15457330f729Sjoerg   Record.AddStmt(S->getInc());
15467330f729Sjoerg   Record.AddStmt(S->getLoopVarStmt());
15477330f729Sjoerg   Record.AddStmt(S->getBody());
15487330f729Sjoerg   Code = serialization::STMT_CXX_FOR_RANGE;
15497330f729Sjoerg }
15507330f729Sjoerg 
VisitMSDependentExistsStmt(MSDependentExistsStmt * S)15517330f729Sjoerg void ASTStmtWriter::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
15527330f729Sjoerg   VisitStmt(S);
15537330f729Sjoerg   Record.AddSourceLocation(S->getKeywordLoc());
15547330f729Sjoerg   Record.push_back(S->isIfExists());
15557330f729Sjoerg   Record.AddNestedNameSpecifierLoc(S->getQualifierLoc());
15567330f729Sjoerg   Record.AddDeclarationNameInfo(S->getNameInfo());
15577330f729Sjoerg   Record.AddStmt(S->getSubStmt());
15587330f729Sjoerg   Code = serialization::STMT_MS_DEPENDENT_EXISTS;
15597330f729Sjoerg }
15607330f729Sjoerg 
VisitCXXOperatorCallExpr(CXXOperatorCallExpr * E)15617330f729Sjoerg void ASTStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
15627330f729Sjoerg   VisitCallExpr(E);
15637330f729Sjoerg   Record.push_back(E->getOperator());
15647330f729Sjoerg   Record.AddSourceRange(E->Range);
15657330f729Sjoerg   Code = serialization::EXPR_CXX_OPERATOR_CALL;
15667330f729Sjoerg }
15677330f729Sjoerg 
VisitCXXMemberCallExpr(CXXMemberCallExpr * E)15687330f729Sjoerg void ASTStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
15697330f729Sjoerg   VisitCallExpr(E);
15707330f729Sjoerg   Code = serialization::EXPR_CXX_MEMBER_CALL;
15717330f729Sjoerg }
15727330f729Sjoerg 
VisitCXXRewrittenBinaryOperator(CXXRewrittenBinaryOperator * E)15737330f729Sjoerg void ASTStmtWriter::VisitCXXRewrittenBinaryOperator(
15747330f729Sjoerg     CXXRewrittenBinaryOperator *E) {
15757330f729Sjoerg   VisitExpr(E);
15767330f729Sjoerg   Record.push_back(E->isReversed());
15777330f729Sjoerg   Record.AddStmt(E->getSemanticForm());
15787330f729Sjoerg   Code = serialization::EXPR_CXX_REWRITTEN_BINARY_OPERATOR;
15797330f729Sjoerg }
15807330f729Sjoerg 
VisitCXXConstructExpr(CXXConstructExpr * E)15817330f729Sjoerg void ASTStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
15827330f729Sjoerg   VisitExpr(E);
15837330f729Sjoerg 
15847330f729Sjoerg   Record.push_back(E->getNumArgs());
15857330f729Sjoerg   Record.push_back(E->isElidable());
15867330f729Sjoerg   Record.push_back(E->hadMultipleCandidates());
15877330f729Sjoerg   Record.push_back(E->isListInitialization());
15887330f729Sjoerg   Record.push_back(E->isStdInitListInitialization());
15897330f729Sjoerg   Record.push_back(E->requiresZeroInitialization());
15907330f729Sjoerg   Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
15917330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
15927330f729Sjoerg   Record.AddDeclRef(E->getConstructor());
15937330f729Sjoerg   Record.AddSourceRange(E->getParenOrBraceRange());
15947330f729Sjoerg 
15957330f729Sjoerg   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
15967330f729Sjoerg     Record.AddStmt(E->getArg(I));
15977330f729Sjoerg 
15987330f729Sjoerg   Code = serialization::EXPR_CXX_CONSTRUCT;
15997330f729Sjoerg }
16007330f729Sjoerg 
VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr * E)16017330f729Sjoerg void ASTStmtWriter::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {
16027330f729Sjoerg   VisitExpr(E);
16037330f729Sjoerg   Record.AddDeclRef(E->getConstructor());
16047330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
16057330f729Sjoerg   Record.push_back(E->constructsVBase());
16067330f729Sjoerg   Record.push_back(E->inheritedFromVBase());
16077330f729Sjoerg   Code = serialization::EXPR_CXX_INHERITED_CTOR_INIT;
16087330f729Sjoerg }
16097330f729Sjoerg 
VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * E)16107330f729Sjoerg void ASTStmtWriter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
16117330f729Sjoerg   VisitCXXConstructExpr(E);
16127330f729Sjoerg   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
16137330f729Sjoerg   Code = serialization::EXPR_CXX_TEMPORARY_OBJECT;
16147330f729Sjoerg }
16157330f729Sjoerg 
VisitLambdaExpr(LambdaExpr * E)16167330f729Sjoerg void ASTStmtWriter::VisitLambdaExpr(LambdaExpr *E) {
16177330f729Sjoerg   VisitExpr(E);
1618*e038c9c4Sjoerg   Record.push_back(E->LambdaExprBits.NumCaptures);
16197330f729Sjoerg   Record.AddSourceRange(E->IntroducerRange);
1620*e038c9c4Sjoerg   Record.push_back(E->LambdaExprBits.CaptureDefault); // FIXME: stable encoding
16217330f729Sjoerg   Record.AddSourceLocation(E->CaptureDefaultLoc);
1622*e038c9c4Sjoerg   Record.push_back(E->LambdaExprBits.ExplicitParams);
1623*e038c9c4Sjoerg   Record.push_back(E->LambdaExprBits.ExplicitResultType);
16247330f729Sjoerg   Record.AddSourceLocation(E->ClosingBrace);
16257330f729Sjoerg 
16267330f729Sjoerg   // Add capture initializers.
16277330f729Sjoerg   for (LambdaExpr::capture_init_iterator C = E->capture_init_begin(),
16287330f729Sjoerg                                       CEnd = E->capture_init_end();
16297330f729Sjoerg        C != CEnd; ++C) {
16307330f729Sjoerg     Record.AddStmt(*C);
16317330f729Sjoerg   }
16327330f729Sjoerg 
1633*e038c9c4Sjoerg   // Don't serialize the body. It belongs to the call operator declaration.
1634*e038c9c4Sjoerg   // LambdaExpr only stores a copy of the Stmt *.
1635*e038c9c4Sjoerg 
16367330f729Sjoerg   Code = serialization::EXPR_LAMBDA;
16377330f729Sjoerg }
16387330f729Sjoerg 
VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr * E)16397330f729Sjoerg void ASTStmtWriter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
16407330f729Sjoerg   VisitExpr(E);
16417330f729Sjoerg   Record.AddStmt(E->getSubExpr());
16427330f729Sjoerg   Code = serialization::EXPR_CXX_STD_INITIALIZER_LIST;
16437330f729Sjoerg }
16447330f729Sjoerg 
VisitCXXNamedCastExpr(CXXNamedCastExpr * E)16457330f729Sjoerg void ASTStmtWriter::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
16467330f729Sjoerg   VisitExplicitCastExpr(E);
16477330f729Sjoerg   Record.AddSourceRange(SourceRange(E->getOperatorLoc(), E->getRParenLoc()));
16487330f729Sjoerg   Record.AddSourceRange(E->getAngleBrackets());
16497330f729Sjoerg }
16507330f729Sjoerg 
VisitCXXStaticCastExpr(CXXStaticCastExpr * E)16517330f729Sjoerg void ASTStmtWriter::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
16527330f729Sjoerg   VisitCXXNamedCastExpr(E);
16537330f729Sjoerg   Code = serialization::EXPR_CXX_STATIC_CAST;
16547330f729Sjoerg }
16557330f729Sjoerg 
VisitCXXDynamicCastExpr(CXXDynamicCastExpr * E)16567330f729Sjoerg void ASTStmtWriter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
16577330f729Sjoerg   VisitCXXNamedCastExpr(E);
16587330f729Sjoerg   Code = serialization::EXPR_CXX_DYNAMIC_CAST;
16597330f729Sjoerg }
16607330f729Sjoerg 
VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr * E)16617330f729Sjoerg void ASTStmtWriter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
16627330f729Sjoerg   VisitCXXNamedCastExpr(E);
16637330f729Sjoerg   Code = serialization::EXPR_CXX_REINTERPRET_CAST;
16647330f729Sjoerg }
16657330f729Sjoerg 
VisitCXXConstCastExpr(CXXConstCastExpr * E)16667330f729Sjoerg void ASTStmtWriter::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
16677330f729Sjoerg   VisitCXXNamedCastExpr(E);
16687330f729Sjoerg   Code = serialization::EXPR_CXX_CONST_CAST;
16697330f729Sjoerg }
16707330f729Sjoerg 
VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr * E)1671*e038c9c4Sjoerg void ASTStmtWriter::VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
1672*e038c9c4Sjoerg   VisitCXXNamedCastExpr(E);
1673*e038c9c4Sjoerg   Code = serialization::EXPR_CXX_ADDRSPACE_CAST;
1674*e038c9c4Sjoerg }
1675*e038c9c4Sjoerg 
VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr * E)16767330f729Sjoerg void ASTStmtWriter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
16777330f729Sjoerg   VisitExplicitCastExpr(E);
16787330f729Sjoerg   Record.AddSourceLocation(E->getLParenLoc());
16797330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
16807330f729Sjoerg   Code = serialization::EXPR_CXX_FUNCTIONAL_CAST;
16817330f729Sjoerg }
16827330f729Sjoerg 
VisitBuiltinBitCastExpr(BuiltinBitCastExpr * E)16837330f729Sjoerg void ASTStmtWriter::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *E) {
16847330f729Sjoerg   VisitExplicitCastExpr(E);
16857330f729Sjoerg   Record.AddSourceLocation(E->getBeginLoc());
16867330f729Sjoerg   Record.AddSourceLocation(E->getEndLoc());
1687*e038c9c4Sjoerg   Code = serialization::EXPR_BUILTIN_BIT_CAST;
16887330f729Sjoerg }
16897330f729Sjoerg 
VisitUserDefinedLiteral(UserDefinedLiteral * E)16907330f729Sjoerg void ASTStmtWriter::VisitUserDefinedLiteral(UserDefinedLiteral *E) {
16917330f729Sjoerg   VisitCallExpr(E);
16927330f729Sjoerg   Record.AddSourceLocation(E->UDSuffixLoc);
16937330f729Sjoerg   Code = serialization::EXPR_USER_DEFINED_LITERAL;
16947330f729Sjoerg }
16957330f729Sjoerg 
VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr * E)16967330f729Sjoerg void ASTStmtWriter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
16977330f729Sjoerg   VisitExpr(E);
16987330f729Sjoerg   Record.push_back(E->getValue());
16997330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
17007330f729Sjoerg   Code = serialization::EXPR_CXX_BOOL_LITERAL;
17017330f729Sjoerg }
17027330f729Sjoerg 
VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr * E)17037330f729Sjoerg void ASTStmtWriter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
17047330f729Sjoerg   VisitExpr(E);
17057330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
17067330f729Sjoerg   Code = serialization::EXPR_CXX_NULL_PTR_LITERAL;
17077330f729Sjoerg }
17087330f729Sjoerg 
VisitCXXTypeidExpr(CXXTypeidExpr * E)17097330f729Sjoerg void ASTStmtWriter::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
17107330f729Sjoerg   VisitExpr(E);
17117330f729Sjoerg   Record.AddSourceRange(E->getSourceRange());
17127330f729Sjoerg   if (E->isTypeOperand()) {
17137330f729Sjoerg     Record.AddTypeSourceInfo(E->getTypeOperandSourceInfo());
17147330f729Sjoerg     Code = serialization::EXPR_CXX_TYPEID_TYPE;
17157330f729Sjoerg   } else {
17167330f729Sjoerg     Record.AddStmt(E->getExprOperand());
17177330f729Sjoerg     Code = serialization::EXPR_CXX_TYPEID_EXPR;
17187330f729Sjoerg   }
17197330f729Sjoerg }
17207330f729Sjoerg 
VisitCXXThisExpr(CXXThisExpr * E)17217330f729Sjoerg void ASTStmtWriter::VisitCXXThisExpr(CXXThisExpr *E) {
17227330f729Sjoerg   VisitExpr(E);
17237330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
17247330f729Sjoerg   Record.push_back(E->isImplicit());
17257330f729Sjoerg   Code = serialization::EXPR_CXX_THIS;
17267330f729Sjoerg }
17277330f729Sjoerg 
VisitCXXThrowExpr(CXXThrowExpr * E)17287330f729Sjoerg void ASTStmtWriter::VisitCXXThrowExpr(CXXThrowExpr *E) {
17297330f729Sjoerg   VisitExpr(E);
17307330f729Sjoerg   Record.AddSourceLocation(E->getThrowLoc());
17317330f729Sjoerg   Record.AddStmt(E->getSubExpr());
17327330f729Sjoerg   Record.push_back(E->isThrownVariableInScope());
17337330f729Sjoerg   Code = serialization::EXPR_CXX_THROW;
17347330f729Sjoerg }
17357330f729Sjoerg 
VisitCXXDefaultArgExpr(CXXDefaultArgExpr * E)17367330f729Sjoerg void ASTStmtWriter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
17377330f729Sjoerg   VisitExpr(E);
17387330f729Sjoerg   Record.AddDeclRef(E->getParam());
17397330f729Sjoerg   Record.AddDeclRef(cast_or_null<Decl>(E->getUsedContext()));
17407330f729Sjoerg   Record.AddSourceLocation(E->getUsedLocation());
17417330f729Sjoerg   Code = serialization::EXPR_CXX_DEFAULT_ARG;
17427330f729Sjoerg }
17437330f729Sjoerg 
VisitCXXDefaultInitExpr(CXXDefaultInitExpr * E)17447330f729Sjoerg void ASTStmtWriter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
17457330f729Sjoerg   VisitExpr(E);
17467330f729Sjoerg   Record.AddDeclRef(E->getField());
17477330f729Sjoerg   Record.AddDeclRef(cast_or_null<Decl>(E->getUsedContext()));
17487330f729Sjoerg   Record.AddSourceLocation(E->getExprLoc());
17497330f729Sjoerg   Code = serialization::EXPR_CXX_DEFAULT_INIT;
17507330f729Sjoerg }
17517330f729Sjoerg 
VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr * E)17527330f729Sjoerg void ASTStmtWriter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
17537330f729Sjoerg   VisitExpr(E);
17547330f729Sjoerg   Record.AddCXXTemporary(E->getTemporary());
17557330f729Sjoerg   Record.AddStmt(E->getSubExpr());
17567330f729Sjoerg   Code = serialization::EXPR_CXX_BIND_TEMPORARY;
17577330f729Sjoerg }
17587330f729Sjoerg 
VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr * E)17597330f729Sjoerg void ASTStmtWriter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
17607330f729Sjoerg   VisitExpr(E);
17617330f729Sjoerg   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
17627330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
17637330f729Sjoerg   Code = serialization::EXPR_CXX_SCALAR_VALUE_INIT;
17647330f729Sjoerg }
17657330f729Sjoerg 
VisitCXXNewExpr(CXXNewExpr * E)17667330f729Sjoerg void ASTStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
17677330f729Sjoerg   VisitExpr(E);
17687330f729Sjoerg 
17697330f729Sjoerg   Record.push_back(E->isArray());
17707330f729Sjoerg   Record.push_back(E->hasInitializer());
17717330f729Sjoerg   Record.push_back(E->getNumPlacementArgs());
17727330f729Sjoerg   Record.push_back(E->isParenTypeId());
17737330f729Sjoerg 
17747330f729Sjoerg   Record.push_back(E->isGlobalNew());
17757330f729Sjoerg   Record.push_back(E->passAlignment());
17767330f729Sjoerg   Record.push_back(E->doesUsualArrayDeleteWantSize());
17777330f729Sjoerg   Record.push_back(E->CXXNewExprBits.StoredInitializationStyle);
17787330f729Sjoerg 
17797330f729Sjoerg   Record.AddDeclRef(E->getOperatorNew());
17807330f729Sjoerg   Record.AddDeclRef(E->getOperatorDelete());
17817330f729Sjoerg   Record.AddTypeSourceInfo(E->getAllocatedTypeSourceInfo());
17827330f729Sjoerg   if (E->isParenTypeId())
17837330f729Sjoerg     Record.AddSourceRange(E->getTypeIdParens());
17847330f729Sjoerg   Record.AddSourceRange(E->getSourceRange());
17857330f729Sjoerg   Record.AddSourceRange(E->getDirectInitRange());
17867330f729Sjoerg 
17877330f729Sjoerg   for (CXXNewExpr::arg_iterator I = E->raw_arg_begin(), N = E->raw_arg_end();
17887330f729Sjoerg        I != N; ++I)
17897330f729Sjoerg     Record.AddStmt(*I);
17907330f729Sjoerg 
17917330f729Sjoerg   Code = serialization::EXPR_CXX_NEW;
17927330f729Sjoerg }
17937330f729Sjoerg 
VisitCXXDeleteExpr(CXXDeleteExpr * E)17947330f729Sjoerg void ASTStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
17957330f729Sjoerg   VisitExpr(E);
17967330f729Sjoerg   Record.push_back(E->isGlobalDelete());
17977330f729Sjoerg   Record.push_back(E->isArrayForm());
17987330f729Sjoerg   Record.push_back(E->isArrayFormAsWritten());
17997330f729Sjoerg   Record.push_back(E->doesUsualArrayDeleteWantSize());
18007330f729Sjoerg   Record.AddDeclRef(E->getOperatorDelete());
18017330f729Sjoerg   Record.AddStmt(E->getArgument());
18027330f729Sjoerg   Record.AddSourceLocation(E->getBeginLoc());
18037330f729Sjoerg 
18047330f729Sjoerg   Code = serialization::EXPR_CXX_DELETE;
18057330f729Sjoerg }
18067330f729Sjoerg 
VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr * E)18077330f729Sjoerg void ASTStmtWriter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
18087330f729Sjoerg   VisitExpr(E);
18097330f729Sjoerg 
18107330f729Sjoerg   Record.AddStmt(E->getBase());
18117330f729Sjoerg   Record.push_back(E->isArrow());
18127330f729Sjoerg   Record.AddSourceLocation(E->getOperatorLoc());
18137330f729Sjoerg   Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
18147330f729Sjoerg   Record.AddTypeSourceInfo(E->getScopeTypeInfo());
18157330f729Sjoerg   Record.AddSourceLocation(E->getColonColonLoc());
18167330f729Sjoerg   Record.AddSourceLocation(E->getTildeLoc());
18177330f729Sjoerg 
18187330f729Sjoerg   // PseudoDestructorTypeStorage.
18197330f729Sjoerg   Record.AddIdentifierRef(E->getDestroyedTypeIdentifier());
18207330f729Sjoerg   if (E->getDestroyedTypeIdentifier())
18217330f729Sjoerg     Record.AddSourceLocation(E->getDestroyedTypeLoc());
18227330f729Sjoerg   else
18237330f729Sjoerg     Record.AddTypeSourceInfo(E->getDestroyedTypeInfo());
18247330f729Sjoerg 
18257330f729Sjoerg   Code = serialization::EXPR_CXX_PSEUDO_DESTRUCTOR;
18267330f729Sjoerg }
18277330f729Sjoerg 
VisitExprWithCleanups(ExprWithCleanups * E)18287330f729Sjoerg void ASTStmtWriter::VisitExprWithCleanups(ExprWithCleanups *E) {
18297330f729Sjoerg   VisitExpr(E);
18307330f729Sjoerg   Record.push_back(E->getNumObjects());
1831*e038c9c4Sjoerg   for (auto &Obj : E->getObjects()) {
1832*e038c9c4Sjoerg     if (auto *BD = Obj.dyn_cast<BlockDecl *>()) {
1833*e038c9c4Sjoerg       Record.push_back(serialization::COK_Block);
1834*e038c9c4Sjoerg       Record.AddDeclRef(BD);
1835*e038c9c4Sjoerg     } else if (auto *CLE = Obj.dyn_cast<CompoundLiteralExpr *>()) {
1836*e038c9c4Sjoerg       Record.push_back(serialization::COK_CompoundLiteral);
1837*e038c9c4Sjoerg       Record.AddStmt(CLE);
1838*e038c9c4Sjoerg     }
1839*e038c9c4Sjoerg   }
18407330f729Sjoerg 
18417330f729Sjoerg   Record.push_back(E->cleanupsHaveSideEffects());
18427330f729Sjoerg   Record.AddStmt(E->getSubExpr());
18437330f729Sjoerg   Code = serialization::EXPR_EXPR_WITH_CLEANUPS;
18447330f729Sjoerg }
18457330f729Sjoerg 
VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr * E)18467330f729Sjoerg void ASTStmtWriter::VisitCXXDependentScopeMemberExpr(
18477330f729Sjoerg     CXXDependentScopeMemberExpr *E) {
18487330f729Sjoerg   VisitExpr(E);
18497330f729Sjoerg 
18507330f729Sjoerg   // Don't emit anything here (or if you do you will have to update
18517330f729Sjoerg   // the corresponding deserialization function).
18527330f729Sjoerg 
18537330f729Sjoerg   Record.push_back(E->hasTemplateKWAndArgsInfo());
18547330f729Sjoerg   Record.push_back(E->getNumTemplateArgs());
18557330f729Sjoerg   Record.push_back(E->hasFirstQualifierFoundInScope());
18567330f729Sjoerg 
18577330f729Sjoerg   if (E->hasTemplateKWAndArgsInfo()) {
18587330f729Sjoerg     const ASTTemplateKWAndArgsInfo &ArgInfo =
18597330f729Sjoerg         *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
18607330f729Sjoerg     AddTemplateKWAndArgsInfo(ArgInfo,
18617330f729Sjoerg                              E->getTrailingObjects<TemplateArgumentLoc>());
18627330f729Sjoerg   }
18637330f729Sjoerg 
18647330f729Sjoerg   Record.push_back(E->isArrow());
18657330f729Sjoerg   Record.AddSourceLocation(E->getOperatorLoc());
18667330f729Sjoerg   Record.AddTypeRef(E->getBaseType());
18677330f729Sjoerg   Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
18687330f729Sjoerg   if (!E->isImplicitAccess())
18697330f729Sjoerg     Record.AddStmt(E->getBase());
18707330f729Sjoerg   else
18717330f729Sjoerg     Record.AddStmt(nullptr);
18727330f729Sjoerg 
18737330f729Sjoerg   if (E->hasFirstQualifierFoundInScope())
18747330f729Sjoerg     Record.AddDeclRef(E->getFirstQualifierFoundInScope());
18757330f729Sjoerg 
18767330f729Sjoerg   Record.AddDeclarationNameInfo(E->MemberNameInfo);
18777330f729Sjoerg   Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_MEMBER;
18787330f729Sjoerg }
18797330f729Sjoerg 
18807330f729Sjoerg void
VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * E)18817330f729Sjoerg ASTStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
18827330f729Sjoerg   VisitExpr(E);
18837330f729Sjoerg 
18847330f729Sjoerg   // Don't emit anything here, HasTemplateKWAndArgsInfo must be
18857330f729Sjoerg   // emitted first.
18867330f729Sjoerg 
18877330f729Sjoerg   Record.push_back(E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo);
18887330f729Sjoerg   if (E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo) {
18897330f729Sjoerg     const ASTTemplateKWAndArgsInfo &ArgInfo =
18907330f729Sjoerg         *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
18917330f729Sjoerg     Record.push_back(ArgInfo.NumTemplateArgs);
18927330f729Sjoerg     AddTemplateKWAndArgsInfo(ArgInfo,
18937330f729Sjoerg                              E->getTrailingObjects<TemplateArgumentLoc>());
18947330f729Sjoerg   }
18957330f729Sjoerg 
18967330f729Sjoerg   Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
18977330f729Sjoerg   Record.AddDeclarationNameInfo(E->NameInfo);
18987330f729Sjoerg   Code = serialization::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF;
18997330f729Sjoerg }
19007330f729Sjoerg 
19017330f729Sjoerg void
VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr * E)19027330f729Sjoerg ASTStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
19037330f729Sjoerg   VisitExpr(E);
1904*e038c9c4Sjoerg   Record.push_back(E->getNumArgs());
19057330f729Sjoerg   for (CXXUnresolvedConstructExpr::arg_iterator
19067330f729Sjoerg          ArgI = E->arg_begin(), ArgE = E->arg_end(); ArgI != ArgE; ++ArgI)
19077330f729Sjoerg     Record.AddStmt(*ArgI);
19087330f729Sjoerg   Record.AddTypeSourceInfo(E->getTypeSourceInfo());
19097330f729Sjoerg   Record.AddSourceLocation(E->getLParenLoc());
19107330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
19117330f729Sjoerg   Code = serialization::EXPR_CXX_UNRESOLVED_CONSTRUCT;
19127330f729Sjoerg }
19137330f729Sjoerg 
VisitOverloadExpr(OverloadExpr * E)19147330f729Sjoerg void ASTStmtWriter::VisitOverloadExpr(OverloadExpr *E) {
19157330f729Sjoerg   VisitExpr(E);
19167330f729Sjoerg 
19177330f729Sjoerg   Record.push_back(E->getNumDecls());
19187330f729Sjoerg   Record.push_back(E->hasTemplateKWAndArgsInfo());
19197330f729Sjoerg   if (E->hasTemplateKWAndArgsInfo()) {
19207330f729Sjoerg     const ASTTemplateKWAndArgsInfo &ArgInfo =
19217330f729Sjoerg         *E->getTrailingASTTemplateKWAndArgsInfo();
19227330f729Sjoerg     Record.push_back(ArgInfo.NumTemplateArgs);
19237330f729Sjoerg     AddTemplateKWAndArgsInfo(ArgInfo, E->getTrailingTemplateArgumentLoc());
19247330f729Sjoerg   }
19257330f729Sjoerg 
19267330f729Sjoerg   for (OverloadExpr::decls_iterator OvI = E->decls_begin(),
19277330f729Sjoerg                                     OvE = E->decls_end();
19287330f729Sjoerg        OvI != OvE; ++OvI) {
19297330f729Sjoerg     Record.AddDeclRef(OvI.getDecl());
19307330f729Sjoerg     Record.push_back(OvI.getAccess());
19317330f729Sjoerg   }
19327330f729Sjoerg 
19337330f729Sjoerg   Record.AddDeclarationNameInfo(E->getNameInfo());
19347330f729Sjoerg   Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
19357330f729Sjoerg }
19367330f729Sjoerg 
VisitUnresolvedMemberExpr(UnresolvedMemberExpr * E)19377330f729Sjoerg void ASTStmtWriter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
19387330f729Sjoerg   VisitOverloadExpr(E);
19397330f729Sjoerg   Record.push_back(E->isArrow());
19407330f729Sjoerg   Record.push_back(E->hasUnresolvedUsing());
19417330f729Sjoerg   Record.AddStmt(!E->isImplicitAccess() ? E->getBase() : nullptr);
19427330f729Sjoerg   Record.AddTypeRef(E->getBaseType());
19437330f729Sjoerg   Record.AddSourceLocation(E->getOperatorLoc());
19447330f729Sjoerg   Code = serialization::EXPR_CXX_UNRESOLVED_MEMBER;
19457330f729Sjoerg }
19467330f729Sjoerg 
VisitUnresolvedLookupExpr(UnresolvedLookupExpr * E)19477330f729Sjoerg void ASTStmtWriter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
19487330f729Sjoerg   VisitOverloadExpr(E);
19497330f729Sjoerg   Record.push_back(E->requiresADL());
19507330f729Sjoerg   Record.push_back(E->isOverloaded());
19517330f729Sjoerg   Record.AddDeclRef(E->getNamingClass());
19527330f729Sjoerg   Code = serialization::EXPR_CXX_UNRESOLVED_LOOKUP;
19537330f729Sjoerg }
19547330f729Sjoerg 
VisitTypeTraitExpr(TypeTraitExpr * E)19557330f729Sjoerg void ASTStmtWriter::VisitTypeTraitExpr(TypeTraitExpr *E) {
19567330f729Sjoerg   VisitExpr(E);
19577330f729Sjoerg   Record.push_back(E->TypeTraitExprBits.NumArgs);
19587330f729Sjoerg   Record.push_back(E->TypeTraitExprBits.Kind); // FIXME: Stable encoding
19597330f729Sjoerg   Record.push_back(E->TypeTraitExprBits.Value);
19607330f729Sjoerg   Record.AddSourceRange(E->getSourceRange());
19617330f729Sjoerg   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
19627330f729Sjoerg     Record.AddTypeSourceInfo(E->getArg(I));
19637330f729Sjoerg   Code = serialization::EXPR_TYPE_TRAIT;
19647330f729Sjoerg }
19657330f729Sjoerg 
VisitArrayTypeTraitExpr(ArrayTypeTraitExpr * E)19667330f729Sjoerg void ASTStmtWriter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
19677330f729Sjoerg   VisitExpr(E);
19687330f729Sjoerg   Record.push_back(E->getTrait());
19697330f729Sjoerg   Record.push_back(E->getValue());
19707330f729Sjoerg   Record.AddSourceRange(E->getSourceRange());
19717330f729Sjoerg   Record.AddTypeSourceInfo(E->getQueriedTypeSourceInfo());
19727330f729Sjoerg   Record.AddStmt(E->getDimensionExpression());
19737330f729Sjoerg   Code = serialization::EXPR_ARRAY_TYPE_TRAIT;
19747330f729Sjoerg }
19757330f729Sjoerg 
VisitExpressionTraitExpr(ExpressionTraitExpr * E)19767330f729Sjoerg void ASTStmtWriter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
19777330f729Sjoerg   VisitExpr(E);
19787330f729Sjoerg   Record.push_back(E->getTrait());
19797330f729Sjoerg   Record.push_back(E->getValue());
19807330f729Sjoerg   Record.AddSourceRange(E->getSourceRange());
19817330f729Sjoerg   Record.AddStmt(E->getQueriedExpression());
19827330f729Sjoerg   Code = serialization::EXPR_CXX_EXPRESSION_TRAIT;
19837330f729Sjoerg }
19847330f729Sjoerg 
VisitCXXNoexceptExpr(CXXNoexceptExpr * E)19857330f729Sjoerg void ASTStmtWriter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
19867330f729Sjoerg   VisitExpr(E);
19877330f729Sjoerg   Record.push_back(E->getValue());
19887330f729Sjoerg   Record.AddSourceRange(E->getSourceRange());
19897330f729Sjoerg   Record.AddStmt(E->getOperand());
19907330f729Sjoerg   Code = serialization::EXPR_CXX_NOEXCEPT;
19917330f729Sjoerg }
19927330f729Sjoerg 
VisitPackExpansionExpr(PackExpansionExpr * E)19937330f729Sjoerg void ASTStmtWriter::VisitPackExpansionExpr(PackExpansionExpr *E) {
19947330f729Sjoerg   VisitExpr(E);
19957330f729Sjoerg   Record.AddSourceLocation(E->getEllipsisLoc());
19967330f729Sjoerg   Record.push_back(E->NumExpansions);
19977330f729Sjoerg   Record.AddStmt(E->getPattern());
19987330f729Sjoerg   Code = serialization::EXPR_PACK_EXPANSION;
19997330f729Sjoerg }
20007330f729Sjoerg 
VisitSizeOfPackExpr(SizeOfPackExpr * E)20017330f729Sjoerg void ASTStmtWriter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
20027330f729Sjoerg   VisitExpr(E);
20037330f729Sjoerg   Record.push_back(E->isPartiallySubstituted() ? E->getPartialArguments().size()
20047330f729Sjoerg                                                : 0);
20057330f729Sjoerg   Record.AddSourceLocation(E->OperatorLoc);
20067330f729Sjoerg   Record.AddSourceLocation(E->PackLoc);
20077330f729Sjoerg   Record.AddSourceLocation(E->RParenLoc);
20087330f729Sjoerg   Record.AddDeclRef(E->Pack);
20097330f729Sjoerg   if (E->isPartiallySubstituted()) {
20107330f729Sjoerg     for (const auto &TA : E->getPartialArguments())
20117330f729Sjoerg       Record.AddTemplateArgument(TA);
20127330f729Sjoerg   } else if (!E->isValueDependent()) {
20137330f729Sjoerg     Record.push_back(E->getPackLength());
20147330f729Sjoerg   }
20157330f729Sjoerg   Code = serialization::EXPR_SIZEOF_PACK;
20167330f729Sjoerg }
20177330f729Sjoerg 
VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * E)20187330f729Sjoerg void ASTStmtWriter::VisitSubstNonTypeTemplateParmExpr(
20197330f729Sjoerg                                               SubstNonTypeTemplateParmExpr *E) {
20207330f729Sjoerg   VisitExpr(E);
20217330f729Sjoerg   Record.AddDeclRef(E->getParameter());
2022*e038c9c4Sjoerg   Record.push_back(E->isReferenceParameter());
20237330f729Sjoerg   Record.AddSourceLocation(E->getNameLoc());
20247330f729Sjoerg   Record.AddStmt(E->getReplacement());
20257330f729Sjoerg   Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM;
20267330f729Sjoerg }
20277330f729Sjoerg 
VisitSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * E)20287330f729Sjoerg void ASTStmtWriter::VisitSubstNonTypeTemplateParmPackExpr(
20297330f729Sjoerg                                           SubstNonTypeTemplateParmPackExpr *E) {
20307330f729Sjoerg   VisitExpr(E);
20317330f729Sjoerg   Record.AddDeclRef(E->getParameterPack());
20327330f729Sjoerg   Record.AddTemplateArgument(E->getArgumentPack());
20337330f729Sjoerg   Record.AddSourceLocation(E->getParameterPackLocation());
20347330f729Sjoerg   Code = serialization::EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK;
20357330f729Sjoerg }
20367330f729Sjoerg 
VisitFunctionParmPackExpr(FunctionParmPackExpr * E)20377330f729Sjoerg void ASTStmtWriter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
20387330f729Sjoerg   VisitExpr(E);
20397330f729Sjoerg   Record.push_back(E->getNumExpansions());
20407330f729Sjoerg   Record.AddDeclRef(E->getParameterPack());
20417330f729Sjoerg   Record.AddSourceLocation(E->getParameterPackLocation());
20427330f729Sjoerg   for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end();
20437330f729Sjoerg        I != End; ++I)
20447330f729Sjoerg     Record.AddDeclRef(*I);
20457330f729Sjoerg   Code = serialization::EXPR_FUNCTION_PARM_PACK;
20467330f729Sjoerg }
20477330f729Sjoerg 
VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr * E)20487330f729Sjoerg void ASTStmtWriter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
20497330f729Sjoerg   VisitExpr(E);
2050*e038c9c4Sjoerg   Record.push_back(static_cast<bool>(E->getLifetimeExtendedTemporaryDecl()));
2051*e038c9c4Sjoerg   if (E->getLifetimeExtendedTemporaryDecl())
2052*e038c9c4Sjoerg     Record.AddDeclRef(E->getLifetimeExtendedTemporaryDecl());
2053*e038c9c4Sjoerg   else
2054*e038c9c4Sjoerg     Record.AddStmt(E->getSubExpr());
20557330f729Sjoerg   Code = serialization::EXPR_MATERIALIZE_TEMPORARY;
20567330f729Sjoerg }
20577330f729Sjoerg 
VisitCXXFoldExpr(CXXFoldExpr * E)20587330f729Sjoerg void ASTStmtWriter::VisitCXXFoldExpr(CXXFoldExpr *E) {
20597330f729Sjoerg   VisitExpr(E);
20607330f729Sjoerg   Record.AddSourceLocation(E->LParenLoc);
20617330f729Sjoerg   Record.AddSourceLocation(E->EllipsisLoc);
20627330f729Sjoerg   Record.AddSourceLocation(E->RParenLoc);
20637330f729Sjoerg   Record.push_back(E->NumExpansions);
20647330f729Sjoerg   Record.AddStmt(E->SubExprs[0]);
20657330f729Sjoerg   Record.AddStmt(E->SubExprs[1]);
2066*e038c9c4Sjoerg   Record.AddStmt(E->SubExprs[2]);
20677330f729Sjoerg   Record.push_back(E->Opcode);
20687330f729Sjoerg   Code = serialization::EXPR_CXX_FOLD;
20697330f729Sjoerg }
20707330f729Sjoerg 
VisitOpaqueValueExpr(OpaqueValueExpr * E)20717330f729Sjoerg void ASTStmtWriter::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
20727330f729Sjoerg   VisitExpr(E);
20737330f729Sjoerg   Record.AddStmt(E->getSourceExpr());
20747330f729Sjoerg   Record.AddSourceLocation(E->getLocation());
20757330f729Sjoerg   Record.push_back(E->isUnique());
20767330f729Sjoerg   Code = serialization::EXPR_OPAQUE_VALUE;
20777330f729Sjoerg }
20787330f729Sjoerg 
VisitTypoExpr(TypoExpr * E)20797330f729Sjoerg void ASTStmtWriter::VisitTypoExpr(TypoExpr *E) {
20807330f729Sjoerg   VisitExpr(E);
20817330f729Sjoerg   // TODO: Figure out sane writer behavior for a TypoExpr, if necessary
20827330f729Sjoerg   llvm_unreachable("Cannot write TypoExpr nodes");
20837330f729Sjoerg }
20847330f729Sjoerg 
20857330f729Sjoerg //===----------------------------------------------------------------------===//
20867330f729Sjoerg // CUDA Expressions and Statements.
20877330f729Sjoerg //===----------------------------------------------------------------------===//
20887330f729Sjoerg 
VisitCUDAKernelCallExpr(CUDAKernelCallExpr * E)20897330f729Sjoerg void ASTStmtWriter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
20907330f729Sjoerg   VisitCallExpr(E);
20917330f729Sjoerg   Record.AddStmt(E->getConfig());
20927330f729Sjoerg   Code = serialization::EXPR_CUDA_KERNEL_CALL;
20937330f729Sjoerg }
20947330f729Sjoerg 
20957330f729Sjoerg //===----------------------------------------------------------------------===//
20967330f729Sjoerg // OpenCL Expressions and Statements.
20977330f729Sjoerg //===----------------------------------------------------------------------===//
VisitAsTypeExpr(AsTypeExpr * E)20987330f729Sjoerg void ASTStmtWriter::VisitAsTypeExpr(AsTypeExpr *E) {
20997330f729Sjoerg   VisitExpr(E);
21007330f729Sjoerg   Record.AddSourceLocation(E->getBuiltinLoc());
21017330f729Sjoerg   Record.AddSourceLocation(E->getRParenLoc());
21027330f729Sjoerg   Record.AddStmt(E->getSrcExpr());
21037330f729Sjoerg   Code = serialization::EXPR_ASTYPE;
21047330f729Sjoerg }
21057330f729Sjoerg 
21067330f729Sjoerg //===----------------------------------------------------------------------===//
21077330f729Sjoerg // Microsoft Expressions and Statements.
21087330f729Sjoerg //===----------------------------------------------------------------------===//
VisitMSPropertyRefExpr(MSPropertyRefExpr * E)21097330f729Sjoerg void ASTStmtWriter::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {
21107330f729Sjoerg   VisitExpr(E);
21117330f729Sjoerg   Record.push_back(E->isArrow());
21127330f729Sjoerg   Record.AddStmt(E->getBaseExpr());
21137330f729Sjoerg   Record.AddNestedNameSpecifierLoc(E->getQualifierLoc());
21147330f729Sjoerg   Record.AddSourceLocation(E->getMemberLoc());
21157330f729Sjoerg   Record.AddDeclRef(E->getPropertyDecl());
21167330f729Sjoerg   Code = serialization::EXPR_CXX_PROPERTY_REF_EXPR;
21177330f729Sjoerg }
21187330f729Sjoerg 
VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr * E)21197330f729Sjoerg void ASTStmtWriter::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) {
21207330f729Sjoerg   VisitExpr(E);
21217330f729Sjoerg   Record.AddStmt(E->getBase());
21227330f729Sjoerg   Record.AddStmt(E->getIdx());
21237330f729Sjoerg   Record.AddSourceLocation(E->getRBracketLoc());
21247330f729Sjoerg   Code = serialization::EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR;
21257330f729Sjoerg }
21267330f729Sjoerg 
VisitCXXUuidofExpr(CXXUuidofExpr * E)21277330f729Sjoerg void ASTStmtWriter::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
21287330f729Sjoerg   VisitExpr(E);
21297330f729Sjoerg   Record.AddSourceRange(E->getSourceRange());
2130*e038c9c4Sjoerg   Record.AddDeclRef(E->getGuidDecl());
21317330f729Sjoerg   if (E->isTypeOperand()) {
21327330f729Sjoerg     Record.AddTypeSourceInfo(E->getTypeOperandSourceInfo());
21337330f729Sjoerg     Code = serialization::EXPR_CXX_UUIDOF_TYPE;
21347330f729Sjoerg   } else {
21357330f729Sjoerg     Record.AddStmt(E->getExprOperand());
21367330f729Sjoerg     Code = serialization::EXPR_CXX_UUIDOF_EXPR;
21377330f729Sjoerg   }
21387330f729Sjoerg }
21397330f729Sjoerg 
VisitSEHExceptStmt(SEHExceptStmt * S)21407330f729Sjoerg void ASTStmtWriter::VisitSEHExceptStmt(SEHExceptStmt *S) {
21417330f729Sjoerg   VisitStmt(S);
21427330f729Sjoerg   Record.AddSourceLocation(S->getExceptLoc());
21437330f729Sjoerg   Record.AddStmt(S->getFilterExpr());
21447330f729Sjoerg   Record.AddStmt(S->getBlock());
21457330f729Sjoerg   Code = serialization::STMT_SEH_EXCEPT;
21467330f729Sjoerg }
21477330f729Sjoerg 
VisitSEHFinallyStmt(SEHFinallyStmt * S)21487330f729Sjoerg void ASTStmtWriter::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
21497330f729Sjoerg   VisitStmt(S);
21507330f729Sjoerg   Record.AddSourceLocation(S->getFinallyLoc());
21517330f729Sjoerg   Record.AddStmt(S->getBlock());
21527330f729Sjoerg   Code = serialization::STMT_SEH_FINALLY;
21537330f729Sjoerg }
21547330f729Sjoerg 
VisitSEHTryStmt(SEHTryStmt * S)21557330f729Sjoerg void ASTStmtWriter::VisitSEHTryStmt(SEHTryStmt *S) {
21567330f729Sjoerg   VisitStmt(S);
21577330f729Sjoerg   Record.push_back(S->getIsCXXTry());
21587330f729Sjoerg   Record.AddSourceLocation(S->getTryLoc());
21597330f729Sjoerg   Record.AddStmt(S->getTryBlock());
21607330f729Sjoerg   Record.AddStmt(S->getHandler());
21617330f729Sjoerg   Code = serialization::STMT_SEH_TRY;
21627330f729Sjoerg }
21637330f729Sjoerg 
VisitSEHLeaveStmt(SEHLeaveStmt * S)21647330f729Sjoerg void ASTStmtWriter::VisitSEHLeaveStmt(SEHLeaveStmt *S) {
21657330f729Sjoerg   VisitStmt(S);
21667330f729Sjoerg   Record.AddSourceLocation(S->getLeaveLoc());
21677330f729Sjoerg   Code = serialization::STMT_SEH_LEAVE;
21687330f729Sjoerg }
21697330f729Sjoerg 
21707330f729Sjoerg //===----------------------------------------------------------------------===//
21717330f729Sjoerg // OpenMP Directives.
21727330f729Sjoerg //===----------------------------------------------------------------------===//
2173*e038c9c4Sjoerg 
VisitOMPCanonicalLoop(OMPCanonicalLoop * S)2174*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPCanonicalLoop(OMPCanonicalLoop *S) {
2175*e038c9c4Sjoerg   VisitStmt(S);
2176*e038c9c4Sjoerg   for (Stmt *SubStmt : S->SubStmts)
2177*e038c9c4Sjoerg     Record.AddStmt(SubStmt);
2178*e038c9c4Sjoerg   Code = serialization::STMT_OMP_CANONICAL_LOOP;
2179*e038c9c4Sjoerg }
2180*e038c9c4Sjoerg 
VisitOMPExecutableDirective(OMPExecutableDirective * E)21817330f729Sjoerg void ASTStmtWriter::VisitOMPExecutableDirective(OMPExecutableDirective *E) {
2182*e038c9c4Sjoerg   Record.writeOMPChildren(E->Data);
21837330f729Sjoerg   Record.AddSourceLocation(E->getBeginLoc());
21847330f729Sjoerg   Record.AddSourceLocation(E->getEndLoc());
21857330f729Sjoerg }
2186*e038c9c4Sjoerg 
VisitOMPLoopBasedDirective(OMPLoopBasedDirective * D)2187*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPLoopBasedDirective(OMPLoopBasedDirective *D) {
2188*e038c9c4Sjoerg   VisitStmt(D);
2189*e038c9c4Sjoerg   Record.writeUInt32(D->getLoopsNumber());
2190*e038c9c4Sjoerg   VisitOMPExecutableDirective(D);
21917330f729Sjoerg }
21927330f729Sjoerg 
VisitOMPLoopDirective(OMPLoopDirective * D)21937330f729Sjoerg void ASTStmtWriter::VisitOMPLoopDirective(OMPLoopDirective *D) {
2194*e038c9c4Sjoerg   VisitOMPLoopBasedDirective(D);
21957330f729Sjoerg }
21967330f729Sjoerg 
VisitOMPParallelDirective(OMPParallelDirective * D)21977330f729Sjoerg void ASTStmtWriter::VisitOMPParallelDirective(OMPParallelDirective *D) {
21987330f729Sjoerg   VisitStmt(D);
21997330f729Sjoerg   VisitOMPExecutableDirective(D);
2200*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
22017330f729Sjoerg   Code = serialization::STMT_OMP_PARALLEL_DIRECTIVE;
22027330f729Sjoerg }
22037330f729Sjoerg 
VisitOMPSimdDirective(OMPSimdDirective * D)22047330f729Sjoerg void ASTStmtWriter::VisitOMPSimdDirective(OMPSimdDirective *D) {
22057330f729Sjoerg   VisitOMPLoopDirective(D);
22067330f729Sjoerg   Code = serialization::STMT_OMP_SIMD_DIRECTIVE;
22077330f729Sjoerg }
22087330f729Sjoerg 
VisitOMPTileDirective(OMPTileDirective * D)2209*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPTileDirective(OMPTileDirective *D) {
2210*e038c9c4Sjoerg   VisitOMPLoopBasedDirective(D);
2211*e038c9c4Sjoerg   Code = serialization::STMT_OMP_TILE_DIRECTIVE;
2212*e038c9c4Sjoerg }
2213*e038c9c4Sjoerg 
VisitOMPForDirective(OMPForDirective * D)22147330f729Sjoerg void ASTStmtWriter::VisitOMPForDirective(OMPForDirective *D) {
22157330f729Sjoerg   VisitOMPLoopDirective(D);
2216*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
22177330f729Sjoerg   Code = serialization::STMT_OMP_FOR_DIRECTIVE;
22187330f729Sjoerg }
22197330f729Sjoerg 
VisitOMPForSimdDirective(OMPForSimdDirective * D)22207330f729Sjoerg void ASTStmtWriter::VisitOMPForSimdDirective(OMPForSimdDirective *D) {
22217330f729Sjoerg   VisitOMPLoopDirective(D);
22227330f729Sjoerg   Code = serialization::STMT_OMP_FOR_SIMD_DIRECTIVE;
22237330f729Sjoerg }
22247330f729Sjoerg 
VisitOMPSectionsDirective(OMPSectionsDirective * D)22257330f729Sjoerg void ASTStmtWriter::VisitOMPSectionsDirective(OMPSectionsDirective *D) {
22267330f729Sjoerg   VisitStmt(D);
22277330f729Sjoerg   VisitOMPExecutableDirective(D);
2228*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
22297330f729Sjoerg   Code = serialization::STMT_OMP_SECTIONS_DIRECTIVE;
22307330f729Sjoerg }
22317330f729Sjoerg 
VisitOMPSectionDirective(OMPSectionDirective * D)22327330f729Sjoerg void ASTStmtWriter::VisitOMPSectionDirective(OMPSectionDirective *D) {
22337330f729Sjoerg   VisitStmt(D);
22347330f729Sjoerg   VisitOMPExecutableDirective(D);
2235*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
22367330f729Sjoerg   Code = serialization::STMT_OMP_SECTION_DIRECTIVE;
22377330f729Sjoerg }
22387330f729Sjoerg 
VisitOMPSingleDirective(OMPSingleDirective * D)22397330f729Sjoerg void ASTStmtWriter::VisitOMPSingleDirective(OMPSingleDirective *D) {
22407330f729Sjoerg   VisitStmt(D);
22417330f729Sjoerg   VisitOMPExecutableDirective(D);
22427330f729Sjoerg   Code = serialization::STMT_OMP_SINGLE_DIRECTIVE;
22437330f729Sjoerg }
22447330f729Sjoerg 
VisitOMPMasterDirective(OMPMasterDirective * D)22457330f729Sjoerg void ASTStmtWriter::VisitOMPMasterDirective(OMPMasterDirective *D) {
22467330f729Sjoerg   VisitStmt(D);
22477330f729Sjoerg   VisitOMPExecutableDirective(D);
22487330f729Sjoerg   Code = serialization::STMT_OMP_MASTER_DIRECTIVE;
22497330f729Sjoerg }
22507330f729Sjoerg 
VisitOMPCriticalDirective(OMPCriticalDirective * D)22517330f729Sjoerg void ASTStmtWriter::VisitOMPCriticalDirective(OMPCriticalDirective *D) {
22527330f729Sjoerg   VisitStmt(D);
22537330f729Sjoerg   VisitOMPExecutableDirective(D);
22547330f729Sjoerg   Record.AddDeclarationNameInfo(D->getDirectiveName());
22557330f729Sjoerg   Code = serialization::STMT_OMP_CRITICAL_DIRECTIVE;
22567330f729Sjoerg }
22577330f729Sjoerg 
VisitOMPParallelForDirective(OMPParallelForDirective * D)22587330f729Sjoerg void ASTStmtWriter::VisitOMPParallelForDirective(OMPParallelForDirective *D) {
22597330f729Sjoerg   VisitOMPLoopDirective(D);
2260*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
22617330f729Sjoerg   Code = serialization::STMT_OMP_PARALLEL_FOR_DIRECTIVE;
22627330f729Sjoerg }
22637330f729Sjoerg 
VisitOMPParallelForSimdDirective(OMPParallelForSimdDirective * D)22647330f729Sjoerg void ASTStmtWriter::VisitOMPParallelForSimdDirective(
22657330f729Sjoerg     OMPParallelForSimdDirective *D) {
22667330f729Sjoerg   VisitOMPLoopDirective(D);
22677330f729Sjoerg   Code = serialization::STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE;
22687330f729Sjoerg }
22697330f729Sjoerg 
VisitOMPParallelMasterDirective(OMPParallelMasterDirective * D)2270*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPParallelMasterDirective(
2271*e038c9c4Sjoerg     OMPParallelMasterDirective *D) {
2272*e038c9c4Sjoerg   VisitStmt(D);
2273*e038c9c4Sjoerg   VisitOMPExecutableDirective(D);
2274*e038c9c4Sjoerg   Code = serialization::STMT_OMP_PARALLEL_MASTER_DIRECTIVE;
2275*e038c9c4Sjoerg }
2276*e038c9c4Sjoerg 
VisitOMPParallelSectionsDirective(OMPParallelSectionsDirective * D)22777330f729Sjoerg void ASTStmtWriter::VisitOMPParallelSectionsDirective(
22787330f729Sjoerg     OMPParallelSectionsDirective *D) {
22797330f729Sjoerg   VisitStmt(D);
22807330f729Sjoerg   VisitOMPExecutableDirective(D);
2281*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
22827330f729Sjoerg   Code = serialization::STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE;
22837330f729Sjoerg }
22847330f729Sjoerg 
VisitOMPTaskDirective(OMPTaskDirective * D)22857330f729Sjoerg void ASTStmtWriter::VisitOMPTaskDirective(OMPTaskDirective *D) {
22867330f729Sjoerg   VisitStmt(D);
22877330f729Sjoerg   VisitOMPExecutableDirective(D);
2288*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
22897330f729Sjoerg   Code = serialization::STMT_OMP_TASK_DIRECTIVE;
22907330f729Sjoerg }
22917330f729Sjoerg 
VisitOMPAtomicDirective(OMPAtomicDirective * D)22927330f729Sjoerg void ASTStmtWriter::VisitOMPAtomicDirective(OMPAtomicDirective *D) {
22937330f729Sjoerg   VisitStmt(D);
22947330f729Sjoerg   VisitOMPExecutableDirective(D);
2295*e038c9c4Sjoerg   Record.writeBool(D->isXLHSInRHSPart());
2296*e038c9c4Sjoerg   Record.writeBool(D->isPostfixUpdate());
22977330f729Sjoerg   Code = serialization::STMT_OMP_ATOMIC_DIRECTIVE;
22987330f729Sjoerg }
22997330f729Sjoerg 
VisitOMPTargetDirective(OMPTargetDirective * D)23007330f729Sjoerg void ASTStmtWriter::VisitOMPTargetDirective(OMPTargetDirective *D) {
23017330f729Sjoerg   VisitStmt(D);
23027330f729Sjoerg   VisitOMPExecutableDirective(D);
23037330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_DIRECTIVE;
23047330f729Sjoerg }
23057330f729Sjoerg 
VisitOMPTargetDataDirective(OMPTargetDataDirective * D)23067330f729Sjoerg void ASTStmtWriter::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) {
23077330f729Sjoerg   VisitStmt(D);
23087330f729Sjoerg   VisitOMPExecutableDirective(D);
23097330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_DATA_DIRECTIVE;
23107330f729Sjoerg }
23117330f729Sjoerg 
VisitOMPTargetEnterDataDirective(OMPTargetEnterDataDirective * D)23127330f729Sjoerg void ASTStmtWriter::VisitOMPTargetEnterDataDirective(
23137330f729Sjoerg     OMPTargetEnterDataDirective *D) {
23147330f729Sjoerg   VisitStmt(D);
23157330f729Sjoerg   VisitOMPExecutableDirective(D);
23167330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_ENTER_DATA_DIRECTIVE;
23177330f729Sjoerg }
23187330f729Sjoerg 
VisitOMPTargetExitDataDirective(OMPTargetExitDataDirective * D)23197330f729Sjoerg void ASTStmtWriter::VisitOMPTargetExitDataDirective(
23207330f729Sjoerg     OMPTargetExitDataDirective *D) {
23217330f729Sjoerg   VisitStmt(D);
23227330f729Sjoerg   VisitOMPExecutableDirective(D);
23237330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_EXIT_DATA_DIRECTIVE;
23247330f729Sjoerg }
23257330f729Sjoerg 
VisitOMPTargetParallelDirective(OMPTargetParallelDirective * D)23267330f729Sjoerg void ASTStmtWriter::VisitOMPTargetParallelDirective(
23277330f729Sjoerg     OMPTargetParallelDirective *D) {
23287330f729Sjoerg   VisitStmt(D);
23297330f729Sjoerg   VisitOMPExecutableDirective(D);
2330*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
23317330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_PARALLEL_DIRECTIVE;
23327330f729Sjoerg }
23337330f729Sjoerg 
VisitOMPTargetParallelForDirective(OMPTargetParallelForDirective * D)23347330f729Sjoerg void ASTStmtWriter::VisitOMPTargetParallelForDirective(
23357330f729Sjoerg     OMPTargetParallelForDirective *D) {
23367330f729Sjoerg   VisitOMPLoopDirective(D);
2337*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
23387330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_PARALLEL_FOR_DIRECTIVE;
23397330f729Sjoerg }
23407330f729Sjoerg 
VisitOMPTaskyieldDirective(OMPTaskyieldDirective * D)23417330f729Sjoerg void ASTStmtWriter::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) {
23427330f729Sjoerg   VisitStmt(D);
23437330f729Sjoerg   VisitOMPExecutableDirective(D);
23447330f729Sjoerg   Code = serialization::STMT_OMP_TASKYIELD_DIRECTIVE;
23457330f729Sjoerg }
23467330f729Sjoerg 
VisitOMPBarrierDirective(OMPBarrierDirective * D)23477330f729Sjoerg void ASTStmtWriter::VisitOMPBarrierDirective(OMPBarrierDirective *D) {
23487330f729Sjoerg   VisitStmt(D);
23497330f729Sjoerg   VisitOMPExecutableDirective(D);
23507330f729Sjoerg   Code = serialization::STMT_OMP_BARRIER_DIRECTIVE;
23517330f729Sjoerg }
23527330f729Sjoerg 
VisitOMPTaskwaitDirective(OMPTaskwaitDirective * D)23537330f729Sjoerg void ASTStmtWriter::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
23547330f729Sjoerg   VisitStmt(D);
23557330f729Sjoerg   VisitOMPExecutableDirective(D);
23567330f729Sjoerg   Code = serialization::STMT_OMP_TASKWAIT_DIRECTIVE;
23577330f729Sjoerg }
23587330f729Sjoerg 
VisitOMPTaskgroupDirective(OMPTaskgroupDirective * D)23597330f729Sjoerg void ASTStmtWriter::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) {
23607330f729Sjoerg   VisitStmt(D);
23617330f729Sjoerg   VisitOMPExecutableDirective(D);
23627330f729Sjoerg   Code = serialization::STMT_OMP_TASKGROUP_DIRECTIVE;
23637330f729Sjoerg }
23647330f729Sjoerg 
VisitOMPFlushDirective(OMPFlushDirective * D)23657330f729Sjoerg void ASTStmtWriter::VisitOMPFlushDirective(OMPFlushDirective *D) {
23667330f729Sjoerg   VisitStmt(D);
23677330f729Sjoerg   VisitOMPExecutableDirective(D);
23687330f729Sjoerg   Code = serialization::STMT_OMP_FLUSH_DIRECTIVE;
23697330f729Sjoerg }
23707330f729Sjoerg 
VisitOMPDepobjDirective(OMPDepobjDirective * D)2371*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPDepobjDirective(OMPDepobjDirective *D) {
2372*e038c9c4Sjoerg   VisitStmt(D);
2373*e038c9c4Sjoerg   VisitOMPExecutableDirective(D);
2374*e038c9c4Sjoerg   Code = serialization::STMT_OMP_DEPOBJ_DIRECTIVE;
2375*e038c9c4Sjoerg }
2376*e038c9c4Sjoerg 
VisitOMPScanDirective(OMPScanDirective * D)2377*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPScanDirective(OMPScanDirective *D) {
2378*e038c9c4Sjoerg   VisitStmt(D);
2379*e038c9c4Sjoerg   VisitOMPExecutableDirective(D);
2380*e038c9c4Sjoerg   Code = serialization::STMT_OMP_SCAN_DIRECTIVE;
2381*e038c9c4Sjoerg }
2382*e038c9c4Sjoerg 
VisitOMPOrderedDirective(OMPOrderedDirective * D)23837330f729Sjoerg void ASTStmtWriter::VisitOMPOrderedDirective(OMPOrderedDirective *D) {
23847330f729Sjoerg   VisitStmt(D);
23857330f729Sjoerg   VisitOMPExecutableDirective(D);
23867330f729Sjoerg   Code = serialization::STMT_OMP_ORDERED_DIRECTIVE;
23877330f729Sjoerg }
23887330f729Sjoerg 
VisitOMPTeamsDirective(OMPTeamsDirective * D)23897330f729Sjoerg void ASTStmtWriter::VisitOMPTeamsDirective(OMPTeamsDirective *D) {
23907330f729Sjoerg   VisitStmt(D);
23917330f729Sjoerg   VisitOMPExecutableDirective(D);
23927330f729Sjoerg   Code = serialization::STMT_OMP_TEAMS_DIRECTIVE;
23937330f729Sjoerg }
23947330f729Sjoerg 
VisitOMPCancellationPointDirective(OMPCancellationPointDirective * D)23957330f729Sjoerg void ASTStmtWriter::VisitOMPCancellationPointDirective(
23967330f729Sjoerg     OMPCancellationPointDirective *D) {
23977330f729Sjoerg   VisitStmt(D);
23987330f729Sjoerg   VisitOMPExecutableDirective(D);
2399*e038c9c4Sjoerg   Record.writeEnum(D->getCancelRegion());
24007330f729Sjoerg   Code = serialization::STMT_OMP_CANCELLATION_POINT_DIRECTIVE;
24017330f729Sjoerg }
24027330f729Sjoerg 
VisitOMPCancelDirective(OMPCancelDirective * D)24037330f729Sjoerg void ASTStmtWriter::VisitOMPCancelDirective(OMPCancelDirective *D) {
24047330f729Sjoerg   VisitStmt(D);
24057330f729Sjoerg   VisitOMPExecutableDirective(D);
2406*e038c9c4Sjoerg   Record.writeEnum(D->getCancelRegion());
24077330f729Sjoerg   Code = serialization::STMT_OMP_CANCEL_DIRECTIVE;
24087330f729Sjoerg }
24097330f729Sjoerg 
VisitOMPTaskLoopDirective(OMPTaskLoopDirective * D)24107330f729Sjoerg void ASTStmtWriter::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
24117330f729Sjoerg   VisitOMPLoopDirective(D);
2412*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
24137330f729Sjoerg   Code = serialization::STMT_OMP_TASKLOOP_DIRECTIVE;
24147330f729Sjoerg }
24157330f729Sjoerg 
VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective * D)24167330f729Sjoerg void ASTStmtWriter::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) {
24177330f729Sjoerg   VisitOMPLoopDirective(D);
24187330f729Sjoerg   Code = serialization::STMT_OMP_TASKLOOP_SIMD_DIRECTIVE;
24197330f729Sjoerg }
24207330f729Sjoerg 
VisitOMPMasterTaskLoopDirective(OMPMasterTaskLoopDirective * D)24217330f729Sjoerg void ASTStmtWriter::VisitOMPMasterTaskLoopDirective(
24227330f729Sjoerg     OMPMasterTaskLoopDirective *D) {
24237330f729Sjoerg   VisitOMPLoopDirective(D);
2424*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
24257330f729Sjoerg   Code = serialization::STMT_OMP_MASTER_TASKLOOP_DIRECTIVE;
24267330f729Sjoerg }
24277330f729Sjoerg 
VisitOMPMasterTaskLoopSimdDirective(OMPMasterTaskLoopSimdDirective * D)24287330f729Sjoerg void ASTStmtWriter::VisitOMPMasterTaskLoopSimdDirective(
24297330f729Sjoerg     OMPMasterTaskLoopSimdDirective *D) {
24307330f729Sjoerg   VisitOMPLoopDirective(D);
24317330f729Sjoerg   Code = serialization::STMT_OMP_MASTER_TASKLOOP_SIMD_DIRECTIVE;
24327330f729Sjoerg }
24337330f729Sjoerg 
VisitOMPParallelMasterTaskLoopDirective(OMPParallelMasterTaskLoopDirective * D)24347330f729Sjoerg void ASTStmtWriter::VisitOMPParallelMasterTaskLoopDirective(
24357330f729Sjoerg     OMPParallelMasterTaskLoopDirective *D) {
24367330f729Sjoerg   VisitOMPLoopDirective(D);
2437*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
24387330f729Sjoerg   Code = serialization::STMT_OMP_PARALLEL_MASTER_TASKLOOP_DIRECTIVE;
24397330f729Sjoerg }
24407330f729Sjoerg 
VisitOMPParallelMasterTaskLoopSimdDirective(OMPParallelMasterTaskLoopSimdDirective * D)2441*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPParallelMasterTaskLoopSimdDirective(
2442*e038c9c4Sjoerg     OMPParallelMasterTaskLoopSimdDirective *D) {
2443*e038c9c4Sjoerg   VisitOMPLoopDirective(D);
2444*e038c9c4Sjoerg   Code = serialization::STMT_OMP_PARALLEL_MASTER_TASKLOOP_SIMD_DIRECTIVE;
2445*e038c9c4Sjoerg }
2446*e038c9c4Sjoerg 
VisitOMPDistributeDirective(OMPDistributeDirective * D)24477330f729Sjoerg void ASTStmtWriter::VisitOMPDistributeDirective(OMPDistributeDirective *D) {
24487330f729Sjoerg   VisitOMPLoopDirective(D);
24497330f729Sjoerg   Code = serialization::STMT_OMP_DISTRIBUTE_DIRECTIVE;
24507330f729Sjoerg }
24517330f729Sjoerg 
VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective * D)24527330f729Sjoerg void ASTStmtWriter::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) {
24537330f729Sjoerg   VisitStmt(D);
24547330f729Sjoerg   VisitOMPExecutableDirective(D);
24557330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_UPDATE_DIRECTIVE;
24567330f729Sjoerg }
24577330f729Sjoerg 
VisitOMPDistributeParallelForDirective(OMPDistributeParallelForDirective * D)24587330f729Sjoerg void ASTStmtWriter::VisitOMPDistributeParallelForDirective(
24597330f729Sjoerg     OMPDistributeParallelForDirective *D) {
24607330f729Sjoerg   VisitOMPLoopDirective(D);
2461*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
24627330f729Sjoerg   Code = serialization::STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE;
24637330f729Sjoerg }
24647330f729Sjoerg 
VisitOMPDistributeParallelForSimdDirective(OMPDistributeParallelForSimdDirective * D)24657330f729Sjoerg void ASTStmtWriter::VisitOMPDistributeParallelForSimdDirective(
24667330f729Sjoerg     OMPDistributeParallelForSimdDirective *D) {
24677330f729Sjoerg   VisitOMPLoopDirective(D);
24687330f729Sjoerg   Code = serialization::STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE;
24697330f729Sjoerg }
24707330f729Sjoerg 
VisitOMPDistributeSimdDirective(OMPDistributeSimdDirective * D)24717330f729Sjoerg void ASTStmtWriter::VisitOMPDistributeSimdDirective(
24727330f729Sjoerg     OMPDistributeSimdDirective *D) {
24737330f729Sjoerg   VisitOMPLoopDirective(D);
24747330f729Sjoerg   Code = serialization::STMT_OMP_DISTRIBUTE_SIMD_DIRECTIVE;
24757330f729Sjoerg }
24767330f729Sjoerg 
VisitOMPTargetParallelForSimdDirective(OMPTargetParallelForSimdDirective * D)24777330f729Sjoerg void ASTStmtWriter::VisitOMPTargetParallelForSimdDirective(
24787330f729Sjoerg     OMPTargetParallelForSimdDirective *D) {
24797330f729Sjoerg   VisitOMPLoopDirective(D);
24807330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE;
24817330f729Sjoerg }
24827330f729Sjoerg 
VisitOMPTargetSimdDirective(OMPTargetSimdDirective * D)24837330f729Sjoerg void ASTStmtWriter::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *D) {
24847330f729Sjoerg   VisitOMPLoopDirective(D);
24857330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_SIMD_DIRECTIVE;
24867330f729Sjoerg }
24877330f729Sjoerg 
VisitOMPTeamsDistributeDirective(OMPTeamsDistributeDirective * D)24887330f729Sjoerg void ASTStmtWriter::VisitOMPTeamsDistributeDirective(
24897330f729Sjoerg     OMPTeamsDistributeDirective *D) {
24907330f729Sjoerg   VisitOMPLoopDirective(D);
24917330f729Sjoerg   Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_DIRECTIVE;
24927330f729Sjoerg }
24937330f729Sjoerg 
VisitOMPTeamsDistributeSimdDirective(OMPTeamsDistributeSimdDirective * D)24947330f729Sjoerg void ASTStmtWriter::VisitOMPTeamsDistributeSimdDirective(
24957330f729Sjoerg     OMPTeamsDistributeSimdDirective *D) {
24967330f729Sjoerg   VisitOMPLoopDirective(D);
24977330f729Sjoerg   Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE;
24987330f729Sjoerg }
24997330f729Sjoerg 
VisitOMPTeamsDistributeParallelForSimdDirective(OMPTeamsDistributeParallelForSimdDirective * D)25007330f729Sjoerg void ASTStmtWriter::VisitOMPTeamsDistributeParallelForSimdDirective(
25017330f729Sjoerg     OMPTeamsDistributeParallelForSimdDirective *D) {
25027330f729Sjoerg   VisitOMPLoopDirective(D);
25037330f729Sjoerg   Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE;
25047330f729Sjoerg }
25057330f729Sjoerg 
VisitOMPTeamsDistributeParallelForDirective(OMPTeamsDistributeParallelForDirective * D)25067330f729Sjoerg void ASTStmtWriter::VisitOMPTeamsDistributeParallelForDirective(
25077330f729Sjoerg     OMPTeamsDistributeParallelForDirective *D) {
25087330f729Sjoerg   VisitOMPLoopDirective(D);
2509*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
25107330f729Sjoerg   Code = serialization::STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE;
25117330f729Sjoerg }
25127330f729Sjoerg 
VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective * D)25137330f729Sjoerg void ASTStmtWriter::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *D) {
25147330f729Sjoerg   VisitStmt(D);
25157330f729Sjoerg   VisitOMPExecutableDirective(D);
25167330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_TEAMS_DIRECTIVE;
25177330f729Sjoerg }
25187330f729Sjoerg 
VisitOMPTargetTeamsDistributeDirective(OMPTargetTeamsDistributeDirective * D)25197330f729Sjoerg void ASTStmtWriter::VisitOMPTargetTeamsDistributeDirective(
25207330f729Sjoerg     OMPTargetTeamsDistributeDirective *D) {
25217330f729Sjoerg   VisitOMPLoopDirective(D);
25227330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_TEAMS_DISTRIBUTE_DIRECTIVE;
25237330f729Sjoerg }
25247330f729Sjoerg 
VisitOMPTargetTeamsDistributeParallelForDirective(OMPTargetTeamsDistributeParallelForDirective * D)25257330f729Sjoerg void ASTStmtWriter::VisitOMPTargetTeamsDistributeParallelForDirective(
25267330f729Sjoerg     OMPTargetTeamsDistributeParallelForDirective *D) {
25277330f729Sjoerg   VisitOMPLoopDirective(D);
2528*e038c9c4Sjoerg   Record.writeBool(D->hasCancel());
25297330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE;
25307330f729Sjoerg }
25317330f729Sjoerg 
VisitOMPTargetTeamsDistributeParallelForSimdDirective(OMPTargetTeamsDistributeParallelForSimdDirective * D)25327330f729Sjoerg void ASTStmtWriter::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
25337330f729Sjoerg     OMPTargetTeamsDistributeParallelForSimdDirective *D) {
25347330f729Sjoerg   VisitOMPLoopDirective(D);
25357330f729Sjoerg   Code = serialization::
25367330f729Sjoerg       STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE;
25377330f729Sjoerg }
25387330f729Sjoerg 
VisitOMPTargetTeamsDistributeSimdDirective(OMPTargetTeamsDistributeSimdDirective * D)25397330f729Sjoerg void ASTStmtWriter::VisitOMPTargetTeamsDistributeSimdDirective(
25407330f729Sjoerg     OMPTargetTeamsDistributeSimdDirective *D) {
25417330f729Sjoerg   VisitOMPLoopDirective(D);
25427330f729Sjoerg   Code = serialization::STMT_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE;
25437330f729Sjoerg }
25447330f729Sjoerg 
VisitOMPInteropDirective(OMPInteropDirective * D)2545*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPInteropDirective(OMPInteropDirective *D) {
2546*e038c9c4Sjoerg   VisitStmt(D);
2547*e038c9c4Sjoerg   VisitOMPExecutableDirective(D);
2548*e038c9c4Sjoerg   Code = serialization::STMT_OMP_INTEROP_DIRECTIVE;
2549*e038c9c4Sjoerg }
2550*e038c9c4Sjoerg 
VisitOMPDispatchDirective(OMPDispatchDirective * D)2551*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPDispatchDirective(OMPDispatchDirective *D) {
2552*e038c9c4Sjoerg   VisitStmt(D);
2553*e038c9c4Sjoerg   VisitOMPExecutableDirective(D);
2554*e038c9c4Sjoerg   Record.AddSourceLocation(D->getTargetCallLoc());
2555*e038c9c4Sjoerg   Code = serialization::STMT_OMP_DISPATCH_DIRECTIVE;
2556*e038c9c4Sjoerg }
2557*e038c9c4Sjoerg 
VisitOMPMaskedDirective(OMPMaskedDirective * D)2558*e038c9c4Sjoerg void ASTStmtWriter::VisitOMPMaskedDirective(OMPMaskedDirective *D) {
2559*e038c9c4Sjoerg   VisitStmt(D);
2560*e038c9c4Sjoerg   VisitOMPExecutableDirective(D);
2561*e038c9c4Sjoerg   Code = serialization::STMT_OMP_MASKED_DIRECTIVE;
2562*e038c9c4Sjoerg }
2563*e038c9c4Sjoerg 
25647330f729Sjoerg //===----------------------------------------------------------------------===//
25657330f729Sjoerg // ASTWriter Implementation
25667330f729Sjoerg //===----------------------------------------------------------------------===//
25677330f729Sjoerg 
RecordSwitchCaseID(SwitchCase * S)25687330f729Sjoerg unsigned ASTWriter::RecordSwitchCaseID(SwitchCase *S) {
25697330f729Sjoerg   assert(SwitchCaseIDs.find(S) == SwitchCaseIDs.end() &&
25707330f729Sjoerg          "SwitchCase recorded twice");
25717330f729Sjoerg   unsigned NextID = SwitchCaseIDs.size();
25727330f729Sjoerg   SwitchCaseIDs[S] = NextID;
25737330f729Sjoerg   return NextID;
25747330f729Sjoerg }
25757330f729Sjoerg 
getSwitchCaseID(SwitchCase * S)25767330f729Sjoerg unsigned ASTWriter::getSwitchCaseID(SwitchCase *S) {
25777330f729Sjoerg   assert(SwitchCaseIDs.find(S) != SwitchCaseIDs.end() &&
25787330f729Sjoerg          "SwitchCase hasn't been seen yet");
25797330f729Sjoerg   return SwitchCaseIDs[S];
25807330f729Sjoerg }
25817330f729Sjoerg 
ClearSwitchCaseIDs()25827330f729Sjoerg void ASTWriter::ClearSwitchCaseIDs() {
25837330f729Sjoerg   SwitchCaseIDs.clear();
25847330f729Sjoerg }
25857330f729Sjoerg 
25867330f729Sjoerg /// Write the given substatement or subexpression to the
25877330f729Sjoerg /// bitstream.
WriteSubStmt(Stmt * S)25887330f729Sjoerg void ASTWriter::WriteSubStmt(Stmt *S) {
25897330f729Sjoerg   RecordData Record;
25907330f729Sjoerg   ASTStmtWriter Writer(*this, Record);
25917330f729Sjoerg   ++NumStatements;
25927330f729Sjoerg 
25937330f729Sjoerg   if (!S) {
25947330f729Sjoerg     Stream.EmitRecord(serialization::STMT_NULL_PTR, Record);
25957330f729Sjoerg     return;
25967330f729Sjoerg   }
25977330f729Sjoerg 
25987330f729Sjoerg   llvm::DenseMap<Stmt *, uint64_t>::iterator I = SubStmtEntries.find(S);
25997330f729Sjoerg   if (I != SubStmtEntries.end()) {
26007330f729Sjoerg     Record.push_back(I->second);
26017330f729Sjoerg     Stream.EmitRecord(serialization::STMT_REF_PTR, Record);
26027330f729Sjoerg     return;
26037330f729Sjoerg   }
26047330f729Sjoerg 
26057330f729Sjoerg #ifndef NDEBUG
26067330f729Sjoerg   assert(!ParentStmts.count(S) && "There is a Stmt cycle!");
26077330f729Sjoerg 
26087330f729Sjoerg   struct ParentStmtInserterRAII {
26097330f729Sjoerg     Stmt *S;
26107330f729Sjoerg     llvm::DenseSet<Stmt *> &ParentStmts;
26117330f729Sjoerg 
26127330f729Sjoerg     ParentStmtInserterRAII(Stmt *S, llvm::DenseSet<Stmt *> &ParentStmts)
26137330f729Sjoerg       : S(S), ParentStmts(ParentStmts) {
26147330f729Sjoerg       ParentStmts.insert(S);
26157330f729Sjoerg     }
26167330f729Sjoerg     ~ParentStmtInserterRAII() {
26177330f729Sjoerg       ParentStmts.erase(S);
26187330f729Sjoerg     }
26197330f729Sjoerg   };
26207330f729Sjoerg 
26217330f729Sjoerg   ParentStmtInserterRAII ParentStmtInserter(S, ParentStmts);
26227330f729Sjoerg #endif
26237330f729Sjoerg 
26247330f729Sjoerg   Writer.Visit(S);
26257330f729Sjoerg 
26267330f729Sjoerg   uint64_t Offset = Writer.Emit();
26277330f729Sjoerg   SubStmtEntries[S] = Offset;
26287330f729Sjoerg }
26297330f729Sjoerg 
26307330f729Sjoerg /// Flush all of the statements that have been added to the
26317330f729Sjoerg /// queue via AddStmt().
FlushStmts()26327330f729Sjoerg void ASTRecordWriter::FlushStmts() {
26337330f729Sjoerg   // We expect to be the only consumer of the two temporary statement maps,
26347330f729Sjoerg   // assert that they are empty.
26357330f729Sjoerg   assert(Writer->SubStmtEntries.empty() && "unexpected entries in sub-stmt map");
26367330f729Sjoerg   assert(Writer->ParentStmts.empty() && "unexpected entries in parent stmt map");
26377330f729Sjoerg 
26387330f729Sjoerg   for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
26397330f729Sjoerg     Writer->WriteSubStmt(StmtsToEmit[I]);
26407330f729Sjoerg 
26417330f729Sjoerg     assert(N == StmtsToEmit.size() && "record modified while being written!");
26427330f729Sjoerg 
26437330f729Sjoerg     // Note that we are at the end of a full expression. Any
26447330f729Sjoerg     // expression records that follow this one are part of a different
26457330f729Sjoerg     // expression.
26467330f729Sjoerg     Writer->Stream.EmitRecord(serialization::STMT_STOP, ArrayRef<uint32_t>());
26477330f729Sjoerg 
26487330f729Sjoerg     Writer->SubStmtEntries.clear();
26497330f729Sjoerg     Writer->ParentStmts.clear();
26507330f729Sjoerg   }
26517330f729Sjoerg 
26527330f729Sjoerg   StmtsToEmit.clear();
26537330f729Sjoerg }
26547330f729Sjoerg 
FlushSubStmts()26557330f729Sjoerg void ASTRecordWriter::FlushSubStmts() {
26567330f729Sjoerg   // For a nested statement, write out the substatements in reverse order (so
26577330f729Sjoerg   // that a simple stack machine can be used when loading), and don't emit a
26587330f729Sjoerg   // STMT_STOP after each one.
26597330f729Sjoerg   for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
26607330f729Sjoerg     Writer->WriteSubStmt(StmtsToEmit[N - I - 1]);
26617330f729Sjoerg     assert(N == StmtsToEmit.size() && "record modified while being written!");
26627330f729Sjoerg   }
26637330f729Sjoerg 
26647330f729Sjoerg   StmtsToEmit.clear();
26657330f729Sjoerg }
2666