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