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 (/* 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 (/* 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 (/* 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   D->setHasCancel(Record.readInt());
2431 }
2432 
2433 void ASTStmtReader::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) {
2434   VisitOMPLoopDirective(D);
2435 }
2436 
2437 void ASTStmtReader::VisitOMPMasterTaskLoopDirective(
2438     OMPMasterTaskLoopDirective *D) {
2439   VisitOMPLoopDirective(D);
2440   D->setHasCancel(Record.readInt());
2441 }
2442 
2443 void ASTStmtReader::VisitOMPMasterTaskLoopSimdDirective(
2444     OMPMasterTaskLoopSimdDirective *D) {
2445   VisitOMPLoopDirective(D);
2446 }
2447 
2448 void ASTStmtReader::VisitOMPParallelMasterTaskLoopDirective(
2449     OMPParallelMasterTaskLoopDirective *D) {
2450   VisitOMPLoopDirective(D);
2451   D->setHasCancel(Record.readInt());
2452 }
2453 
2454 void ASTStmtReader::VisitOMPParallelMasterTaskLoopSimdDirective(
2455     OMPParallelMasterTaskLoopSimdDirective *D) {
2456   VisitOMPLoopDirective(D);
2457 }
2458 
2459 void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective *D) {
2460   VisitOMPLoopDirective(D);
2461 }
2462 
2463 void ASTStmtReader::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) {
2464   VisitStmt(D);
2465   Record.skipInts(1);
2466   VisitOMPExecutableDirective(D);
2467 }
2468 
2469 void ASTStmtReader::VisitOMPDistributeParallelForDirective(
2470     OMPDistributeParallelForDirective *D) {
2471   VisitOMPLoopDirective(D);
2472   D->setHasCancel(Record.readInt());
2473 }
2474 
2475 void ASTStmtReader::VisitOMPDistributeParallelForSimdDirective(
2476     OMPDistributeParallelForSimdDirective *D) {
2477   VisitOMPLoopDirective(D);
2478 }
2479 
2480 void ASTStmtReader::VisitOMPDistributeSimdDirective(
2481     OMPDistributeSimdDirective *D) {
2482   VisitOMPLoopDirective(D);
2483 }
2484 
2485 void ASTStmtReader::VisitOMPTargetParallelForSimdDirective(
2486     OMPTargetParallelForSimdDirective *D) {
2487   VisitOMPLoopDirective(D);
2488 }
2489 
2490 void ASTStmtReader::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *D) {
2491   VisitOMPLoopDirective(D);
2492 }
2493 
2494 void ASTStmtReader::VisitOMPTeamsDistributeDirective(
2495     OMPTeamsDistributeDirective *D) {
2496   VisitOMPLoopDirective(D);
2497 }
2498 
2499 void ASTStmtReader::VisitOMPTeamsDistributeSimdDirective(
2500     OMPTeamsDistributeSimdDirective *D) {
2501   VisitOMPLoopDirective(D);
2502 }
2503 
2504 void ASTStmtReader::VisitOMPTeamsDistributeParallelForSimdDirective(
2505     OMPTeamsDistributeParallelForSimdDirective *D) {
2506   VisitOMPLoopDirective(D);
2507 }
2508 
2509 void ASTStmtReader::VisitOMPTeamsDistributeParallelForDirective(
2510     OMPTeamsDistributeParallelForDirective *D) {
2511   VisitOMPLoopDirective(D);
2512   D->setHasCancel(Record.readInt());
2513 }
2514 
2515 void ASTStmtReader::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *D) {
2516   VisitStmt(D);
2517   // The NumClauses field was read in ReadStmtFromStream.
2518   Record.skipInts(1);
2519   VisitOMPExecutableDirective(D);
2520 }
2521 
2522 void ASTStmtReader::VisitOMPTargetTeamsDistributeDirective(
2523     OMPTargetTeamsDistributeDirective *D) {
2524   VisitOMPLoopDirective(D);
2525 }
2526 
2527 void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForDirective(
2528     OMPTargetTeamsDistributeParallelForDirective *D) {
2529   VisitOMPLoopDirective(D);
2530   D->setHasCancel(Record.readInt());
2531 }
2532 
2533 void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
2534     OMPTargetTeamsDistributeParallelForSimdDirective *D) {
2535   VisitOMPLoopDirective(D);
2536 }
2537 
2538 void ASTStmtReader::VisitOMPTargetTeamsDistributeSimdDirective(
2539     OMPTargetTeamsDistributeSimdDirective *D) {
2540   VisitOMPLoopDirective(D);
2541 }
2542 
2543 //===----------------------------------------------------------------------===//
2544 // ASTReader Implementation
2545 //===----------------------------------------------------------------------===//
2546 
2547 Stmt *ASTReader::ReadStmt(ModuleFile &F) {
2548   switch (ReadingKind) {
2549   case Read_None:
2550     llvm_unreachable("should not call this when not reading anything");
2551   case Read_Decl:
2552   case Read_Type:
2553     return ReadStmtFromStream(F);
2554   case Read_Stmt:
2555     return ReadSubStmt();
2556   }
2557 
2558   llvm_unreachable("ReadingKind not set ?");
2559 }
2560 
2561 Expr *ASTReader::ReadExpr(ModuleFile &F) {
2562   return cast_or_null<Expr>(ReadStmt(F));
2563 }
2564 
2565 Expr *ASTReader::ReadSubExpr() {
2566   return cast_or_null<Expr>(ReadSubStmt());
2567 }
2568 
2569 // Within the bitstream, expressions are stored in Reverse Polish
2570 // Notation, with each of the subexpressions preceding the
2571 // expression they are stored in. Subexpressions are stored from last to first.
2572 // To evaluate expressions, we continue reading expressions and placing them on
2573 // the stack, with expressions having operands removing those operands from the
2574 // stack. Evaluation terminates when we see a STMT_STOP record, and
2575 // the single remaining expression on the stack is our result.
2576 Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
2577   ReadingKindTracker ReadingKind(Read_Stmt, *this);
2578   llvm::BitstreamCursor &Cursor = F.DeclsCursor;
2579 
2580   // Map of offset to previously deserialized stmt. The offset points
2581   // just after the stmt record.
2582   llvm::DenseMap<uint64_t, Stmt *> StmtEntries;
2583 
2584 #ifndef NDEBUG
2585   unsigned PrevNumStmts = StmtStack.size();
2586 #endif
2587 
2588   ASTRecordReader Record(*this, F);
2589   ASTStmtReader Reader(Record, Cursor);
2590   Stmt::EmptyShell Empty;
2591 
2592   while (true) {
2593     llvm::Expected<llvm::BitstreamEntry> MaybeEntry =
2594         Cursor.advanceSkippingSubblocks();
2595     if (!MaybeEntry) {
2596       Error(toString(MaybeEntry.takeError()));
2597       return nullptr;
2598     }
2599     llvm::BitstreamEntry Entry = MaybeEntry.get();
2600 
2601     switch (Entry.Kind) {
2602     case llvm::BitstreamEntry::SubBlock: // Handled for us already.
2603     case llvm::BitstreamEntry::Error:
2604       Error("malformed block record in AST file");
2605       return nullptr;
2606     case llvm::BitstreamEntry::EndBlock:
2607       goto Done;
2608     case llvm::BitstreamEntry::Record:
2609       // The interesting case.
2610       break;
2611     }
2612 
2613     ASTContext &Context = getContext();
2614     Stmt *S = nullptr;
2615     bool Finished = false;
2616     bool IsStmtReference = false;
2617     Expected<unsigned> MaybeStmtCode = Record.readRecord(Cursor, Entry.ID);
2618     if (!MaybeStmtCode) {
2619       Error(toString(MaybeStmtCode.takeError()));
2620       return nullptr;
2621     }
2622     switch ((StmtCode)MaybeStmtCode.get()) {
2623     case STMT_STOP:
2624       Finished = true;
2625       break;
2626 
2627     case STMT_REF_PTR:
2628       IsStmtReference = true;
2629       assert(StmtEntries.find(Record[0]) != StmtEntries.end() &&
2630              "No stmt was recorded for this offset reference!");
2631       S = StmtEntries[Record.readInt()];
2632       break;
2633 
2634     case STMT_NULL_PTR:
2635       S = nullptr;
2636       break;
2637 
2638     case STMT_NULL:
2639       S = new (Context) NullStmt(Empty);
2640       break;
2641 
2642     case STMT_COMPOUND:
2643       S = CompoundStmt::CreateEmpty(
2644           Context, /*NumStmts=*/Record[ASTStmtReader::NumStmtFields]);
2645       break;
2646 
2647     case STMT_CASE:
2648       S = CaseStmt::CreateEmpty(
2649           Context,
2650           /*CaseStmtIsGNURange*/ Record[ASTStmtReader::NumStmtFields + 3]);
2651       break;
2652 
2653     case STMT_DEFAULT:
2654       S = new (Context) DefaultStmt(Empty);
2655       break;
2656 
2657     case STMT_LABEL:
2658       S = new (Context) LabelStmt(Empty);
2659       break;
2660 
2661     case STMT_ATTRIBUTED:
2662       S = AttributedStmt::CreateEmpty(
2663         Context,
2664         /*NumAttrs*/Record[ASTStmtReader::NumStmtFields]);
2665       break;
2666 
2667     case STMT_IF:
2668       S = IfStmt::CreateEmpty(
2669           Context,
2670           /* HasElse=*/Record[ASTStmtReader::NumStmtFields + 1],
2671           /* HasVar=*/Record[ASTStmtReader::NumStmtFields + 2],
2672           /* HasInit=*/Record[ASTStmtReader::NumStmtFields + 3]);
2673       break;
2674 
2675     case STMT_SWITCH:
2676       S = SwitchStmt::CreateEmpty(
2677           Context,
2678           /* HasInit=*/Record[ASTStmtReader::NumStmtFields],
2679           /* HasVar=*/Record[ASTStmtReader::NumStmtFields + 1]);
2680       break;
2681 
2682     case STMT_WHILE:
2683       S = WhileStmt::CreateEmpty(
2684           Context,
2685           /* HasVar=*/Record[ASTStmtReader::NumStmtFields]);
2686       break;
2687 
2688     case STMT_DO:
2689       S = new (Context) DoStmt(Empty);
2690       break;
2691 
2692     case STMT_FOR:
2693       S = new (Context) ForStmt(Empty);
2694       break;
2695 
2696     case STMT_GOTO:
2697       S = new (Context) GotoStmt(Empty);
2698       break;
2699 
2700     case STMT_INDIRECT_GOTO:
2701       S = new (Context) IndirectGotoStmt(Empty);
2702       break;
2703 
2704     case STMT_CONTINUE:
2705       S = new (Context) ContinueStmt(Empty);
2706       break;
2707 
2708     case STMT_BREAK:
2709       S = new (Context) BreakStmt(Empty);
2710       break;
2711 
2712     case STMT_RETURN:
2713       S = ReturnStmt::CreateEmpty(
2714           Context, /* HasNRVOCandidate=*/Record[ASTStmtReader::NumStmtFields]);
2715       break;
2716 
2717     case STMT_DECL:
2718       S = new (Context) DeclStmt(Empty);
2719       break;
2720 
2721     case STMT_GCCASM:
2722       S = new (Context) GCCAsmStmt(Empty);
2723       break;
2724 
2725     case STMT_MSASM:
2726       S = new (Context) MSAsmStmt(Empty);
2727       break;
2728 
2729     case STMT_CAPTURED:
2730       S = CapturedStmt::CreateDeserialized(
2731           Context, Record[ASTStmtReader::NumStmtFields]);
2732       break;
2733 
2734     case EXPR_CONSTANT:
2735       S = ConstantExpr::CreateEmpty(
2736           Context,
2737           static_cast<ConstantExpr::ResultStorageKind>(
2738               Record[ASTStmtReader::NumExprFields]),
2739           Empty);
2740       break;
2741 
2742     case EXPR_PREDEFINED:
2743       S = PredefinedExpr::CreateEmpty(
2744           Context,
2745           /*HasFunctionName*/ Record[ASTStmtReader::NumExprFields]);
2746       break;
2747 
2748     case EXPR_DECL_REF:
2749       S = DeclRefExpr::CreateEmpty(
2750         Context,
2751         /*HasQualifier=*/Record[ASTStmtReader::NumExprFields],
2752         /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1],
2753         /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 2],
2754         /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ?
2755           Record[ASTStmtReader::NumExprFields + 6] : 0);
2756       break;
2757 
2758     case EXPR_INTEGER_LITERAL:
2759       S = IntegerLiteral::Create(Context, Empty);
2760       break;
2761 
2762     case EXPR_FLOATING_LITERAL:
2763       S = FloatingLiteral::Create(Context, Empty);
2764       break;
2765 
2766     case EXPR_IMAGINARY_LITERAL:
2767       S = new (Context) ImaginaryLiteral(Empty);
2768       break;
2769 
2770     case EXPR_STRING_LITERAL:
2771       S = StringLiteral::CreateEmpty(
2772           Context,
2773           /* NumConcatenated=*/Record[ASTStmtReader::NumExprFields],
2774           /* Length=*/Record[ASTStmtReader::NumExprFields + 1],
2775           /* CharByteWidth=*/Record[ASTStmtReader::NumExprFields + 2]);
2776       break;
2777 
2778     case EXPR_CHARACTER_LITERAL:
2779       S = new (Context) CharacterLiteral(Empty);
2780       break;
2781 
2782     case EXPR_PAREN:
2783       S = new (Context) ParenExpr(Empty);
2784       break;
2785 
2786     case EXPR_PAREN_LIST:
2787       S = ParenListExpr::CreateEmpty(
2788           Context,
2789           /* NumExprs=*/Record[ASTStmtReader::NumExprFields]);
2790       break;
2791 
2792     case EXPR_UNARY_OPERATOR:
2793       S = new (Context) UnaryOperator(Empty);
2794       break;
2795 
2796     case EXPR_OFFSETOF:
2797       S = OffsetOfExpr::CreateEmpty(Context,
2798                                     Record[ASTStmtReader::NumExprFields],
2799                                     Record[ASTStmtReader::NumExprFields + 1]);
2800       break;
2801 
2802     case EXPR_SIZEOF_ALIGN_OF:
2803       S = new (Context) UnaryExprOrTypeTraitExpr(Empty);
2804       break;
2805 
2806     case EXPR_ARRAY_SUBSCRIPT:
2807       S = new (Context) ArraySubscriptExpr(Empty);
2808       break;
2809 
2810     case EXPR_OMP_ARRAY_SECTION:
2811       S = new (Context) OMPArraySectionExpr(Empty);
2812       break;
2813 
2814     case EXPR_CALL:
2815       S = CallExpr::CreateEmpty(
2816           Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty);
2817       break;
2818 
2819     case EXPR_MEMBER:
2820       S = MemberExpr::CreateEmpty(Context, Record[ASTStmtReader::NumExprFields],
2821                                   Record[ASTStmtReader::NumExprFields + 1],
2822                                   Record[ASTStmtReader::NumExprFields + 2],
2823                                   Record[ASTStmtReader::NumExprFields + 3]);
2824       break;
2825 
2826     case EXPR_BINARY_OPERATOR:
2827       S = new (Context) BinaryOperator(Empty);
2828       break;
2829 
2830     case EXPR_COMPOUND_ASSIGN_OPERATOR:
2831       S = new (Context) CompoundAssignOperator(Empty);
2832       break;
2833 
2834     case EXPR_CONDITIONAL_OPERATOR:
2835       S = new (Context) ConditionalOperator(Empty);
2836       break;
2837 
2838     case EXPR_BINARY_CONDITIONAL_OPERATOR:
2839       S = new (Context) BinaryConditionalOperator(Empty);
2840       break;
2841 
2842     case EXPR_IMPLICIT_CAST:
2843       S = ImplicitCastExpr::CreateEmpty(Context,
2844                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
2845       break;
2846 
2847     case EXPR_CSTYLE_CAST:
2848       S = CStyleCastExpr::CreateEmpty(Context,
2849                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
2850       break;
2851 
2852     case EXPR_COMPOUND_LITERAL:
2853       S = new (Context) CompoundLiteralExpr(Empty);
2854       break;
2855 
2856     case EXPR_EXT_VECTOR_ELEMENT:
2857       S = new (Context) ExtVectorElementExpr(Empty);
2858       break;
2859 
2860     case EXPR_INIT_LIST:
2861       S = new (Context) InitListExpr(Empty);
2862       break;
2863 
2864     case EXPR_DESIGNATED_INIT:
2865       S = DesignatedInitExpr::CreateEmpty(Context,
2866                                      Record[ASTStmtReader::NumExprFields] - 1);
2867 
2868       break;
2869 
2870     case EXPR_DESIGNATED_INIT_UPDATE:
2871       S = new (Context) DesignatedInitUpdateExpr(Empty);
2872       break;
2873 
2874     case EXPR_IMPLICIT_VALUE_INIT:
2875       S = new (Context) ImplicitValueInitExpr(Empty);
2876       break;
2877 
2878     case EXPR_NO_INIT:
2879       S = new (Context) NoInitExpr(Empty);
2880       break;
2881 
2882     case EXPR_ARRAY_INIT_LOOP:
2883       S = new (Context) ArrayInitLoopExpr(Empty);
2884       break;
2885 
2886     case EXPR_ARRAY_INIT_INDEX:
2887       S = new (Context) ArrayInitIndexExpr(Empty);
2888       break;
2889 
2890     case EXPR_VA_ARG:
2891       S = new (Context) VAArgExpr(Empty);
2892       break;
2893 
2894     case EXPR_SOURCE_LOC:
2895       S = new (Context) SourceLocExpr(Empty);
2896       break;
2897 
2898     case EXPR_ADDR_LABEL:
2899       S = new (Context) AddrLabelExpr(Empty);
2900       break;
2901 
2902     case EXPR_STMT:
2903       S = new (Context) StmtExpr(Empty);
2904       break;
2905 
2906     case EXPR_CHOOSE:
2907       S = new (Context) ChooseExpr(Empty);
2908       break;
2909 
2910     case EXPR_GNU_NULL:
2911       S = new (Context) GNUNullExpr(Empty);
2912       break;
2913 
2914     case EXPR_SHUFFLE_VECTOR:
2915       S = new (Context) ShuffleVectorExpr(Empty);
2916       break;
2917 
2918     case EXPR_CONVERT_VECTOR:
2919       S = new (Context) ConvertVectorExpr(Empty);
2920       break;
2921 
2922     case EXPR_BLOCK:
2923       S = new (Context) BlockExpr(Empty);
2924       break;
2925 
2926     case EXPR_GENERIC_SELECTION:
2927       S = GenericSelectionExpr::CreateEmpty(
2928           Context,
2929           /*NumAssocs=*/Record[ASTStmtReader::NumExprFields]);
2930       break;
2931 
2932     case EXPR_OBJC_STRING_LITERAL:
2933       S = new (Context) ObjCStringLiteral(Empty);
2934       break;
2935 
2936     case EXPR_OBJC_BOXED_EXPRESSION:
2937       S = new (Context) ObjCBoxedExpr(Empty);
2938       break;
2939 
2940     case EXPR_OBJC_ARRAY_LITERAL:
2941       S = ObjCArrayLiteral::CreateEmpty(Context,
2942                                         Record[ASTStmtReader::NumExprFields]);
2943       break;
2944 
2945     case EXPR_OBJC_DICTIONARY_LITERAL:
2946       S = ObjCDictionaryLiteral::CreateEmpty(Context,
2947             Record[ASTStmtReader::NumExprFields],
2948             Record[ASTStmtReader::NumExprFields + 1]);
2949       break;
2950 
2951     case EXPR_OBJC_ENCODE:
2952       S = new (Context) ObjCEncodeExpr(Empty);
2953       break;
2954 
2955     case EXPR_OBJC_SELECTOR_EXPR:
2956       S = new (Context) ObjCSelectorExpr(Empty);
2957       break;
2958 
2959     case EXPR_OBJC_PROTOCOL_EXPR:
2960       S = new (Context) ObjCProtocolExpr(Empty);
2961       break;
2962 
2963     case EXPR_OBJC_IVAR_REF_EXPR:
2964       S = new (Context) ObjCIvarRefExpr(Empty);
2965       break;
2966 
2967     case EXPR_OBJC_PROPERTY_REF_EXPR:
2968       S = new (Context) ObjCPropertyRefExpr(Empty);
2969       break;
2970 
2971     case EXPR_OBJC_SUBSCRIPT_REF_EXPR:
2972       S = new (Context) ObjCSubscriptRefExpr(Empty);
2973       break;
2974 
2975     case EXPR_OBJC_KVC_REF_EXPR:
2976       llvm_unreachable("mismatching AST file");
2977 
2978     case EXPR_OBJC_MESSAGE_EXPR:
2979       S = ObjCMessageExpr::CreateEmpty(Context,
2980                                      Record[ASTStmtReader::NumExprFields],
2981                                      Record[ASTStmtReader::NumExprFields + 1]);
2982       break;
2983 
2984     case EXPR_OBJC_ISA:
2985       S = new (Context) ObjCIsaExpr(Empty);
2986       break;
2987 
2988     case EXPR_OBJC_INDIRECT_COPY_RESTORE:
2989       S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);
2990       break;
2991 
2992     case EXPR_OBJC_BRIDGED_CAST:
2993       S = new (Context) ObjCBridgedCastExpr(Empty);
2994       break;
2995 
2996     case STMT_OBJC_FOR_COLLECTION:
2997       S = new (Context) ObjCForCollectionStmt(Empty);
2998       break;
2999 
3000     case STMT_OBJC_CATCH:
3001       S = new (Context) ObjCAtCatchStmt(Empty);
3002       break;
3003 
3004     case STMT_OBJC_FINALLY:
3005       S = new (Context) ObjCAtFinallyStmt(Empty);
3006       break;
3007 
3008     case STMT_OBJC_AT_TRY:
3009       S = ObjCAtTryStmt::CreateEmpty(Context,
3010                                      Record[ASTStmtReader::NumStmtFields],
3011                                      Record[ASTStmtReader::NumStmtFields + 1]);
3012       break;
3013 
3014     case STMT_OBJC_AT_SYNCHRONIZED:
3015       S = new (Context) ObjCAtSynchronizedStmt(Empty);
3016       break;
3017 
3018     case STMT_OBJC_AT_THROW:
3019       S = new (Context) ObjCAtThrowStmt(Empty);
3020       break;
3021 
3022     case STMT_OBJC_AUTORELEASE_POOL:
3023       S = new (Context) ObjCAutoreleasePoolStmt(Empty);
3024       break;
3025 
3026     case EXPR_OBJC_BOOL_LITERAL:
3027       S = new (Context) ObjCBoolLiteralExpr(Empty);
3028       break;
3029 
3030     case EXPR_OBJC_AVAILABILITY_CHECK:
3031       S = new (Context) ObjCAvailabilityCheckExpr(Empty);
3032       break;
3033 
3034     case STMT_SEH_LEAVE:
3035       S = new (Context) SEHLeaveStmt(Empty);
3036       break;
3037 
3038     case STMT_SEH_EXCEPT:
3039       S = new (Context) SEHExceptStmt(Empty);
3040       break;
3041 
3042     case STMT_SEH_FINALLY:
3043       S = new (Context) SEHFinallyStmt(Empty);
3044       break;
3045 
3046     case STMT_SEH_TRY:
3047       S = new (Context) SEHTryStmt(Empty);
3048       break;
3049 
3050     case STMT_CXX_CATCH:
3051       S = new (Context) CXXCatchStmt(Empty);
3052       break;
3053 
3054     case STMT_CXX_TRY:
3055       S = CXXTryStmt::Create(Context, Empty,
3056              /*numHandlers=*/Record[ASTStmtReader::NumStmtFields]);
3057       break;
3058 
3059     case STMT_CXX_FOR_RANGE:
3060       S = new (Context) CXXForRangeStmt(Empty);
3061       break;
3062 
3063     case STMT_MS_DEPENDENT_EXISTS:
3064       S = new (Context) MSDependentExistsStmt(SourceLocation(), true,
3065                                               NestedNameSpecifierLoc(),
3066                                               DeclarationNameInfo(),
3067                                               nullptr);
3068       break;
3069 
3070     case STMT_OMP_PARALLEL_DIRECTIVE:
3071       S =
3072         OMPParallelDirective::CreateEmpty(Context,
3073                                           Record[ASTStmtReader::NumStmtFields],
3074                                           Empty);
3075       break;
3076 
3077     case STMT_OMP_SIMD_DIRECTIVE: {
3078       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3079       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3080       S = OMPSimdDirective::CreateEmpty(Context, NumClauses,
3081                                         CollapsedNum, Empty);
3082       break;
3083     }
3084 
3085     case STMT_OMP_FOR_DIRECTIVE: {
3086       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3087       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3088       S = OMPForDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3089                                        Empty);
3090       break;
3091     }
3092 
3093     case STMT_OMP_FOR_SIMD_DIRECTIVE: {
3094       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3095       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3096       S = OMPForSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3097                                            Empty);
3098       break;
3099     }
3100 
3101     case STMT_OMP_SECTIONS_DIRECTIVE:
3102       S = OMPSectionsDirective::CreateEmpty(
3103           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3104       break;
3105 
3106     case STMT_OMP_SECTION_DIRECTIVE:
3107       S = OMPSectionDirective::CreateEmpty(Context, Empty);
3108       break;
3109 
3110     case STMT_OMP_SINGLE_DIRECTIVE:
3111       S = OMPSingleDirective::CreateEmpty(
3112           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3113       break;
3114 
3115     case STMT_OMP_MASTER_DIRECTIVE:
3116       S = OMPMasterDirective::CreateEmpty(Context, Empty);
3117       break;
3118 
3119     case STMT_OMP_CRITICAL_DIRECTIVE:
3120       S = OMPCriticalDirective::CreateEmpty(
3121           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3122       break;
3123 
3124     case STMT_OMP_PARALLEL_FOR_DIRECTIVE: {
3125       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3126       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3127       S = OMPParallelForDirective::CreateEmpty(Context, NumClauses,
3128                                                CollapsedNum, Empty);
3129       break;
3130     }
3131 
3132     case STMT_OMP_PARALLEL_FOR_SIMD_DIRECTIVE: {
3133       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3134       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3135       S = OMPParallelForSimdDirective::CreateEmpty(Context, NumClauses,
3136                                                    CollapsedNum, Empty);
3137       break;
3138     }
3139 
3140     case STMT_OMP_PARALLEL_MASTER_DIRECTIVE:
3141       S = OMPParallelMasterDirective::CreateEmpty(
3142           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3143       break;
3144 
3145     case STMT_OMP_PARALLEL_SECTIONS_DIRECTIVE:
3146       S = OMPParallelSectionsDirective::CreateEmpty(
3147           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3148       break;
3149 
3150     case STMT_OMP_TASK_DIRECTIVE:
3151       S = OMPTaskDirective::CreateEmpty(
3152           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3153       break;
3154 
3155     case STMT_OMP_TASKYIELD_DIRECTIVE:
3156       S = OMPTaskyieldDirective::CreateEmpty(Context, Empty);
3157       break;
3158 
3159     case STMT_OMP_BARRIER_DIRECTIVE:
3160       S = OMPBarrierDirective::CreateEmpty(Context, Empty);
3161       break;
3162 
3163     case STMT_OMP_TASKWAIT_DIRECTIVE:
3164       S = OMPTaskwaitDirective::CreateEmpty(Context, Empty);
3165       break;
3166 
3167     case STMT_OMP_TASKGROUP_DIRECTIVE:
3168       S = OMPTaskgroupDirective::CreateEmpty(
3169           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3170       break;
3171 
3172     case STMT_OMP_FLUSH_DIRECTIVE:
3173       S = OMPFlushDirective::CreateEmpty(
3174           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3175       break;
3176 
3177     case STMT_OMP_ORDERED_DIRECTIVE:
3178       S = OMPOrderedDirective::CreateEmpty(
3179           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3180       break;
3181 
3182     case STMT_OMP_ATOMIC_DIRECTIVE:
3183       S = OMPAtomicDirective::CreateEmpty(
3184           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3185       break;
3186 
3187     case STMT_OMP_TARGET_DIRECTIVE:
3188       S = OMPTargetDirective::CreateEmpty(
3189           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3190       break;
3191 
3192     case STMT_OMP_TARGET_DATA_DIRECTIVE:
3193       S = OMPTargetDataDirective::CreateEmpty(
3194           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3195       break;
3196 
3197     case STMT_OMP_TARGET_ENTER_DATA_DIRECTIVE:
3198       S = OMPTargetEnterDataDirective::CreateEmpty(
3199           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3200       break;
3201 
3202     case STMT_OMP_TARGET_EXIT_DATA_DIRECTIVE:
3203       S = OMPTargetExitDataDirective::CreateEmpty(
3204           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3205       break;
3206 
3207     case STMT_OMP_TARGET_PARALLEL_DIRECTIVE:
3208       S = OMPTargetParallelDirective::CreateEmpty(
3209           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3210       break;
3211 
3212     case STMT_OMP_TARGET_PARALLEL_FOR_DIRECTIVE: {
3213       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3214       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3215       S = OMPTargetParallelForDirective::CreateEmpty(Context, NumClauses,
3216                                                      CollapsedNum, Empty);
3217       break;
3218     }
3219 
3220     case STMT_OMP_TARGET_UPDATE_DIRECTIVE:
3221       S = OMPTargetUpdateDirective::CreateEmpty(
3222           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3223       break;
3224 
3225     case STMT_OMP_TEAMS_DIRECTIVE:
3226       S = OMPTeamsDirective::CreateEmpty(
3227           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3228       break;
3229 
3230     case STMT_OMP_CANCELLATION_POINT_DIRECTIVE:
3231       S = OMPCancellationPointDirective::CreateEmpty(Context, Empty);
3232       break;
3233 
3234     case STMT_OMP_CANCEL_DIRECTIVE:
3235       S = OMPCancelDirective::CreateEmpty(
3236           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3237       break;
3238 
3239     case STMT_OMP_TASKLOOP_DIRECTIVE: {
3240       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3241       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3242       S = OMPTaskLoopDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3243                                             Empty);
3244       break;
3245     }
3246 
3247     case STMT_OMP_TASKLOOP_SIMD_DIRECTIVE: {
3248       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3249       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3250       S = OMPTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,
3251                                                 CollapsedNum, Empty);
3252       break;
3253     }
3254 
3255     case STMT_OMP_MASTER_TASKLOOP_DIRECTIVE: {
3256       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3257       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3258       S = OMPMasterTaskLoopDirective::CreateEmpty(Context, NumClauses,
3259                                                   CollapsedNum, Empty);
3260       break;
3261     }
3262 
3263     case STMT_OMP_MASTER_TASKLOOP_SIMD_DIRECTIVE: {
3264       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3265       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3266       S = OMPMasterTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,
3267                                                       CollapsedNum, Empty);
3268       break;
3269     }
3270 
3271     case STMT_OMP_PARALLEL_MASTER_TASKLOOP_DIRECTIVE: {
3272       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3273       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3274       S = OMPParallelMasterTaskLoopDirective::CreateEmpty(Context, NumClauses,
3275                                                           CollapsedNum, Empty);
3276       break;
3277     }
3278 
3279     case STMT_OMP_PARALLEL_MASTER_TASKLOOP_SIMD_DIRECTIVE: {
3280       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3281       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3282       S = OMPParallelMasterTaskLoopSimdDirective::CreateEmpty(
3283           Context, NumClauses, CollapsedNum, Empty);
3284       break;
3285     }
3286 
3287     case STMT_OMP_DISTRIBUTE_DIRECTIVE: {
3288       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3289       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3290       S = OMPDistributeDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3291                                               Empty);
3292       break;
3293     }
3294 
3295     case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: {
3296       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3297       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3298       S = OMPDistributeParallelForDirective::CreateEmpty(Context, NumClauses,
3299                                                          CollapsedNum, Empty);
3300       break;
3301     }
3302 
3303     case STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: {
3304       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3305       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3306       S = OMPDistributeParallelForSimdDirective::CreateEmpty(Context, NumClauses,
3307                                                              CollapsedNum,
3308                                                              Empty);
3309       break;
3310     }
3311 
3312     case STMT_OMP_DISTRIBUTE_SIMD_DIRECTIVE: {
3313       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3314       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3315       S = OMPDistributeSimdDirective::CreateEmpty(Context, NumClauses,
3316                                                   CollapsedNum, Empty);
3317       break;
3318     }
3319 
3320     case STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE: {
3321       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3322       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3323       S = OMPTargetParallelForSimdDirective::CreateEmpty(Context, NumClauses,
3324                                                          CollapsedNum, Empty);
3325       break;
3326     }
3327 
3328     case STMT_OMP_TARGET_SIMD_DIRECTIVE: {
3329       auto NumClauses = Record[ASTStmtReader::NumStmtFields];
3330       auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3331       S = OMPTargetSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3332                                               Empty);
3333       break;
3334     }
3335 
3336      case STMT_OMP_TEAMS_DISTRIBUTE_DIRECTIVE: {
3337       auto NumClauses = Record[ASTStmtReader::NumStmtFields];
3338       auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3339       S = OMPTeamsDistributeDirective::CreateEmpty(Context, NumClauses,
3340                                                    CollapsedNum, Empty);
3341       break;
3342     }
3343 
3344     case STMT_OMP_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE: {
3345       unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3346       unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3347       S = OMPTeamsDistributeSimdDirective::CreateEmpty(Context, NumClauses,
3348                                                        CollapsedNum, Empty);
3349       break;
3350     }
3351 
3352     case STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: {
3353       auto NumClauses = Record[ASTStmtReader::NumStmtFields];
3354       auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3355       S = OMPTeamsDistributeParallelForSimdDirective::CreateEmpty(
3356           Context, NumClauses, CollapsedNum, Empty);
3357       break;
3358     }
3359 
3360     case STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: {
3361       auto NumClauses = Record[ASTStmtReader::NumStmtFields];
3362       auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3363       S = OMPTeamsDistributeParallelForDirective::CreateEmpty(
3364           Context, NumClauses, CollapsedNum, Empty);
3365       break;
3366     }
3367 
3368     case STMT_OMP_TARGET_TEAMS_DIRECTIVE:
3369       S = OMPTargetTeamsDirective::CreateEmpty(
3370           Context, Record[ASTStmtReader::NumStmtFields], Empty);
3371       break;
3372 
3373     case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_DIRECTIVE: {
3374       auto NumClauses = Record[ASTStmtReader::NumStmtFields];
3375       auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3376       S = OMPTargetTeamsDistributeDirective::CreateEmpty(Context, NumClauses,
3377                                                          CollapsedNum, Empty);
3378       break;
3379     }
3380 
3381     case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE: {
3382       auto NumClauses = Record[ASTStmtReader::NumStmtFields];
3383       auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3384       S = OMPTargetTeamsDistributeParallelForDirective::CreateEmpty(
3385           Context, NumClauses, CollapsedNum, Empty);
3386       break;
3387     }
3388 
3389     case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE: {
3390       auto NumClauses = Record[ASTStmtReader::NumStmtFields];
3391       auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3392       S = OMPTargetTeamsDistributeParallelForSimdDirective::CreateEmpty(
3393           Context, NumClauses, CollapsedNum, Empty);
3394       break;
3395     }
3396 
3397     case STMT_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE: {
3398       auto NumClauses = Record[ASTStmtReader::NumStmtFields];
3399       auto CollapsedNum = Record[ASTStmtReader::NumStmtFields + 1];
3400       S = OMPTargetTeamsDistributeSimdDirective::CreateEmpty(
3401           Context, NumClauses, CollapsedNum, Empty);
3402       break;
3403     }
3404 
3405     case EXPR_CXX_OPERATOR_CALL:
3406       S = CXXOperatorCallExpr::CreateEmpty(
3407           Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty);
3408       break;
3409 
3410     case EXPR_CXX_MEMBER_CALL:
3411       S = CXXMemberCallExpr::CreateEmpty(
3412           Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty);
3413       break;
3414 
3415     case EXPR_CXX_REWRITTEN_BINARY_OPERATOR:
3416       S = new (Context) CXXRewrittenBinaryOperator(Empty);
3417       break;
3418 
3419     case EXPR_CXX_CONSTRUCT:
3420       S = CXXConstructExpr::CreateEmpty(
3421           Context,
3422           /* NumArgs=*/Record[ASTStmtReader::NumExprFields]);
3423       break;
3424 
3425     case EXPR_CXX_INHERITED_CTOR_INIT:
3426       S = new (Context) CXXInheritedCtorInitExpr(Empty);
3427       break;
3428 
3429     case EXPR_CXX_TEMPORARY_OBJECT:
3430       S = CXXTemporaryObjectExpr::CreateEmpty(
3431           Context,
3432           /* NumArgs=*/Record[ASTStmtReader::NumExprFields]);
3433       break;
3434 
3435     case EXPR_CXX_STATIC_CAST:
3436       S = CXXStaticCastExpr::CreateEmpty(Context,
3437                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
3438       break;
3439 
3440     case EXPR_CXX_DYNAMIC_CAST:
3441       S = CXXDynamicCastExpr::CreateEmpty(Context,
3442                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
3443       break;
3444 
3445     case EXPR_CXX_REINTERPRET_CAST:
3446       S = CXXReinterpretCastExpr::CreateEmpty(Context,
3447                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
3448       break;
3449 
3450     case EXPR_CXX_CONST_CAST:
3451       S = CXXConstCastExpr::CreateEmpty(Context);
3452       break;
3453 
3454     case EXPR_CXX_FUNCTIONAL_CAST:
3455       S = CXXFunctionalCastExpr::CreateEmpty(Context,
3456                        /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
3457       break;
3458 
3459     case EXPR_USER_DEFINED_LITERAL:
3460       S = UserDefinedLiteral::CreateEmpty(
3461           Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty);
3462       break;
3463 
3464     case EXPR_CXX_STD_INITIALIZER_LIST:
3465       S = new (Context) CXXStdInitializerListExpr(Empty);
3466       break;
3467 
3468     case EXPR_CXX_BOOL_LITERAL:
3469       S = new (Context) CXXBoolLiteralExpr(Empty);
3470       break;
3471 
3472     case EXPR_CXX_NULL_PTR_LITERAL:
3473       S = new (Context) CXXNullPtrLiteralExpr(Empty);
3474       break;
3475 
3476     case EXPR_CXX_TYPEID_EXPR:
3477       S = new (Context) CXXTypeidExpr(Empty, true);
3478       break;
3479 
3480     case EXPR_CXX_TYPEID_TYPE:
3481       S = new (Context) CXXTypeidExpr(Empty, false);
3482       break;
3483 
3484     case EXPR_CXX_UUIDOF_EXPR:
3485       S = new (Context) CXXUuidofExpr(Empty, true);
3486       break;
3487 
3488     case EXPR_CXX_PROPERTY_REF_EXPR:
3489       S = new (Context) MSPropertyRefExpr(Empty);
3490       break;
3491 
3492     case EXPR_CXX_PROPERTY_SUBSCRIPT_EXPR:
3493       S = new (Context) MSPropertySubscriptExpr(Empty);
3494       break;
3495 
3496     case EXPR_CXX_UUIDOF_TYPE:
3497       S = new (Context) CXXUuidofExpr(Empty, false);
3498       break;
3499 
3500     case EXPR_CXX_THIS:
3501       S = new (Context) CXXThisExpr(Empty);
3502       break;
3503 
3504     case EXPR_CXX_THROW:
3505       S = new (Context) CXXThrowExpr(Empty);
3506       break;
3507 
3508     case EXPR_CXX_DEFAULT_ARG:
3509       S = new (Context) CXXDefaultArgExpr(Empty);
3510       break;
3511 
3512     case EXPR_CXX_DEFAULT_INIT:
3513       S = new (Context) CXXDefaultInitExpr(Empty);
3514       break;
3515 
3516     case EXPR_CXX_BIND_TEMPORARY:
3517       S = new (Context) CXXBindTemporaryExpr(Empty);
3518       break;
3519 
3520     case EXPR_CXX_SCALAR_VALUE_INIT:
3521       S = new (Context) CXXScalarValueInitExpr(Empty);
3522       break;
3523 
3524     case EXPR_CXX_NEW:
3525       S = CXXNewExpr::CreateEmpty(
3526           Context,
3527           /*IsArray=*/Record[ASTStmtReader::NumExprFields],
3528           /*HasInit=*/Record[ASTStmtReader::NumExprFields + 1],
3529           /*NumPlacementArgs=*/Record[ASTStmtReader::NumExprFields + 2],
3530           /*IsParenTypeId=*/Record[ASTStmtReader::NumExprFields + 3]);
3531       break;
3532 
3533     case EXPR_CXX_DELETE:
3534       S = new (Context) CXXDeleteExpr(Empty);
3535       break;
3536 
3537     case EXPR_CXX_PSEUDO_DESTRUCTOR:
3538       S = new (Context) CXXPseudoDestructorExpr(Empty);
3539       break;
3540 
3541     case EXPR_EXPR_WITH_CLEANUPS:
3542       S = ExprWithCleanups::Create(Context, Empty,
3543                                    Record[ASTStmtReader::NumExprFields]);
3544       break;
3545 
3546     case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
3547       S = CXXDependentScopeMemberExpr::CreateEmpty(
3548           Context,
3549           /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
3550           /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 1],
3551           /*HasFirstQualifierFoundInScope=*/
3552           Record[ASTStmtReader::NumExprFields + 2]);
3553       break;
3554 
3555     case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
3556       S = DependentScopeDeclRefExpr::CreateEmpty(Context,
3557          /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields],
3558                   /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
3559                                    ? Record[ASTStmtReader::NumExprFields + 1]
3560                                    : 0);
3561       break;
3562 
3563     case EXPR_CXX_UNRESOLVED_CONSTRUCT:
3564       S = CXXUnresolvedConstructExpr::CreateEmpty(Context,
3565                               /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
3566       break;
3567 
3568     case EXPR_CXX_UNRESOLVED_MEMBER:
3569       S = UnresolvedMemberExpr::CreateEmpty(
3570           Context,
3571           /*NumResults=*/Record[ASTStmtReader::NumExprFields],
3572           /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 1],
3573           /*NumTemplateArgs=*/
3574           Record[ASTStmtReader::NumExprFields + 1]
3575               ? Record[ASTStmtReader::NumExprFields + 2]
3576               : 0);
3577       break;
3578 
3579     case EXPR_CXX_UNRESOLVED_LOOKUP:
3580       S = UnresolvedLookupExpr::CreateEmpty(
3581           Context,
3582           /*NumResults=*/Record[ASTStmtReader::NumExprFields],
3583           /*HasTemplateKWAndArgsInfo=*/Record[ASTStmtReader::NumExprFields + 1],
3584           /*NumTemplateArgs=*/
3585           Record[ASTStmtReader::NumExprFields + 1]
3586               ? Record[ASTStmtReader::NumExprFields + 2]
3587               : 0);
3588       break;
3589 
3590     case EXPR_TYPE_TRAIT:
3591       S = TypeTraitExpr::CreateDeserialized(Context,
3592             Record[ASTStmtReader::NumExprFields]);
3593       break;
3594 
3595     case EXPR_ARRAY_TYPE_TRAIT:
3596       S = new (Context) ArrayTypeTraitExpr(Empty);
3597       break;
3598 
3599     case EXPR_CXX_EXPRESSION_TRAIT:
3600       S = new (Context) ExpressionTraitExpr(Empty);
3601       break;
3602 
3603     case EXPR_CXX_NOEXCEPT:
3604       S = new (Context) CXXNoexceptExpr(Empty);
3605       break;
3606 
3607     case EXPR_PACK_EXPANSION:
3608       S = new (Context) PackExpansionExpr(Empty);
3609       break;
3610 
3611     case EXPR_SIZEOF_PACK:
3612       S = SizeOfPackExpr::CreateDeserialized(
3613               Context,
3614               /*NumPartialArgs=*/Record[ASTStmtReader::NumExprFields]);
3615       break;
3616 
3617     case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:
3618       S = new (Context) SubstNonTypeTemplateParmExpr(Empty);
3619       break;
3620 
3621     case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:
3622       S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);
3623       break;
3624 
3625     case EXPR_FUNCTION_PARM_PACK:
3626       S = FunctionParmPackExpr::CreateEmpty(Context,
3627                                           Record[ASTStmtReader::NumExprFields]);
3628       break;
3629 
3630     case EXPR_MATERIALIZE_TEMPORARY:
3631       S = new (Context) MaterializeTemporaryExpr(Empty);
3632       break;
3633 
3634     case EXPR_CXX_FOLD:
3635       S = new (Context) CXXFoldExpr(Empty);
3636       break;
3637 
3638     case EXPR_OPAQUE_VALUE:
3639       S = new (Context) OpaqueValueExpr(Empty);
3640       break;
3641 
3642     case EXPR_CUDA_KERNEL_CALL:
3643       S = CUDAKernelCallExpr::CreateEmpty(
3644           Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty);
3645       break;
3646 
3647     case EXPR_ASTYPE:
3648       S = new (Context) AsTypeExpr(Empty);
3649       break;
3650 
3651     case EXPR_PSEUDO_OBJECT: {
3652       unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields];
3653       S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs);
3654       break;
3655     }
3656 
3657     case EXPR_ATOMIC:
3658       S = new (Context) AtomicExpr(Empty);
3659       break;
3660 
3661     case EXPR_LAMBDA: {
3662       unsigned NumCaptures = Record[ASTStmtReader::NumExprFields];
3663       S = LambdaExpr::CreateDeserialized(Context, NumCaptures);
3664       break;
3665     }
3666 
3667     case STMT_COROUTINE_BODY: {
3668       unsigned NumParams = Record[ASTStmtReader::NumStmtFields];
3669       S = CoroutineBodyStmt::Create(Context, Empty, NumParams);
3670       break;
3671     }
3672 
3673     case STMT_CORETURN:
3674       S = new (Context) CoreturnStmt(Empty);
3675       break;
3676 
3677     case EXPR_COAWAIT:
3678       S = new (Context) CoawaitExpr(Empty);
3679       break;
3680 
3681     case EXPR_COYIELD:
3682       S = new (Context) CoyieldExpr(Empty);
3683       break;
3684 
3685     case EXPR_DEPENDENT_COAWAIT:
3686       S = new (Context) DependentCoawaitExpr(Empty);
3687       break;
3688 
3689     case EXPR_CONCEPT_SPECIALIZATION: {
3690       unsigned numTemplateArgs = Record[ASTStmtReader::NumExprFields];
3691       S = ConceptSpecializationExpr::Create(Context, Empty, numTemplateArgs);
3692       break;
3693     }
3694 
3695     case EXPR_REQUIRES:
3696       unsigned numLocalParameters = Record[ASTStmtReader::NumExprFields];
3697       unsigned numRequirement = Record[ASTStmtReader::NumExprFields + 1];
3698       S = RequiresExpr::Create(Context, Empty, numLocalParameters,
3699                                numRequirement);
3700       break;
3701     }
3702 
3703     // We hit a STMT_STOP, so we're done with this expression.
3704     if (Finished)
3705       break;
3706 
3707     ++NumStatementsRead;
3708 
3709     if (S && !IsStmtReference) {
3710       Reader.Visit(S);
3711       StmtEntries[Cursor.GetCurrentBitNo()] = S;
3712     }
3713 
3714     assert(Record.getIdx() == Record.size() &&
3715            "Invalid deserialization of statement");
3716     StmtStack.push_back(S);
3717   }
3718 Done:
3719   assert(StmtStack.size() > PrevNumStmts && "Read too many sub-stmts!");
3720   assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
3721   return StmtStack.pop_back_val();
3722 }
3723