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