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