Bug Summary

File:build/source/llvm/include/llvm/Bitstream/BitstreamReader.h
Warning:line 217, column 39
The result of the right shift is undefined due to shifting by '64', which is greater or equal to the width of type 'word_t'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name ASTReaderStmt.cpp -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -mframe-pointer=none -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/build/source/build-llvm -resource-dir /usr/lib/llvm-17/lib/clang/17 -I tools/clang/lib/Serialization -I /build/source/clang/lib/Serialization -I /build/source/clang/include -I tools/clang/include -I include -I /build/source/llvm/include -D _DEBUG -D _GLIBCXX_ASSERTIONS -D _GNU_SOURCE -D _LIBCPP_ENABLE_ASSERTIONS -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -D _FORTIFY_SOURCE=2 -D NDEBUG -U NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/backward -internal-isystem /usr/lib/llvm-17/lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/build/source/build-llvm=build-llvm -fmacro-prefix-map=/build/source/= -fcoverage-prefix-map=/build/source/build-llvm=build-llvm -fcoverage-prefix-map=/build/source/= -O3 -Wno-unused-command-line-argument -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type -Wno-comment -Wno-misleading-indentation -std=c++17 -fdeprecated-macro -fdebug-compilation-dir=/build/source/build-llvm -fdebug-prefix-map=/build/source/build-llvm=build-llvm -fdebug-prefix-map=/build/source/= -fdebug-prefix-map=/build/source/build-llvm=build-llvm -fdebug-prefix-map=/build/source/= -ferror-limit 19 -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -fcolor-diagnostics -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2023-05-10-133810-16478-1 -x c++ /build/source/clang/lib/Serialization/ASTReaderStmt.cpp

/build/source/clang/lib/Serialization/ASTReaderStmt.cpp

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

/build/source/llvm/include/llvm/Bitstream/BitstreamReader.h

1//===- BitstreamReader.h - Low-level bitstream reader interface -*- C++ -*-===//
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// This header defines the BitstreamReader class. This class can be used to
10// read an arbitrary bitstream, regardless of its contents.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_BITSTREAM_BITSTREAMREADER_H
15#define LLVM_BITSTREAM_BITSTREAMREADER_H
16
17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/SmallVector.h"
19#include "llvm/Bitstream/BitCodes.h"
20#include "llvm/Support/Endian.h"
21#include "llvm/Support/Error.h"
22#include "llvm/Support/MemoryBufferRef.h"
23#include <algorithm>
24#include <cassert>
25#include <climits>
26#include <cstddef>
27#include <cstdint>
28#include <memory>
29#include <optional>
30#include <string>
31#include <utility>
32#include <vector>
33
34namespace llvm {
35
36/// This class maintains the abbreviations read from a block info block.
37class BitstreamBlockInfo {
38public:
39 /// This contains information emitted to BLOCKINFO_BLOCK blocks. These
40 /// describe abbreviations that all blocks of the specified ID inherit.
41 struct BlockInfo {
42 unsigned BlockID = 0;
43 std::vector<std::shared_ptr<BitCodeAbbrev>> Abbrevs;
44 std::string Name;
45 std::vector<std::pair<unsigned, std::string>> RecordNames;
46 };
47
48private:
49 std::vector<BlockInfo> BlockInfoRecords;
50
51public:
52 /// If there is block info for the specified ID, return it, otherwise return
53 /// null.
54 const BlockInfo *getBlockInfo(unsigned BlockID) const {
55 // Common case, the most recent entry matches BlockID.
56 if (!BlockInfoRecords.empty() && BlockInfoRecords.back().BlockID == BlockID)
57 return &BlockInfoRecords.back();
58
59 for (const BlockInfo &BI : BlockInfoRecords)
60 if (BI.BlockID == BlockID)
61 return &BI;
62 return nullptr;
63 }
64
65 BlockInfo &getOrCreateBlockInfo(unsigned BlockID) {
66 if (const BlockInfo *BI = getBlockInfo(BlockID))
67 return *const_cast<BlockInfo*>(BI);
68
69 // Otherwise, add a new record.
70 BlockInfoRecords.emplace_back();
71 BlockInfoRecords.back().BlockID = BlockID;
72 return BlockInfoRecords.back();
73 }
74};
75
76/// This represents a position within a bitstream. There may be multiple
77/// independent cursors reading within one bitstream, each maintaining their
78/// own local state.
79class SimpleBitstreamCursor {
80 ArrayRef<uint8_t> BitcodeBytes;
81 size_t NextChar = 0;
82
83public:
84 /// This is the current data we have pulled from the stream but have not
85 /// returned to the client. This is specifically and intentionally defined to
86 /// follow the word size of the host machine for efficiency. We use word_t in
87 /// places that are aware of this to make it perfectly explicit what is going
88 /// on.
89 using word_t = size_t;
90
91private:
92 word_t CurWord = 0;
93
94 /// This is the number of bits in CurWord that are valid. This is always from
95 /// [0...bits_of(size_t)-1] inclusive.
96 unsigned BitsInCurWord = 0;
97
98public:
99 SimpleBitstreamCursor() = default;
100 explicit SimpleBitstreamCursor(ArrayRef<uint8_t> BitcodeBytes)
101 : BitcodeBytes(BitcodeBytes) {}
102 explicit SimpleBitstreamCursor(StringRef BitcodeBytes)
103 : BitcodeBytes(arrayRefFromStringRef(BitcodeBytes)) {}
104 explicit SimpleBitstreamCursor(MemoryBufferRef BitcodeBytes)
105 : SimpleBitstreamCursor(BitcodeBytes.getBuffer()) {}
106
107 bool canSkipToPos(size_t pos) const {
108 // pos can be skipped to if it is a valid address or one byte past the end.
109 return pos <= BitcodeBytes.size();
110 }
111
112 bool AtEndOfStream() {
113 return BitsInCurWord == 0 && BitcodeBytes.size() <= NextChar;
114 }
115
116 /// Return the bit # of the bit we are reading.
117 uint64_t GetCurrentBitNo() const {
118 return NextChar*CHAR_BIT8 - BitsInCurWord;
119 }
120
121 // Return the byte # of the current bit.
122 uint64_t getCurrentByteNo() const { return GetCurrentBitNo() / 8; }
123
124 ArrayRef<uint8_t> getBitcodeBytes() const { return BitcodeBytes; }
125
126 /// Reset the stream to the specified bit number.
127 Error JumpToBit(uint64_t BitNo) {
128 size_t ByteNo = size_t(BitNo/8) & ~(sizeof(word_t)-1);
129 unsigned WordBitNo = unsigned(BitNo & (sizeof(word_t)*8-1));
130 assert(canSkipToPos(ByteNo) && "Invalid location")(static_cast <bool> (canSkipToPos(ByteNo) && "Invalid location"
) ? void (0) : __assert_fail ("canSkipToPos(ByteNo) && \"Invalid location\""
, "llvm/include/llvm/Bitstream/BitstreamReader.h", 130, __extension__
__PRETTY_FUNCTION__))
;
131
132 // Move the cursor to the right word.
133 NextChar = ByteNo;
134 BitsInCurWord = 0;
135
136 // Skip over any bits that are already consumed.
137 if (WordBitNo) {
138 if (Expected<word_t> Res = Read(WordBitNo))
139 return Error::success();
140 else
141 return Res.takeError();
142 }
143
144 return Error::success();
145 }
146
147 /// Get a pointer into the bitstream at the specified byte offset.
148 const uint8_t *getPointerToByte(uint64_t ByteNo, uint64_t NumBytes) {
149 return BitcodeBytes.data() + ByteNo;
150 }
151
152 /// Get a pointer into the bitstream at the specified bit offset.
153 ///
154 /// The bit offset must be on a byte boundary.
155 const uint8_t *getPointerToBit(uint64_t BitNo, uint64_t NumBytes) {
156 assert(!(BitNo % 8) && "Expected bit on byte boundary")(static_cast <bool> (!(BitNo % 8) && "Expected bit on byte boundary"
) ? void (0) : __assert_fail ("!(BitNo % 8) && \"Expected bit on byte boundary\""
, "llvm/include/llvm/Bitstream/BitstreamReader.h", 156, __extension__
__PRETTY_FUNCTION__))
;
157 return getPointerToByte(BitNo / 8, NumBytes);
158 }
159
160 Error fillCurWord() {
161 if (NextChar >= BitcodeBytes.size())
162 return createStringError(std::errc::io_error,
163 "Unexpected end of file reading %u of %u bytes",
164 NextChar, BitcodeBytes.size());
165
166 // Read the next word from the stream.
167 const uint8_t *NextCharPtr = BitcodeBytes.data() + NextChar;
168 unsigned BytesRead;
169 if (BitcodeBytes.size() >= NextChar + sizeof(word_t)) {
170 BytesRead = sizeof(word_t);
171 CurWord =
172 support::endian::read<word_t, support::little, support::unaligned>(
173 NextCharPtr);
174 } else {
175 // Short read.
176 BytesRead = BitcodeBytes.size() - NextChar;
177 CurWord = 0;
178 for (unsigned B = 0; B != BytesRead; ++B)
179 CurWord |= uint64_t(NextCharPtr[B]) << (B * 8);
180 }
181 NextChar += BytesRead;
182 BitsInCurWord = BytesRead * 8;
183 return Error::success();
184 }
185
186 Expected<word_t> Read(unsigned NumBits) {
187 static const unsigned BitsInWord = sizeof(word_t) * 8;
188
189 assert(NumBits && NumBits <= BitsInWord &&(static_cast <bool> (NumBits && NumBits <= BitsInWord
&& "Cannot return zero or more than BitsInWord bits!"
) ? void (0) : __assert_fail ("NumBits && NumBits <= BitsInWord && \"Cannot return zero or more than BitsInWord bits!\""
, "llvm/include/llvm/Bitstream/BitstreamReader.h", 190, __extension__
__PRETTY_FUNCTION__))
9
Assuming 'NumBits' is not equal to 0
10
Assuming 'NumBits' is <= 'BitsInWord'
11
'?' condition is true
190 "Cannot return zero or more than BitsInWord bits!")(static_cast <bool> (NumBits && NumBits <= BitsInWord
&& "Cannot return zero or more than BitsInWord bits!"
) ? void (0) : __assert_fail ("NumBits && NumBits <= BitsInWord && \"Cannot return zero or more than BitsInWord bits!\""
, "llvm/include/llvm/Bitstream/BitstreamReader.h", 190, __extension__
__PRETTY_FUNCTION__))
;
191
192 static const unsigned Mask = sizeof(word_t) > 4 ? 0x3f : 0x1f;
12
'?' condition is true
193
194 // If the field is fully contained by CurWord, return it quickly.
195 if (BitsInCurWord >= NumBits) {
13
Assuming 'NumBits' is > field 'BitsInCurWord'
196 word_t R = CurWord & (~word_t(0) >> (BitsInWord - NumBits));
197
198 // Use a mask to avoid undefined behavior.
199 CurWord >>= (NumBits & Mask);
200
201 BitsInCurWord -= NumBits;
202 return R;
203 }
204
205 word_t R = BitsInCurWord
14.1
Field 'BitsInCurWord' is not equal to 0
14.1
Field 'BitsInCurWord' is not equal to 0
? CurWord : 0;
14
Taking false branch
15
'?' condition is true
206 unsigned BitsLeft = NumBits - BitsInCurWord;
207
208 if (Error fillResult = fillCurWord())
16
Assuming the condition is false
17
Taking false branch
209 return std::move(fillResult);
210
211 // If we run out of data, abort.
212 if (BitsLeft > BitsInCurWord)
18
Assuming 'BitsLeft' is <= field 'BitsInCurWord'
19
Taking false branch
213 return createStringError(std::errc::io_error,
214 "Unexpected end of file reading %u of %u bits",
215 BitsInCurWord, BitsLeft);
216
217 word_t R2 = CurWord & (~word_t(0) >> (BitsInWord - BitsLeft));
20
The result of the right shift is undefined due to shifting by '64', which is greater or equal to the width of type 'word_t'
218
219 // Use a mask to avoid undefined behavior.
220 CurWord >>= (BitsLeft & Mask);
221
222 BitsInCurWord -= BitsLeft;
223
224 R |= R2 << (NumBits - BitsLeft);
225
226 return R;
227 }
228
229 Expected<uint32_t> ReadVBR(const unsigned NumBits) {
230 Expected<unsigned> MaybeRead = Read(NumBits);
231 if (!MaybeRead)
232 return MaybeRead;
233 uint32_t Piece = MaybeRead.get();
234
235 assert(NumBits <= 32 && NumBits >= 1 && "Invalid NumBits value")(static_cast <bool> (NumBits <= 32 && NumBits
>= 1 && "Invalid NumBits value") ? void (0) : __assert_fail
("NumBits <= 32 && NumBits >= 1 && \"Invalid NumBits value\""
, "llvm/include/llvm/Bitstream/BitstreamReader.h", 235, __extension__
__PRETTY_FUNCTION__))
;
236 const uint32_t MaskBitOrder = (NumBits - 1);
237 const uint32_t Mask = 1UL << MaskBitOrder;
238
239 if ((Piece & Mask) == 0)
240 return Piece;
241
242 uint32_t Result = 0;
243 unsigned NextBit = 0;
244 while (true) {
245 Result |= (Piece & (Mask - 1)) << NextBit;
246
247 if ((Piece & Mask) == 0)
248 return Result;
249
250 NextBit += NumBits-1;
251 if (NextBit >= 32)
252 return createStringError(std::errc::illegal_byte_sequence,
253 "Unterminated VBR");
254
255 MaybeRead = Read(NumBits);
256 if (!MaybeRead)
257 return MaybeRead;
258 Piece = MaybeRead.get();
259 }
260 }
261
262 // Read a VBR that may have a value up to 64-bits in size. The chunk size of
263 // the VBR must still be <= 32 bits though.
264 Expected<uint64_t> ReadVBR64(const unsigned NumBits) {
265 Expected<uint64_t> MaybeRead = Read(NumBits);
266 if (!MaybeRead)
267 return MaybeRead;
268 uint32_t Piece = MaybeRead.get();
269 assert(NumBits <= 32 && NumBits >= 1 && "Invalid NumBits value")(static_cast <bool> (NumBits <= 32 && NumBits
>= 1 && "Invalid NumBits value") ? void (0) : __assert_fail
("NumBits <= 32 && NumBits >= 1 && \"Invalid NumBits value\""
, "llvm/include/llvm/Bitstream/BitstreamReader.h", 269, __extension__
__PRETTY_FUNCTION__))
;
270 const uint32_t MaskBitOrder = (NumBits - 1);
271 const uint32_t Mask = 1UL << MaskBitOrder;
272
273 if ((Piece & Mask) == 0)
274 return uint64_t(Piece);
275
276 uint64_t Result = 0;
277 unsigned NextBit = 0;
278 while (true) {
279 Result |= uint64_t(Piece & (Mask - 1)) << NextBit;
280
281 if ((Piece & Mask) == 0)
282 return Result;
283
284 NextBit += NumBits-1;
285 if (NextBit >= 64)
286 return createStringError(std::errc::illegal_byte_sequence,
287 "Unterminated VBR");
288
289 MaybeRead = Read(NumBits);
290 if (!MaybeRead)
291 return MaybeRead;
292 Piece = MaybeRead.get();
293 }
294 }
295
296 void SkipToFourByteBoundary() {
297 // If word_t is 64-bits and if we've read less than 32 bits, just dump
298 // the bits we have up to the next 32-bit boundary.
299 if (sizeof(word_t) > 4 &&
300 BitsInCurWord >= 32) {
301 CurWord >>= BitsInCurWord-32;
302 BitsInCurWord = 32;
303 return;
304 }
305
306 BitsInCurWord = 0;
307 }
308
309 /// Return the size of the stream in bytes.
310 size_t SizeInBytes() const { return BitcodeBytes.size(); }
311
312 /// Skip to the end of the file.
313 void skipToEnd() { NextChar = BitcodeBytes.size(); }
314
315 /// Check whether a reservation of Size elements is plausible.
316 bool isSizePlausible(size_t Size) const {
317 // Don't allow reserving more elements than the number of bits, assuming
318 // at least one bit is needed to encode an element.
319 return Size < BitcodeBytes.size() * 8;
320 }
321};
322
323/// When advancing through a bitstream cursor, each advance can discover a few
324/// different kinds of entries:
325struct BitstreamEntry {
326 enum {
327 Error, // Malformed bitcode was found.
328 EndBlock, // We've reached the end of the current block, (or the end of the
329 // file, which is treated like a series of EndBlock records.
330 SubBlock, // This is the start of a new subblock of a specific ID.
331 Record // This is a record with a specific AbbrevID.
332 } Kind;
333
334 unsigned ID;
335
336 static BitstreamEntry getError() {
337 BitstreamEntry E; E.Kind = Error; return E;
338 }
339
340 static BitstreamEntry getEndBlock() {
341 BitstreamEntry E; E.Kind = EndBlock; return E;
342 }
343
344 static BitstreamEntry getSubBlock(unsigned ID) {
345 BitstreamEntry E; E.Kind = SubBlock; E.ID = ID; return E;
346 }
347
348 static BitstreamEntry getRecord(unsigned AbbrevID) {
349 BitstreamEntry E; E.Kind = Record; E.ID = AbbrevID; return E;
350 }
351};
352
353/// This represents a position within a bitcode file, implemented on top of a
354/// SimpleBitstreamCursor.
355///
356/// Unlike iterators, BitstreamCursors are heavy-weight objects that should not
357/// be passed by value.
358class BitstreamCursor : SimpleBitstreamCursor {
359 // This is the declared size of code values used for the current block, in
360 // bits.
361 unsigned CurCodeSize = 2;
362
363 /// Abbrevs installed at in this block.
364 std::vector<std::shared_ptr<BitCodeAbbrev>> CurAbbrevs;
365
366 struct Block {
367 unsigned PrevCodeSize;
368 std::vector<std::shared_ptr<BitCodeAbbrev>> PrevAbbrevs;
369
370 explicit Block(unsigned PCS) : PrevCodeSize(PCS) {}
371 };
372
373 /// This tracks the codesize of parent blocks.
374 SmallVector<Block, 8> BlockScope;
375
376 BitstreamBlockInfo *BlockInfo = nullptr;
377
378public:
379 static const size_t MaxChunkSize = 32;
380
381 BitstreamCursor() = default;
382 explicit BitstreamCursor(ArrayRef<uint8_t> BitcodeBytes)
383 : SimpleBitstreamCursor(BitcodeBytes) {}
384 explicit BitstreamCursor(StringRef BitcodeBytes)
385 : SimpleBitstreamCursor(BitcodeBytes) {}
386 explicit BitstreamCursor(MemoryBufferRef BitcodeBytes)
387 : SimpleBitstreamCursor(BitcodeBytes) {}
388
389 using SimpleBitstreamCursor::AtEndOfStream;
390 using SimpleBitstreamCursor::canSkipToPos;
391 using SimpleBitstreamCursor::fillCurWord;
392 using SimpleBitstreamCursor::getBitcodeBytes;
393 using SimpleBitstreamCursor::GetCurrentBitNo;
394 using SimpleBitstreamCursor::getCurrentByteNo;
395 using SimpleBitstreamCursor::getPointerToByte;
396 using SimpleBitstreamCursor::JumpToBit;
397 using SimpleBitstreamCursor::Read;
398 using SimpleBitstreamCursor::ReadVBR;
399 using SimpleBitstreamCursor::ReadVBR64;
400 using SimpleBitstreamCursor::SizeInBytes;
401 using SimpleBitstreamCursor::skipToEnd;
402
403 /// Return the number of bits used to encode an abbrev #.
404 unsigned getAbbrevIDWidth() const { return CurCodeSize; }
405
406 /// Flags that modify the behavior of advance().
407 enum {
408 /// If this flag is used, the advance() method does not automatically pop
409 /// the block scope when the end of a block is reached.
410 AF_DontPopBlockAtEnd = 1,
411
412 /// If this flag is used, abbrev entries are returned just like normal
413 /// records.
414 AF_DontAutoprocessAbbrevs = 2
415 };
416
417 /// Advance the current bitstream, returning the next entry in the stream.
418 Expected<BitstreamEntry> advance(unsigned Flags = 0) {
419 while (true) {
5
Loop condition is true. Entering loop body
420 if (AtEndOfStream())
6
Taking false branch
421 return BitstreamEntry::getError();
422
423 Expected<unsigned> MaybeCode = ReadCode();
7
Calling 'BitstreamCursor::ReadCode'
424 if (!MaybeCode)
425 return MaybeCode.takeError();
426 unsigned Code = MaybeCode.get();
427
428 if (Code == bitc::END_BLOCK) {
429 // Pop the end of the block unless Flags tells us not to.
430 if (!(Flags & AF_DontPopBlockAtEnd) && ReadBlockEnd())
431 return BitstreamEntry::getError();
432 return BitstreamEntry::getEndBlock();
433 }
434
435 if (Code == bitc::ENTER_SUBBLOCK) {
436 if (Expected<unsigned> MaybeSubBlock = ReadSubBlockID())
437 return BitstreamEntry::getSubBlock(MaybeSubBlock.get());
438 else
439 return MaybeSubBlock.takeError();
440 }
441
442 if (Code == bitc::DEFINE_ABBREV &&
443 !(Flags & AF_DontAutoprocessAbbrevs)) {
444 // We read and accumulate abbrev's, the client can't do anything with
445 // them anyway.
446 if (Error Err = ReadAbbrevRecord())
447 return std::move(Err);
448 continue;
449 }
450
451 return BitstreamEntry::getRecord(Code);
452 }
453 }
454
455 /// This is a convenience function for clients that don't expect any
456 /// subblocks. This just skips over them automatically.
457 Expected<BitstreamEntry> advanceSkippingSubblocks(unsigned Flags = 0) {
458 while (true) {
3
Loop condition is true. Entering loop body
459 // If we found a normal entry, return it.
460 Expected<BitstreamEntry> MaybeEntry = advance(Flags);
4
Calling 'BitstreamCursor::advance'
461 if (!MaybeEntry)
462 return MaybeEntry;
463 BitstreamEntry Entry = MaybeEntry.get();
464
465 if (Entry.Kind != BitstreamEntry::SubBlock)
466 return Entry;
467
468 // If we found a sub-block, just skip over it and check the next entry.
469 if (Error Err = SkipBlock())
470 return std::move(Err);
471 }
472 }
473
474 Expected<unsigned> ReadCode() { return Read(CurCodeSize); }
8
Calling 'SimpleBitstreamCursor::Read'
475
476 // Block header:
477 // [ENTER_SUBBLOCK, blockid, newcodelen, <align4bytes>, blocklen]
478
479 /// Having read the ENTER_SUBBLOCK code, read the BlockID for the block.
480 Expected<unsigned> ReadSubBlockID() { return ReadVBR(bitc::BlockIDWidth); }
481
482 /// Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body
483 /// of this block.
484 Error SkipBlock() {
485 // Read and ignore the codelen value.
486 if (Expected<uint32_t> Res = ReadVBR(bitc::CodeLenWidth))
487 ; // Since we are skipping this block, we don't care what code widths are
488 // used inside of it.
489 else
490 return Res.takeError();
491
492 SkipToFourByteBoundary();
493 Expected<unsigned> MaybeNum = Read(bitc::BlockSizeWidth);
494 if (!MaybeNum)
495 return MaybeNum.takeError();
496 size_t NumFourBytes = MaybeNum.get();
497
498 // Check that the block wasn't partially defined, and that the offset isn't
499 // bogus.
500 size_t SkipTo = GetCurrentBitNo() + NumFourBytes * 4 * 8;
501 if (AtEndOfStream())
502 return createStringError(std::errc::illegal_byte_sequence,
503 "can't skip block: already at end of stream");
504 if (!canSkipToPos(SkipTo / 8))
505 return createStringError(std::errc::illegal_byte_sequence,
506 "can't skip to bit %zu from %" PRIu64"l" "u", SkipTo,
507 GetCurrentBitNo());
508
509 if (Error Res = JumpToBit(SkipTo))
510 return Res;
511
512 return Error::success();
513 }
514
515 /// Having read the ENTER_SUBBLOCK abbrevid, and enter the block.
516 Error EnterSubBlock(unsigned BlockID, unsigned *NumWordsP = nullptr);
517
518 bool ReadBlockEnd() {
519 if (BlockScope.empty()) return true;
520
521 // Block tail:
522 // [END_BLOCK, <align4bytes>]
523 SkipToFourByteBoundary();
524
525 popBlockScope();
526 return false;
527 }
528
529private:
530 void popBlockScope() {
531 CurCodeSize = BlockScope.back().PrevCodeSize;
532
533 CurAbbrevs = std::move(BlockScope.back().PrevAbbrevs);
534 BlockScope.pop_back();
535 }
536
537 //===--------------------------------------------------------------------===//
538 // Record Processing
539 //===--------------------------------------------------------------------===//
540
541public:
542 /// Return the abbreviation for the specified AbbrevId.
543 Expected<const BitCodeAbbrev *> getAbbrev(unsigned AbbrevID) {
544 unsigned AbbrevNo = AbbrevID - bitc::FIRST_APPLICATION_ABBREV;
545 if (AbbrevNo >= CurAbbrevs.size())
546 return createStringError(
547 std::errc::illegal_byte_sequence, "Invalid abbrev number");
548 return CurAbbrevs[AbbrevNo].get();
549 }
550
551 /// Read the current record and discard it, returning the code for the record.
552 Expected<unsigned> skipRecord(unsigned AbbrevID);
553
554 Expected<unsigned> readRecord(unsigned AbbrevID,
555 SmallVectorImpl<uint64_t> &Vals,
556 StringRef *Blob = nullptr);
557
558 //===--------------------------------------------------------------------===//
559 // Abbrev Processing
560 //===--------------------------------------------------------------------===//
561 Error ReadAbbrevRecord();
562
563 /// Read and return a block info block from the bitstream. If an error was
564 /// encountered, return std::nullopt.
565 ///
566 /// \param ReadBlockInfoNames Whether to read block/record name information in
567 /// the BlockInfo block. Only llvm-bcanalyzer uses this.
568 Expected<std::optional<BitstreamBlockInfo>>
569 ReadBlockInfoBlock(bool ReadBlockInfoNames = false);
570
571 /// Set the block info to be used by this BitstreamCursor to interpret
572 /// abbreviated records.
573 void setBlockInfo(BitstreamBlockInfo *BI) { BlockInfo = BI; }
574};
575
576} // end llvm namespace
577
578#endif // LLVM_BITSTREAM_BITSTREAMREADER_H