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