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