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