clang 24.0.0git
ASTReaderStmt.cpp
Go to the documentation of this file.
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
17#include "clang/AST/Decl.h"
19#include "clang/AST/DeclCXX.h"
20#include "clang/AST/DeclGroup.h"
21#include "clang/AST/DeclObjC.h"
25#include "clang/AST/Expr.h"
26#include "clang/AST/ExprCXX.h"
27#include "clang/AST/ExprObjC.h"
32#include "clang/AST/Stmt.h"
33#include "clang/AST/StmtCXX.h"
34#include "clang/AST/StmtObjC.h"
36#include "clang/AST/StmtSYCL.h"
39#include "clang/AST/Type.h"
43#include "clang/Basic/LLVM.h"
48#include "clang/Lex/Token.h"
51#include "llvm/ADT/DenseMap.h"
52#include "llvm/ADT/SmallVector.h"
53#include "llvm/ADT/StringRef.h"
54#include "llvm/Bitstream/BitstreamReader.h"
55#include "llvm/Support/ErrorHandling.h"
56#include <algorithm>
57#include <cassert>
58#include <cstdint>
59#include <optional>
60#include <string>
61
62using namespace clang;
63using namespace serialization;
64
65namespace clang {
66
67 class ASTStmtReader : public StmtVisitor<ASTStmtReader> {
68 ASTRecordReader &Record;
69 llvm::BitstreamCursor &DeclsCursor;
70
71 std::optional<BitsUnpacker> CurrentUnpackingBits;
72
73 SourceLocation readSourceLocation() {
74 return Record.readSourceLocation();
75 }
76
77 SourceRange readSourceRange() {
78 return Record.readSourceRange();
79 }
80
81 std::string readString() {
82 return Record.readString();
83 }
84
85 TypeSourceInfo *readTypeSourceInfo() {
86 return Record.readTypeSourceInfo();
87 }
88
89 Decl *readDecl() {
90 return Record.readDecl();
91 }
92
93 template<typename T>
94 T *readDeclAs() {
95 return Record.readDeclAs<T>();
96 }
97
98 public:
99 ASTStmtReader(ASTRecordReader &Record, llvm::BitstreamCursor &Cursor)
100 : Record(Record), DeclsCursor(Cursor) {}
101
102 /// The number of record fields required for the Stmt class
103 /// itself.
104 static const unsigned NumStmtFields = 0;
105
106 /// The number of record fields required for the Expr class
107 /// itself.
108 static const unsigned NumExprFields = NumStmtFields + 2;
109
110 /// The number of record fields required for the ObjCObjectLiteral class
111 /// itself (Expr fields + isExpressibleAsConstantInitializer).
112 static const unsigned NumObjCObjectLiteralFields = NumExprFields + 1;
113
114 /// The number of bits required for the packing bits for the Expr class.
115 static const unsigned NumExprBits = 10;
116
117 /// Read and initialize a ExplicitTemplateArgumentList structure.
119 TemplateArgumentLoc *ArgsLocArray,
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
131 TemplateArgumentLoc *ArgsLocArray,
132 unsigned NumTemplateArgs) {
133 SourceLocation TemplateKWLoc = readSourceLocation();
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
143 assert(Record.getIdx() == NumStmtFields && "Incorrect statement field count");
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);
155 unsigned NumStmts = Record.readInt();
156 unsigned HasFPFeatures = Record.readInt();
157 assert(S->hasStoredFPFeatures() == HasFPFeatures);
158 while (NumStmts--)
159 Stmts.push_back(Record.readSubStmt());
160 S->setStmts(Stmts);
161 if (HasFPFeatures)
162 S->setStoredFPFeatures(
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);
212 assert(NumAttrs == Attrs.size());
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 CurrentUnpackingBits.emplace(Record.readInt());
222
223 bool HasElse = CurrentUnpackingBits->getNextBit();
224 bool HasVar = CurrentUnpackingBits->getNextBit();
225 bool HasInit = CurrentUnpackingBits->getNextBit();
226
227 S->setStatementKind(static_cast<IfStatementKind>(Record.readInt()));
228 S->setCond(Record.readSubExpr());
229 S->setThen(Record.readSubStmt());
230 if (HasElse)
231 S->setElse(Record.readSubStmt());
232 if (HasVar)
233 S->setConditionVariableDeclStmt(cast<DeclStmt>(Record.readSubStmt()));
234 if (HasInit)
235 S->setInit(Record.readSubStmt());
236
237 S->setIfLoc(readSourceLocation());
238 S->setLParenLoc(readSourceLocation());
239 S->setRParenLoc(readSourceLocation());
240 if (HasElse)
241 S->setElseLoc(readSourceLocation());
242}
243
244void ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) {
245 VisitStmt(S);
246
247 bool HasInit = Record.readInt();
248 bool HasVar = Record.readInt();
249 bool AllEnumCasesCovered = Record.readInt();
250 if (AllEnumCasesCovered)
252
253 S->setCond(Record.readSubExpr());
254 S->setBody(Record.readSubStmt());
255 if (HasInit)
256 S->setInit(Record.readSubStmt());
257 if (HasVar)
258 S->setConditionVariableDeclStmt(cast<DeclStmt>(Record.readSubStmt()));
259
260 S->setSwitchLoc(readSourceLocation());
261 S->setLParenLoc(readSourceLocation());
262 S->setRParenLoc(readSourceLocation());
263
264 SwitchCase *PrevSC = nullptr;
265 for (auto E = Record.size(); Record.getIdx() != E; ) {
266 SwitchCase *SC = Record.getSwitchCaseWithID(Record.readInt());
267 if (PrevSC)
268 PrevSC->setNextSwitchCase(SC);
269 else
270 S->setSwitchCaseList(SC);
271
272 PrevSC = SC;
273 }
274}
275
276void ASTStmtReader::VisitWhileStmt(WhileStmt *S) {
277 VisitStmt(S);
278
279 bool HasVar = Record.readInt();
280
281 S->setCond(Record.readSubExpr());
282 S->setBody(Record.readSubStmt());
283 if (HasVar)
284 S->setConditionVariableDeclStmt(cast<DeclStmt>(Record.readSubStmt()));
285
286 S->setWhileLoc(readSourceLocation());
287 S->setLParenLoc(readSourceLocation());
288 S->setRParenLoc(readSourceLocation());
289}
290
291void ASTStmtReader::VisitDoStmt(DoStmt *S) {
292 VisitStmt(S);
293 S->setCond(Record.readSubExpr());
294 S->setBody(Record.readSubStmt());
295 S->setDoLoc(readSourceLocation());
296 S->setWhileLoc(readSourceLocation());
297 S->setRParenLoc(readSourceLocation());
298}
299
300void ASTStmtReader::VisitForStmt(ForStmt *S) {
301 VisitStmt(S);
302 S->setInit(Record.readSubStmt());
303 S->setCond(Record.readSubExpr());
304 S->setConditionVariableDeclStmt(cast_or_null<DeclStmt>(Record.readSubStmt()));
305 S->setInc(Record.readSubExpr());
306 S->setBody(Record.readSubStmt());
307 S->setForLoc(readSourceLocation());
308 S->setLParenLoc(readSourceLocation());
309 S->setRParenLoc(readSourceLocation());
310}
311
312void ASTStmtReader::VisitGotoStmt(GotoStmt *S) {
313 VisitStmt(S);
314 S->setLabel(readDeclAs<LabelDecl>());
315 S->setGotoLoc(readSourceLocation());
316 S->setLabelLoc(readSourceLocation());
317}
318
319void ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
320 VisitStmt(S);
321 S->setGotoLoc(readSourceLocation());
322 S->setStarLoc(readSourceLocation());
323 S->setTarget(Record.readSubExpr());
324}
325
326void ASTStmtReader::VisitLoopControlStmt(LoopControlStmt *S) {
327 VisitStmt(S);
328 S->setKwLoc(readSourceLocation());
329 if (Record.readBool()) {
330 S->setLabelDecl(readDeclAs<LabelDecl>());
331 S->setLabelLoc(readSourceLocation());
332 }
333}
334
335void ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {
336 VisitLoopControlStmt(S);
337}
338
339void ASTStmtReader::VisitBreakStmt(BreakStmt *S) { VisitLoopControlStmt(S); }
340
341void ASTStmtReader::VisitDeferStmt(DeferStmt *S) {
342 VisitStmt(S);
343 S->setDeferLoc(readSourceLocation());
344 S->setBody(Record.readSubStmt());
345}
346
347void ASTStmtReader::VisitReturnStmt(ReturnStmt *S) {
348 VisitStmt(S);
349
350 bool HasNRVOCandidate = Record.readInt();
351
352 S->setRetValue(Record.readSubExpr());
353 if (HasNRVOCandidate)
354 S->setNRVOCandidate(readDeclAs<VarDecl>());
355
356 S->setReturnLoc(readSourceLocation());
357}
358
359void ASTStmtReader::VisitDeclStmt(DeclStmt *S) {
360 VisitStmt(S);
361 S->setStartLoc(readSourceLocation());
362 S->setEndLoc(readSourceLocation());
363
364 if (Record.size() - Record.getIdx() == 1) {
365 // Single declaration
366 S->setDeclGroup(DeclGroupRef(readDecl()));
367 } else {
368 SmallVector<Decl *, 16> Decls;
369 int N = Record.size() - Record.getIdx();
370 Decls.reserve(N);
371 for (int I = 0; I < N; ++I)
372 Decls.push_back(readDecl());
373 S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Record.getContext(),
374 Decls.data(),
375 Decls.size())));
376 }
377}
378
379void ASTStmtReader::VisitAsmStmt(AsmStmt *S) {
380 VisitStmt(S);
381 S->NumOutputs = Record.readInt();
382 S->NumInputs = Record.readInt();
383 S->NumClobbers = Record.readInt();
384 S->setAsmLoc(readSourceLocation());
385 S->setVolatile(Record.readInt());
386 S->setSimple(Record.readInt());
387}
388
389void ASTStmtReader::VisitGCCAsmStmt(GCCAsmStmt *S) {
390 VisitAsmStmt(S);
391 S->NumLabels = Record.readInt();
392 S->setRParenLoc(readSourceLocation());
393 S->setAsmStringExpr(cast_or_null<Expr>(Record.readSubStmt()));
394
395 unsigned NumOutputs = S->getNumOutputs();
396 unsigned NumInputs = S->getNumInputs();
397 unsigned NumClobbers = S->getNumClobbers();
398 unsigned NumLabels = S->getNumLabels();
399
400 // Outputs and inputs
401 SmallVector<IdentifierInfo *, 16> Names;
402 SmallVector<Expr *, 16> Constraints;
403 SmallVector<Stmt*, 16> Exprs;
404 for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {
405 Names.push_back(Record.readIdentifier());
406 Constraints.push_back(cast_or_null<Expr>(Record.readSubStmt()));
407 Exprs.push_back(Record.readSubStmt());
408 }
409
410 // Constraints
411 SmallVector<Expr *, 16> Clobbers;
412 for (unsigned I = 0; I != NumClobbers; ++I)
413 Clobbers.push_back(cast_or_null<Expr>(Record.readSubStmt()));
414
415 // Labels
416 for (unsigned I = 0, N = NumLabels; I != N; ++I) {
417 Names.push_back(Record.readIdentifier());
418 Exprs.push_back(Record.readSubStmt());
419 }
420
421 S->setOutputsAndInputsAndClobbers(Record.getContext(),
422 Names.data(), Constraints.data(),
423 Exprs.data(), NumOutputs, NumInputs,
424 NumLabels,
425 Clobbers.data(), NumClobbers);
426}
427
428void ASTStmtReader::VisitMSAsmStmt(MSAsmStmt *S) {
429 VisitAsmStmt(S);
430 S->LBraceLoc = readSourceLocation();
431 S->EndLoc = readSourceLocation();
432 S->NumAsmToks = Record.readInt();
433 std::string AsmStr = readString();
434
435 // Read the tokens.
436 SmallVector<Token, 16> AsmToks;
437 AsmToks.reserve(S->NumAsmToks);
438 for (unsigned i = 0, e = S->NumAsmToks; i != e; ++i) {
439 AsmToks.push_back(Record.readToken());
440 }
441
442 // The calls to reserve() for the FooData vectors are mandatory to
443 // prevent dead StringRefs in the Foo vectors.
444
445 // Read the clobbers.
446 SmallVector<std::string, 16> ClobbersData;
447 SmallVector<StringRef, 16> Clobbers;
448 ClobbersData.reserve(S->NumClobbers);
449 Clobbers.reserve(S->NumClobbers);
450 for (unsigned i = 0, e = S->NumClobbers; i != e; ++i) {
451 ClobbersData.push_back(readString());
452 Clobbers.push_back(ClobbersData.back());
453 }
454
455 // Read the operands.
456 unsigned NumOperands = S->NumOutputs + S->NumInputs;
457 SmallVector<Expr*, 16> Exprs;
458 SmallVector<std::string, 16> ConstraintsData;
459 SmallVector<StringRef, 16> Constraints;
460 Exprs.reserve(NumOperands);
461 ConstraintsData.reserve(NumOperands);
462 Constraints.reserve(NumOperands);
463 for (unsigned i = 0; i != NumOperands; ++i) {
464 Exprs.push_back(cast<Expr>(Record.readSubStmt()));
465 ConstraintsData.push_back(readString());
466 Constraints.push_back(ConstraintsData.back());
467 }
468
469 S->initialize(Record.getContext(), AsmStr, AsmToks,
470 Constraints, Exprs, Clobbers);
471}
472
473void ASTStmtReader::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {
474 VisitStmt(S);
475 assert(Record.peekInt() == S->NumParams);
476 Record.skipInts(1);
477 auto *StoredStmts = S->getStoredStmts();
478 for (unsigned i = 0;
479 i < CoroutineBodyStmt::SubStmt::FirstParamMove + S->NumParams; ++i)
480 StoredStmts[i] = Record.readSubStmt();
481}
482
483void ASTStmtReader::VisitCoreturnStmt(CoreturnStmt *S) {
484 VisitStmt(S);
485 S->CoreturnLoc = Record.readSourceLocation();
486 for (auto &SubStmt: S->SubStmts)
487 SubStmt = Record.readSubStmt();
488 S->IsImplicit = Record.readInt() != 0;
489}
490
491void ASTStmtReader::VisitCoawaitExpr(CoawaitExpr *E) {
492 VisitExpr(E);
493 E->KeywordLoc = readSourceLocation();
494 for (auto &SubExpr: E->SubExprs)
495 SubExpr = Record.readSubStmt();
496 E->OpaqueValue = cast_or_null<OpaqueValueExpr>(Record.readSubStmt());
497 E->setIsImplicit(Record.readInt() != 0);
498}
499
500void ASTStmtReader::VisitCoyieldExpr(CoyieldExpr *E) {
501 VisitExpr(E);
502 E->KeywordLoc = readSourceLocation();
503 for (auto &SubExpr: E->SubExprs)
504 SubExpr = Record.readSubStmt();
505 E->OpaqueValue = cast_or_null<OpaqueValueExpr>(Record.readSubStmt());
506}
507
508void ASTStmtReader::VisitDependentCoawaitExpr(DependentCoawaitExpr *E) {
509 VisitExpr(E);
510 E->KeywordLoc = readSourceLocation();
511 for (auto &SubExpr: E->SubExprs)
512 SubExpr = Record.readSubStmt();
513}
514
515void ASTStmtReader::VisitCapturedStmt(CapturedStmt *S) {
516 VisitStmt(S);
517 Record.skipInts(1);
518 S->setCapturedDecl(readDeclAs<CapturedDecl>());
519 S->setCapturedRegionKind(static_cast<CapturedRegionKind>(Record.readInt()));
520 S->setCapturedRecordDecl(readDeclAs<RecordDecl>());
521
522 // Capture inits
524 E = S->capture_init_end();
525 I != E; ++I)
526 *I = Record.readSubExpr();
527
528 // Body
529 S->setCapturedStmt(Record.readSubStmt());
531
532 // Captures
533 for (auto &I : S->captures()) {
534 I.VarAndKind.setPointer(readDeclAs<VarDecl>());
535 I.VarAndKind.setInt(
536 static_cast<CapturedStmt::VariableCaptureKind>(Record.readInt()));
537 I.Loc = readSourceLocation();
538 }
539}
540
541void ASTStmtReader::VisitCXXReflectExpr(CXXReflectExpr *E) {
542 // TODO(Reflection): Implement this.
543 assert(false && "not implemented yet");
544}
545
546void ASTStmtReader::VisitSYCLKernelCallStmt(SYCLKernelCallStmt *S) {
547 VisitStmt(S);
548 S->setOriginalStmt(cast<CompoundStmt>(Record.readSubStmt()));
549 S->setKernelLaunchStmt(cast<Stmt>(Record.readSubStmt()));
550 S->setOutlinedFunctionDecl(readDeclAs<OutlinedFunctionDecl>());
551}
552
553void ASTStmtReader::VisitExpr(Expr *E) {
554 VisitStmt(E);
555 CurrentUnpackingBits.emplace(Record.readInt());
556 E->setDependence(static_cast<ExprDependence>(
557 CurrentUnpackingBits->getNextBits(/*Width=*/5)));
558 E->setValueKind(static_cast<ExprValueKind>(
559 CurrentUnpackingBits->getNextBits(/*Width=*/2)));
560 E->setObjectKind(static_cast<ExprObjectKind>(
561 CurrentUnpackingBits->getNextBits(/*Width=*/3)));
562
563 E->setType(Record.readType());
564 assert(Record.getIdx() == NumExprFields &&
565 "Incorrect expression field count");
566}
567
568void ASTStmtReader::VisitConstantExpr(ConstantExpr *E) {
569 VisitExpr(E);
570
571 auto StorageKind = static_cast<ConstantResultStorageKind>(Record.readInt());
572 assert(E->getResultStorageKind() == StorageKind && "Wrong ResultKind!");
573
574 E->ConstantExprBits.APValueKind = Record.readInt();
575 E->ConstantExprBits.IsUnsigned = Record.readInt();
576 E->ConstantExprBits.BitWidth = Record.readInt();
577 E->ConstantExprBits.HasCleanup = false; // Not serialized, see below.
578 E->ConstantExprBits.IsImmediateInvocation = Record.readInt();
579
580 switch (StorageKind) {
582 break;
583
585 E->Int64Result() = Record.readInt();
586 break;
587
589 E->APValueResult() = Record.readAPValue();
590 if (E->APValueResult().needsCleanup()) {
591 E->ConstantExprBits.HasCleanup = true;
592 Record.getContext().addDestruction(&E->APValueResult());
593 }
594 break;
595 }
596
597 E->setSubExpr(Record.readSubExpr());
598}
599
600void ASTStmtReader::VisitOpenACCAsteriskSizeExpr(OpenACCAsteriskSizeExpr *E) {
601 VisitExpr(E);
602 E->setAsteriskLocation(readSourceLocation());
603}
604
605void ASTStmtReader::VisitSYCLUniqueStableNameExpr(SYCLUniqueStableNameExpr *E) {
606 VisitExpr(E);
607
608 E->setLocation(readSourceLocation());
609 E->setLParenLocation(readSourceLocation());
610 E->setRParenLocation(readSourceLocation());
611
612 E->setTypeSourceInfo(Record.readTypeSourceInfo());
613}
614
615void ASTStmtReader::VisitUnresolvedSYCLKernelCallStmt(
617 VisitStmt(S);
618
619 S->setOriginalStmt(cast<CompoundStmt>(Record.readSubStmt()));
620 S->setKernelLaunchIdExpr(Record.readExpr());
621}
622
623void ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {
624 VisitExpr(E);
625 bool HasFunctionName = Record.readInt();
626 E->PredefinedExprBits.HasFunctionName = HasFunctionName;
627 E->PredefinedExprBits.Kind = Record.readInt();
628 E->PredefinedExprBits.IsTransparent = Record.readInt();
629 E->setLocation(readSourceLocation());
630 if (HasFunctionName)
631 E->setFunctionName(cast<StringLiteral>(Record.readSubExpr()));
632}
633
634void ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {
635 VisitExpr(E);
636
637 CurrentUnpackingBits.emplace(Record.readInt());
638 E->DeclRefExprBits.HadMultipleCandidates = CurrentUnpackingBits->getNextBit();
639 E->DeclRefExprBits.RefersToEnclosingVariableOrCapture =
640 CurrentUnpackingBits->getNextBit();
641 E->DeclRefExprBits.NonOdrUseReason =
642 CurrentUnpackingBits->getNextBits(/*Width=*/2);
643 E->DeclRefExprBits.IsImmediateEscalating = CurrentUnpackingBits->getNextBit();
644 E->DeclRefExprBits.HasFoundDecl = CurrentUnpackingBits->getNextBit();
645 E->DeclRefExprBits.HasQualifier = CurrentUnpackingBits->getNextBit();
646 E->DeclRefExprBits.HasTemplateKWAndArgsInfo =
647 CurrentUnpackingBits->getNextBit();
648 E->DeclRefExprBits.CapturedByCopyInLambdaWithExplicitObjectParameter = false;
649 unsigned NumTemplateArgs = 0;
651 NumTemplateArgs = Record.readInt();
652
653 if (E->hasQualifier())
654 new (E->getTrailingObjects<NestedNameSpecifierLoc>())
655 NestedNameSpecifierLoc(Record.readNestedNameSpecifierLoc());
656
657 if (E->hasFoundDecl())
658 *E->getTrailingObjects<NamedDecl *>() = readDeclAs<NamedDecl>();
659
662 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
663 E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs);
664
665 E->D = readDeclAs<ValueDecl>();
666 E->setLocation(readSourceLocation());
667 E->DNLoc = Record.readDeclarationNameLoc(E->getDecl()->getDeclName());
668}
669
670void ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
671 VisitExpr(E);
672 E->setLocation(readSourceLocation());
673 E->setValue(Record.getContext(), Record.readAPInt());
674}
675
676void ASTStmtReader::VisitFixedPointLiteral(FixedPointLiteral *E) {
677 VisitExpr(E);
678 E->setLocation(readSourceLocation());
679 E->setScale(Record.readInt());
680 E->setValue(Record.getContext(), Record.readAPInt());
681}
682
683void ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {
684 VisitExpr(E);
686 static_cast<llvm::APFloatBase::Semantics>(Record.readInt()));
687 E->setExact(Record.readInt());
688 E->setValue(Record.getContext(), Record.readAPFloat(E->getSemantics()));
689 E->setLocation(readSourceLocation());
690}
691
692void ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
693 VisitExpr(E);
694 E->setSubExpr(Record.readSubExpr());
695}
696
697void ASTStmtReader::VisitStringLiteral(StringLiteral *E) {
698 VisitExpr(E);
699
700 // NumConcatenated, Length and CharByteWidth are set by the empty
701 // ctor since they are needed to allocate storage for the trailing objects.
702 unsigned NumConcatenated = Record.readInt();
703 unsigned Length = Record.readInt();
704 unsigned CharByteWidth = Record.readInt();
705 assert((NumConcatenated == E->getNumConcatenated()) &&
706 "Wrong number of concatenated tokens!");
707 assert((Length == E->getLength()) && "Wrong Length!");
708 assert((CharByteWidth == E->getCharByteWidth()) && "Wrong character width!");
709 E->StringLiteralBits.Kind = Record.readInt();
710 E->StringLiteralBits.IsPascal = Record.readInt();
711
712 // The character width is originally computed via mapCharByteWidth.
713 // Check that the deserialized character width is consistant with the result
714 // of calling mapCharByteWidth.
715 assert((CharByteWidth ==
716 StringLiteral::mapCharByteWidth(Record.getContext().getTargetInfo(),
717 E->getKind())) &&
718 "Wrong character width!");
719
720 // Deserialize the trailing array of SourceLocation.
721 for (unsigned I = 0; I < NumConcatenated; ++I)
722 E->setStrTokenLoc(I, readSourceLocation());
723
724 // Deserialize the trailing array of char holding the string data.
725 char *StrData = E->getStrDataAsChar();
726 for (unsigned I = 0; I < Length * CharByteWidth; ++I)
727 StrData[I] = Record.readInt();
728}
729
730void ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
731 VisitExpr(E);
732 E->setValue(Record.readInt());
733 E->setLocation(readSourceLocation());
734 E->setKind(static_cast<CharacterLiteralKind>(Record.readInt()));
735}
736
737void ASTStmtReader::VisitParenExpr(ParenExpr *E) {
738 VisitExpr(E);
739 E->setIsProducedByFoldExpansion(Record.readInt());
740 E->setLParen(readSourceLocation());
741 E->setRParen(readSourceLocation());
742 E->setSubExpr(Record.readSubExpr());
743}
744
745void ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {
746 VisitExpr(E);
747 unsigned NumExprs = Record.readInt();
748 assert((NumExprs == E->getNumExprs()) && "Wrong NumExprs!");
749 for (unsigned I = 0; I != NumExprs; ++I)
750 E->getTrailingObjects()[I] = Record.readSubStmt();
751 E->LParenLoc = readSourceLocation();
752 E->RParenLoc = readSourceLocation();
753}
754
755void ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {
756 VisitExpr(E);
757 bool hasFP_Features = CurrentUnpackingBits->getNextBit();
758 assert(hasFP_Features == E->hasStoredFPFeatures());
759 E->setSubExpr(Record.readSubExpr());
760 E->setOpcode(
761 (UnaryOperator::Opcode)CurrentUnpackingBits->getNextBits(/*Width=*/5));
762 E->setOperatorLoc(readSourceLocation());
763 E->setCanOverflow(CurrentUnpackingBits->getNextBit());
764 if (hasFP_Features)
766 FPOptionsOverride::getFromOpaqueInt(Record.readInt()));
767}
768
769void ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
770 VisitExpr(E);
771 assert(E->getNumComponents() == Record.peekInt());
772 Record.skipInts(1);
773 assert(E->getNumExpressions() == Record.peekInt());
774 Record.skipInts(1);
775 E->setOperatorLoc(readSourceLocation());
776 E->setRParenLoc(readSourceLocation());
777 E->setTypeSourceInfo(readTypeSourceInfo());
778 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
779 auto Kind = static_cast<OffsetOfNode::Kind>(Record.readInt());
780 SourceLocation Start = readSourceLocation();
781 SourceLocation End = readSourceLocation();
782 switch (Kind) {
784 E->setComponent(I, OffsetOfNode(Start, Record.readInt(), End));
785 break;
786
788 E->setComponent(
789 I, OffsetOfNode(Start, readDeclAs<FieldDecl>(), End));
790 break;
791
793 E->setComponent(
794 I,
795 OffsetOfNode(Start, Record.readIdentifier(), End));
796 break;
797
798 case OffsetOfNode::Base: {
799 auto *Base = new (Record.getContext()) CXXBaseSpecifier();
800 *Base = Record.readCXXBaseSpecifier();
801 E->setComponent(I, OffsetOfNode(Base));
802 break;
803 }
804 }
805 }
806
807 for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
808 E->setIndexExpr(I, Record.readSubExpr());
809}
810
811void ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
812 VisitExpr(E);
813 E->setKind(static_cast<UnaryExprOrTypeTrait>(Record.readInt()));
814 if (Record.peekInt() == 0) {
815 E->setArgument(Record.readSubExpr());
816 Record.skipInts(1);
817 } else {
818 E->setArgument(readTypeSourceInfo());
819 }
820 E->setOperatorLoc(readSourceLocation());
821 E->setRParenLoc(readSourceLocation());
822}
823
826 ConstraintSatisfaction Satisfaction;
827 Satisfaction.IsSatisfied = Record.readInt();
828 Satisfaction.ContainsErrors = Record.readInt();
829 const ASTContext &C = Record.getContext();
830 if (!Satisfaction.IsSatisfied) {
831 unsigned NumDetailRecords = Record.readInt();
832 for (unsigned i = 0; i != NumDetailRecords; ++i) {
833 auto Kind = Record.readInt();
834 if (Kind == 0) {
835 SourceLocation DiagLocation = Record.readSourceLocation();
836 StringRef DiagMessage = C.backupStr(Record.readString());
837
838 Satisfaction.Details.emplace_back(new (
839 C) ConstraintSubstitutionDiagnostic(DiagLocation, DiagMessage));
840 } else if (Kind == 1) {
841 Satisfaction.Details.emplace_back(Record.readExpr());
842 } else {
843 assert(Kind == 2);
844 Satisfaction.Details.emplace_back(Record.readConceptReference());
845 }
846 }
847 }
848 return Satisfaction;
849}
850
851void ASTStmtReader::VisitConceptSpecializationExpr(
853 VisitExpr(E);
854 E->SpecDecl = Record.readDeclAs<ImplicitConceptSpecializationDecl>();
855 if (Record.readBool())
856 E->ConceptRef = Record.readConceptReference();
857 E->Satisfaction = E->isValueDependent() ? nullptr :
858 ASTConstraintSatisfaction::Create(Record.getContext(),
860}
861
864 const ASTContext &C = Record.getContext();
865 StringRef SubstitutedEntity = C.backupStr(Record.readString());
866 SourceLocation DiagLoc = Record.readSourceLocation();
867 StringRef DiagMessage = C.backupStr(Record.readString());
868
869 return new (Record.getContext())
870 concepts::Requirement::SubstitutionDiagnostic{SubstitutedEntity, DiagLoc,
871 DiagMessage};
872}
873
874void ASTStmtReader::VisitRequiresExpr(RequiresExpr *E) {
875 VisitExpr(E);
876 unsigned NumLocalParameters = Record.readInt();
877 unsigned NumRequirements = Record.readInt();
878 E->RequiresExprBits.RequiresKWLoc = Record.readSourceLocation();
879 E->RequiresExprBits.IsSatisfied = Record.readInt();
880 E->Body = Record.readDeclAs<RequiresExprBodyDecl>();
881 llvm::SmallVector<ParmVarDecl *, 4> LocalParameters;
882 for (unsigned i = 0; i < NumLocalParameters; ++i)
883 LocalParameters.push_back(cast<ParmVarDecl>(Record.readDecl()));
884 std::copy(LocalParameters.begin(), LocalParameters.end(),
885 E->getTrailingObjects<ParmVarDecl *>());
886 llvm::SmallVector<concepts::Requirement *, 4> Requirements;
887 for (unsigned i = 0; i < NumRequirements; ++i) {
888 auto RK =
889 static_cast<concepts::Requirement::RequirementKind>(Record.readInt());
890 concepts::Requirement *R = nullptr;
891 switch (RK) {
893 auto Status =
895 Record.readInt());
897 R = new (Record.getContext())
898 concepts::TypeRequirement(readSubstitutionDiagnostic(Record));
899 else
900 R = new (Record.getContext())
901 concepts::TypeRequirement(Record.readTypeSourceInfo());
902 } break;
905 auto Status =
907 Record.readInt());
908 llvm::PointerUnion<concepts::Requirement::SubstitutionDiagnostic *,
909 Expr *> E;
911 E = readSubstitutionDiagnostic(Record);
912 } else
913 E = Record.readExpr();
914
915 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> Req;
916 ConceptSpecializationExpr *SubstitutedConstraintExpr = nullptr;
917 SourceLocation NoexceptLoc;
919 Req.emplace();
920 } else {
921 NoexceptLoc = Record.readSourceLocation();
922 switch (/* returnTypeRequirementKind */Record.readInt()) {
923 case 0:
924 // No return type requirement.
925 Req.emplace();
926 break;
927 case 1: {
928 // type-constraint
929 TemplateParameterList *TPL = Record.readTemplateParameterList();
930 if (Status >=
932 SubstitutedConstraintExpr =
933 cast<ConceptSpecializationExpr>(Record.readExpr());
934 Req.emplace(TPL);
935 } break;
936 case 2:
937 // Substitution failure
938 Req.emplace(readSubstitutionDiagnostic(Record));
939 break;
940 }
941 }
942 if (Expr *Ex = E.dyn_cast<Expr *>())
943 R = new (Record.getContext()) concepts::ExprRequirement(
944 Ex, RK == concepts::Requirement::RK_Simple, NoexceptLoc,
945 std::move(*Req), Status, SubstitutedConstraintExpr);
946 else
947 R = new (Record.getContext()) concepts::ExprRequirement(
949 RK == concepts::Requirement::RK_Simple, NoexceptLoc,
950 std::move(*Req));
951 } break;
953 ASTContext &C = Record.getContext();
954 bool HasInvalidConstraint = Record.readInt();
955 if (HasInvalidConstraint) {
956 StringRef InvalidConstraint = C.backupStr(Record.readString());
957 R = new (C) concepts::NestedRequirement(
958 Record.getContext(), InvalidConstraint,
960 break;
961 }
962 Expr *E = Record.readExpr();
964 R = new (C) concepts::NestedRequirement(E);
965 else
966 R = new (C) concepts::NestedRequirement(
967 C, E, readConstraintSatisfaction(Record));
968 } break;
969 }
970 if (!R)
971 continue;
972 Requirements.push_back(R);
973 }
974 std::copy(Requirements.begin(), Requirements.end(),
975 E->getTrailingObjects<concepts::Requirement *>());
976 E->LParenLoc = Record.readSourceLocation();
977 E->RParenLoc = Record.readSourceLocation();
978 E->RBraceLoc = Record.readSourceLocation();
979}
980
981void ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
982 VisitExpr(E);
983 E->setLHS(Record.readSubExpr());
984 E->setRHS(Record.readSubExpr());
985 E->setRBracketLoc(readSourceLocation());
986}
987
988void ASTStmtReader::VisitMatrixSingleSubscriptExpr(
990 VisitExpr(E);
991 E->setBase(Record.readSubExpr());
992 E->setRowIdx(Record.readSubExpr());
993 E->setRBracketLoc(readSourceLocation());
994}
995
996void ASTStmtReader::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
997 VisitExpr(E);
998 E->setBase(Record.readSubExpr());
999 E->setRowIdx(Record.readSubExpr());
1000 E->setColumnIdx(Record.readSubExpr());
1001 E->setRBracketLoc(readSourceLocation());
1002}
1003
1004void ASTStmtReader::VisitArraySectionExpr(ArraySectionExpr *E) {
1005 VisitExpr(E);
1006 E->ASType = Record.readEnum<ArraySectionExpr::ArraySectionType>();
1007
1008 E->setBase(Record.readSubExpr());
1009 E->setLowerBound(Record.readSubExpr());
1010 E->setLength(Record.readSubExpr());
1011
1012 if (E->isOMPArraySection())
1013 E->setStride(Record.readSubExpr());
1014
1015 E->setColonLocFirst(readSourceLocation());
1016
1017 if (E->isOMPArraySection())
1018 E->setColonLocSecond(readSourceLocation());
1019
1020 E->setRBracketLoc(readSourceLocation());
1021}
1022
1023void ASTStmtReader::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
1024 VisitExpr(E);
1025 unsigned NumDims = Record.readInt();
1026 E->setBase(Record.readSubExpr());
1027 SmallVector<Expr *, 4> Dims(NumDims);
1028 for (unsigned I = 0; I < NumDims; ++I)
1029 Dims[I] = Record.readSubExpr();
1030 E->setDimensions(Dims);
1031 SmallVector<SourceRange, 4> SRs(NumDims);
1032 for (unsigned I = 0; I < NumDims; ++I)
1033 SRs[I] = readSourceRange();
1034 E->setBracketsRanges(SRs);
1035 E->setLParenLoc(readSourceLocation());
1036 E->setRParenLoc(readSourceLocation());
1037}
1038
1039void ASTStmtReader::VisitOMPIteratorExpr(OMPIteratorExpr *E) {
1040 VisitExpr(E);
1041 unsigned NumIters = Record.readInt();
1042 E->setIteratorKwLoc(readSourceLocation());
1043 E->setLParenLoc(readSourceLocation());
1044 E->setRParenLoc(readSourceLocation());
1045 for (unsigned I = 0; I < NumIters; ++I) {
1046 E->setIteratorDeclaration(I, Record.readDeclRef());
1047 E->setAssignmentLoc(I, readSourceLocation());
1048 Expr *Begin = Record.readSubExpr();
1049 Expr *End = Record.readSubExpr();
1050 Expr *Step = Record.readSubExpr();
1051 SourceLocation ColonLoc = readSourceLocation();
1052 SourceLocation SecColonLoc;
1053 if (Step)
1054 SecColonLoc = readSourceLocation();
1055 E->setIteratorRange(I, Begin, ColonLoc, End, SecColonLoc, Step);
1056 // Deserialize helpers
1057 OMPIteratorHelperData HD;
1058 HD.CounterVD = cast_or_null<VarDecl>(Record.readDeclRef());
1059 HD.Upper = Record.readSubExpr();
1060 HD.Update = Record.readSubExpr();
1061 HD.CounterUpdate = Record.readSubExpr();
1062 E->setHelper(I, HD);
1063 }
1064}
1065
1066void ASTStmtReader::VisitCallExpr(CallExpr *E) {
1067 VisitExpr(E);
1068
1069 unsigned NumArgs = Record.readInt();
1070 CurrentUnpackingBits.emplace(Record.readInt());
1071 E->setADLCallKind(
1072 static_cast<CallExpr::ADLCallKind>(CurrentUnpackingBits->getNextBit()));
1073 bool HasFPFeatures = CurrentUnpackingBits->getNextBit();
1074 E->setCoroElideSafe(CurrentUnpackingBits->getNextBit());
1075 E->setUsesMemberSyntax(CurrentUnpackingBits->getNextBit());
1076 assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!");
1077 E->setRParenLoc(readSourceLocation());
1078 E->setCallee(Record.readSubExpr());
1079 for (unsigned I = 0; I != NumArgs; ++I)
1080 E->setArg(I, Record.readSubExpr());
1081
1082 if (HasFPFeatures)
1084 FPOptionsOverride::getFromOpaqueInt(Record.readInt()));
1085
1086 if (E->getStmtClass() == Stmt::CallExprClass)
1087 E->updateTrailingSourceLoc();
1088}
1089
1090void ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
1091 VisitCallExpr(E);
1092}
1093
1094void ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
1095 VisitExpr(E);
1096
1097 CurrentUnpackingBits.emplace(Record.readInt());
1098 bool HasQualifier = CurrentUnpackingBits->getNextBit();
1099 bool HasFoundDecl = CurrentUnpackingBits->getNextBit();
1100 bool HasTemplateInfo = CurrentUnpackingBits->getNextBit();
1101 unsigned NumTemplateArgs = Record.readInt();
1102
1103 E->Base = Record.readSubExpr();
1104 E->MemberDecl = Record.readDeclAs<ValueDecl>();
1105 E->MemberDNLoc = Record.readDeclarationNameLoc(E->MemberDecl->getDeclName());
1106 E->MemberLoc = Record.readSourceLocation();
1107 E->MemberExprBits.IsArrow = CurrentUnpackingBits->getNextBit();
1108 E->MemberExprBits.HasQualifier = HasQualifier;
1109 E->MemberExprBits.HasFoundDecl = HasFoundDecl;
1110 E->MemberExprBits.HasTemplateKWAndArgsInfo = HasTemplateInfo;
1111 E->MemberExprBits.HadMultipleCandidates = CurrentUnpackingBits->getNextBit();
1112 E->MemberExprBits.NonOdrUseReason =
1113 CurrentUnpackingBits->getNextBits(/*Width=*/2);
1114 E->MemberExprBits.OperatorLoc = Record.readSourceLocation();
1115
1116 if (HasQualifier)
1117 new (E->getTrailingObjects<NestedNameSpecifierLoc>())
1118 NestedNameSpecifierLoc(Record.readNestedNameSpecifierLoc());
1119
1120 if (HasFoundDecl) {
1121 auto *FoundD = Record.readDeclAs<NamedDecl>();
1122 auto AS = (AccessSpecifier)CurrentUnpackingBits->getNextBits(/*Width=*/2);
1123 *E->getTrailingObjects<DeclAccessPair>() = DeclAccessPair::make(FoundD, AS);
1124 }
1125
1126 if (HasTemplateInfo)
1128 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
1129 E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs);
1130}
1131
1132void ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
1133 VisitExpr(E);
1134 E->setBase(Record.readSubExpr());
1135 E->setIsaMemberLoc(readSourceLocation());
1136 E->setOpLoc(readSourceLocation());
1137 E->setArrow(Record.readInt());
1138}
1139
1140void ASTStmtReader::
1141VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
1142 VisitExpr(E);
1143 E->Operand = Record.readSubExpr();
1144 E->setShouldCopy(Record.readInt());
1145}
1146
1147void ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
1148 VisitExplicitCastExpr(E);
1149 E->LParenLoc = readSourceLocation();
1150 E->BridgeKeywordLoc = readSourceLocation();
1151 E->Kind = Record.readInt();
1152}
1153
1154void ASTStmtReader::VisitCastExpr(CastExpr *E) {
1155 VisitExpr(E);
1156 unsigned NumBaseSpecs = Record.readInt();
1157 assert(NumBaseSpecs == E->path_size());
1158
1159 CurrentUnpackingBits.emplace(Record.readInt());
1160 E->setCastKind((CastKind)CurrentUnpackingBits->getNextBits(/*Width=*/7));
1161 unsigned HasFPFeatures = CurrentUnpackingBits->getNextBit();
1162 assert(E->hasStoredFPFeatures() == HasFPFeatures);
1163
1164 E->setSubExpr(Record.readSubExpr());
1165
1167 while (NumBaseSpecs--) {
1168 auto *BaseSpec = new (Record.getContext()) CXXBaseSpecifier;
1169 *BaseSpec = Record.readCXXBaseSpecifier();
1170 *BaseI++ = BaseSpec;
1171 }
1172 if (HasFPFeatures)
1173 *E->getTrailingFPFeatures() =
1174 FPOptionsOverride::getFromOpaqueInt(Record.readInt());
1175}
1176
1177void ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {
1178 VisitExpr(E);
1179 CurrentUnpackingBits.emplace(Record.readInt());
1180 E->setOpcode(
1181 (BinaryOperator::Opcode)CurrentUnpackingBits->getNextBits(/*Width=*/6));
1182 bool hasFP_Features = CurrentUnpackingBits->getNextBit();
1183 E->setHasStoredFPFeatures(hasFP_Features);
1184 E->setExcludedOverflowPattern(CurrentUnpackingBits->getNextBit());
1185 E->setLHS(Record.readSubExpr());
1186 E->setRHS(Record.readSubExpr());
1187 E->setOperatorLoc(readSourceLocation());
1188 if (hasFP_Features)
1190 FPOptionsOverride::getFromOpaqueInt(Record.readInt()));
1191}
1192
1193void ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
1194 VisitBinaryOperator(E);
1195 E->setComputationLHSType(Record.readType());
1196 E->setComputationResultType(Record.readType());
1197}
1198
1199void ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
1200 VisitExpr(E);
1201 E->SubExprs[ConditionalOperator::COND] = Record.readSubExpr();
1202 E->SubExprs[ConditionalOperator::LHS] = Record.readSubExpr();
1203 E->SubExprs[ConditionalOperator::RHS] = Record.readSubExpr();
1204 E->QuestionLoc = readSourceLocation();
1205 E->ColonLoc = readSourceLocation();
1206}
1207
1208void
1209ASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
1210 VisitExpr(E);
1211 E->OpaqueValue = cast<OpaqueValueExpr>(Record.readSubExpr());
1212 E->SubExprs[BinaryConditionalOperator::COMMON] = Record.readSubExpr();
1213 E->SubExprs[BinaryConditionalOperator::COND] = Record.readSubExpr();
1214 E->SubExprs[BinaryConditionalOperator::LHS] = Record.readSubExpr();
1215 E->SubExprs[BinaryConditionalOperator::RHS] = Record.readSubExpr();
1216 E->QuestionLoc = readSourceLocation();
1217 E->ColonLoc = readSourceLocation();
1218}
1219
1220void ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
1221 VisitCastExpr(E);
1222 E->setIsPartOfExplicitCast(CurrentUnpackingBits->getNextBit());
1223}
1224
1225void ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
1226 VisitCastExpr(E);
1227 E->setTypeInfoAsWritten(readTypeSourceInfo());
1228}
1229
1230void ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
1231 VisitExplicitCastExpr(E);
1232 E->setLParenLoc(readSourceLocation());
1233 E->setRParenLoc(readSourceLocation());
1234}
1235
1236void ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
1237 VisitExpr(E);
1238 E->setLParenLoc(readSourceLocation());
1239 E->setTypeSourceInfo(readTypeSourceInfo());
1240 E->setInitializer(Record.readSubExpr());
1241 E->setFileScope(Record.readInt());
1242}
1243
1244void ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
1245 VisitExpr(E);
1246 E->setBase(Record.readSubExpr());
1247 E->setAccessor(Record.readIdentifier());
1248 E->setAccessorLoc(readSourceLocation());
1249}
1250
1251void ASTStmtReader::VisitMatrixElementExpr(MatrixElementExpr *E) {
1252 VisitExpr(E);
1253 E->setBase(Record.readSubExpr());
1254 E->setAccessor(Record.readIdentifier());
1255 E->setAccessorLoc(readSourceLocation());
1256}
1257
1258void ASTStmtReader::VisitInitListExpr(InitListExpr *E) {
1259 VisitExpr(E);
1260 if (auto *SyntForm = cast_or_null<InitListExpr>(Record.readSubStmt()))
1261 E->setSyntacticForm(SyntForm);
1262 E->setLBraceLoc(readSourceLocation());
1263 E->setRBraceLoc(readSourceLocation());
1264 bool isArrayFiller = Record.readInt();
1265 Expr *filler = nullptr;
1266 if (isArrayFiller) {
1267 filler = Record.readSubExpr();
1268 E->ArrayFillerOrUnionFieldInit = filler;
1269 } else
1270 E->ArrayFillerOrUnionFieldInit = readDeclAs<FieldDecl>();
1271 E->sawArrayRangeDesignator(Record.readInt());
1272 unsigned NumInits = Record.readInt();
1273 E->reserveInits(Record.getContext(), NumInits);
1274 if (isArrayFiller) {
1275 for (unsigned I = 0; I != NumInits; ++I) {
1276 Expr *init = Record.readSubExpr();
1277 E->updateInit(Record.getContext(), I, init ? init : filler);
1278 }
1279 } else {
1280 for (unsigned I = 0; I != NumInits; ++I)
1281 E->updateInit(Record.getContext(), I, Record.readSubExpr());
1282 }
1283 E->InitListExprBits.IsExplicit = Record.readBool();
1284}
1285
1286void ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
1287 using Designator = DesignatedInitExpr::Designator;
1288
1289 VisitExpr(E);
1290 unsigned NumSubExprs = Record.readInt();
1291 assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
1292 for (unsigned I = 0; I != NumSubExprs; ++I)
1293 E->setSubExpr(I, Record.readSubExpr());
1294 E->setEqualOrColonLoc(readSourceLocation());
1295 E->setGNUSyntax(Record.readInt());
1296
1297 SmallVector<Designator, 4> Designators;
1298 while (Record.getIdx() < Record.size()) {
1299 switch ((DesignatorTypes)Record.readInt()) {
1300 case DESIG_FIELD_DECL: {
1301 auto *Field = readDeclAs<FieldDecl>();
1302 SourceLocation DotLoc = readSourceLocation();
1303 SourceLocation FieldLoc = readSourceLocation();
1304 Designators.push_back(Designator::CreateFieldDesignator(
1305 Field->getIdentifier(), DotLoc, FieldLoc));
1306 Designators.back().setFieldDecl(Field);
1307 break;
1308 }
1309
1310 case DESIG_FIELD_NAME: {
1311 const IdentifierInfo *Name = Record.readIdentifier();
1312 SourceLocation DotLoc = readSourceLocation();
1313 SourceLocation FieldLoc = readSourceLocation();
1314 Designators.push_back(Designator::CreateFieldDesignator(Name, DotLoc,
1315 FieldLoc));
1316 break;
1317 }
1318
1319 case DESIG_ARRAY: {
1320 unsigned Index = Record.readInt();
1321 SourceLocation LBracketLoc = readSourceLocation();
1322 SourceLocation RBracketLoc = readSourceLocation();
1323 Designators.push_back(Designator::CreateArrayDesignator(Index,
1324 LBracketLoc,
1325 RBracketLoc));
1326 break;
1327 }
1328
1329 case DESIG_ARRAY_RANGE: {
1330 unsigned Index = Record.readInt();
1331 SourceLocation LBracketLoc = readSourceLocation();
1332 SourceLocation EllipsisLoc = readSourceLocation();
1333 SourceLocation RBracketLoc = readSourceLocation();
1334 Designators.push_back(Designator::CreateArrayRangeDesignator(
1335 Index, LBracketLoc, EllipsisLoc, RBracketLoc));
1336 break;
1337 }
1338 }
1339 }
1340 E->setDesignators(Record.getContext(),
1341 Designators.data(), Designators.size());
1342}
1343
1344void ASTStmtReader::VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {
1345 VisitExpr(E);
1346 E->setBase(Record.readSubExpr());
1347 E->setUpdater(Record.readSubExpr());
1348}
1349
1350void ASTStmtReader::VisitNoInitExpr(NoInitExpr *E) {
1351 VisitExpr(E);
1352}
1353
1354void ASTStmtReader::VisitArrayInitLoopExpr(ArrayInitLoopExpr *E) {
1355 VisitExpr(E);
1356 E->SubExprs[0] = Record.readSubExpr();
1357 E->SubExprs[1] = Record.readSubExpr();
1358}
1359
1360void ASTStmtReader::VisitArrayInitIndexExpr(ArrayInitIndexExpr *E) {
1361 VisitExpr(E);
1362}
1363
1364void ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
1365 VisitExpr(E);
1366}
1367
1368void ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {
1369 VisitExpr(E);
1370 E->setSubExpr(Record.readSubExpr());
1371 E->setWrittenTypeInfo(readTypeSourceInfo());
1372 E->setBuiltinLoc(readSourceLocation());
1373 E->setRParenLoc(readSourceLocation());
1374 E->setVarargABI(static_cast<clang::VAArgExpr::VarArgKind>(Record.readInt()));
1375}
1376
1377void ASTStmtReader::VisitSourceLocExpr(SourceLocExpr *E) {
1378 VisitExpr(E);
1379 E->ParentContext = readDeclAs<DeclContext>();
1380 E->BuiltinLoc = readSourceLocation();
1381 E->RParenLoc = readSourceLocation();
1382 E->SourceLocExprBits.Kind = Record.readInt();
1383}
1384
1385void ASTStmtReader::VisitEmbedExpr(EmbedExpr *E) {
1386 VisitExpr(E);
1387 E->EmbedKeywordLoc = readSourceLocation();
1388 EmbedDataStorage *Data = new (Record.getContext()) EmbedDataStorage;
1389 Data->BinaryData = cast<StringLiteral>(Record.readSubStmt());
1390 E->Data = Data;
1391 E->Begin = Record.readUInt32();
1392 E->NumOfElements = Record.readUInt32();
1393 ASTContext &Ctx = Record.getContext();
1394 E->Ctx = &Ctx;
1395 E->setType(Ctx.IntTy);
1396 E->FakeChildNode = IntegerLiteral::Create(
1397 Ctx, llvm::APInt::getZero(Ctx.getTypeSize(E->getType())), E->getType(),
1398 E->EmbedKeywordLoc);
1399}
1400
1401void ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
1402 VisitExpr(E);
1403 E->setAmpAmpLoc(readSourceLocation());
1404 E->setLabelLoc(readSourceLocation());
1405 E->setLabel(readDeclAs<LabelDecl>());
1406}
1407
1408void ASTStmtReader::VisitStmtExpr(StmtExpr *E) {
1409 VisitExpr(E);
1410 E->setLParenLoc(readSourceLocation());
1411 E->setRParenLoc(readSourceLocation());
1412 E->setSubStmt(cast_or_null<CompoundStmt>(Record.readSubStmt()));
1413 E->StmtExprBits.TemplateDepth = Record.readInt();
1414}
1415
1416void ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {
1417 VisitExpr(E);
1418 E->setCond(Record.readSubExpr());
1419 E->setLHS(Record.readSubExpr());
1420 E->setRHS(Record.readSubExpr());
1421 E->setBuiltinLoc(readSourceLocation());
1422 E->setRParenLoc(readSourceLocation());
1423 E->setIsConditionTrue(Record.readInt());
1424}
1425
1426void ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
1427 VisitExpr(E);
1428 E->setTokenLocation(readSourceLocation());
1429}
1430
1431void ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
1432 VisitExpr(E);
1433 SmallVector<Expr *, 16> Exprs;
1434 unsigned NumExprs = Record.readInt();
1435 while (NumExprs--)
1436 Exprs.push_back(Record.readSubExpr());
1437 E->setExprs(Record.getContext(), Exprs);
1438 E->setBuiltinLoc(readSourceLocation());
1439 E->setRParenLoc(readSourceLocation());
1440}
1441
1442void ASTStmtReader::VisitConvertVectorExpr(ConvertVectorExpr *E) {
1443 VisitExpr(E);
1444 bool HasFPFeatures = CurrentUnpackingBits->getNextBit();
1445 assert(HasFPFeatures == E->hasStoredFPFeatures());
1446 E->BuiltinLoc = readSourceLocation();
1447 E->RParenLoc = readSourceLocation();
1448 E->TInfo = readTypeSourceInfo();
1449 E->SrcExpr = Record.readSubExpr();
1450 if (HasFPFeatures)
1452 FPOptionsOverride::getFromOpaqueInt(Record.readInt()));
1453}
1454
1455void ASTStmtReader::VisitBlockExpr(BlockExpr *E) {
1456 VisitExpr(E);
1457 E->setBlockDecl(readDeclAs<BlockDecl>());
1458}
1459
1460void ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
1461 VisitExpr(E);
1462
1463 unsigned NumAssocs = Record.readInt();
1464 assert(NumAssocs == E->getNumAssocs() && "Wrong NumAssocs!");
1465 E->IsExprPredicate = Record.readInt();
1466 E->ResultIndex = Record.readInt();
1467 E->GenericSelectionExprBits.GenericLoc = readSourceLocation();
1468 E->DefaultLoc = readSourceLocation();
1469 E->RParenLoc = readSourceLocation();
1470
1471 // During serialization, either one more Stmt or one more
1472 // TypeSourceInfo was encoded to account for the predicate
1473 // (whether it was an expression or a type).
1474 Stmt **Stmts = E->getTrailingObjects<Stmt *>();
1475 for (unsigned I = 0, N = NumAssocs + (E->IsExprPredicate ? 1 : 0); I < N; ++I)
1476 Stmts[I] = Record.readSubExpr();
1477
1478 TypeSourceInfo **TSIs = E->getTrailingObjects<TypeSourceInfo *>();
1479 for (unsigned I = 0, N = NumAssocs + (!E->IsExprPredicate ? 1 : 0); I < N;
1480 ++I)
1481 TSIs[I] = readTypeSourceInfo();
1482}
1483
1484void ASTStmtReader::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
1485 VisitExpr(E);
1486 unsigned numSemanticExprs = Record.readInt();
1487 assert(numSemanticExprs + 1 == E->PseudoObjectExprBits.NumSubExprs);
1488 E->PseudoObjectExprBits.ResultIndex = Record.readInt();
1489
1490 // Read the syntactic expression.
1491 E->getTrailingObjects()[0] = Record.readSubExpr();
1492
1493 // Read all the semantic expressions.
1494 for (unsigned i = 0; i != numSemanticExprs; ++i) {
1495 Expr *subExpr = Record.readSubExpr();
1496 E->getTrailingObjects()[i + 1] = subExpr;
1497 }
1498}
1499
1500void ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) {
1501 VisitExpr(E);
1502 E->Op = AtomicExpr::AtomicOp(Record.readInt());
1503 E->NumSubExprs = AtomicExpr::getNumSubExprs(E->Op);
1504 for (unsigned I = 0; I != E->NumSubExprs; ++I)
1505 E->SubExprs[I] = Record.readSubExpr();
1506 E->BuiltinLoc = readSourceLocation();
1507 E->RParenLoc = readSourceLocation();
1508}
1509
1510//===----------------------------------------------------------------------===//
1511// Objective-C Expressions and Statements
1512
1513void ASTStmtReader::VisitObjCObjectLiteral(ObjCObjectLiteral *E) {
1514 VisitExpr(E);
1515 E->setExpressibleAsConstantInitializer(Record.readInt());
1516}
1517
1518void ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
1519 VisitObjCObjectLiteral(E);
1520 E->setString(cast<StringLiteral>(Record.readSubStmt()));
1521 E->setAtLoc(readSourceLocation());
1522}
1523
1524void ASTStmtReader::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
1525 VisitObjCObjectLiteral(E);
1526 // could be one of several IntegerLiteral, FloatLiteral, etc.
1527 E->SubExpr = Record.readSubStmt();
1528 E->BoxingMethod = readDeclAs<ObjCMethodDecl>();
1529 E->Range = readSourceRange();
1530}
1531
1532void ASTStmtReader::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
1533 VisitObjCObjectLiteral(E);
1534 unsigned NumElements = Record.readInt();
1535 assert(NumElements == E->getNumElements() && "Wrong number of elements");
1536 Expr **Elements = E->getElements();
1537 for (unsigned I = 0, N = NumElements; I != N; ++I)
1538 Elements[I] = Record.readSubExpr();
1539 E->ArrayWithObjectsMethod = readDeclAs<ObjCMethodDecl>();
1540 E->Range = readSourceRange();
1541}
1542
1543void ASTStmtReader::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
1544 VisitObjCObjectLiteral(E);
1545 unsigned NumElements = Record.readInt();
1546 assert(NumElements == E->getNumElements() && "Wrong number of elements");
1547 bool HasPackExpansions = Record.readInt();
1548 assert(HasPackExpansions == E->HasPackExpansions &&"Pack expansion mismatch");
1549 auto *KeyValues =
1550 E->getTrailingObjects<ObjCDictionaryLiteral::KeyValuePair>();
1551 auto *Expansions =
1552 E->getTrailingObjects<ObjCDictionaryLiteral::ExpansionData>();
1553 for (unsigned I = 0; I != NumElements; ++I) {
1554 KeyValues[I].Key = Record.readSubExpr();
1555 KeyValues[I].Value = Record.readSubExpr();
1556 if (HasPackExpansions) {
1557 Expansions[I].EllipsisLoc = readSourceLocation();
1558 Expansions[I].NumExpansionsPlusOne = Record.readInt();
1559 }
1560 }
1561 E->DictWithObjectsMethod = readDeclAs<ObjCMethodDecl>();
1562 E->Range = readSourceRange();
1563}
1564
1565void ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1566 VisitExpr(E);
1567 E->setEncodedTypeSourceInfo(readTypeSourceInfo());
1568 E->setAtLoc(readSourceLocation());
1569 E->setRParenLoc(readSourceLocation());
1570}
1571
1572void ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
1573 VisitExpr(E);
1574 E->setSelector(Record.readSelector());
1575 E->setAtLoc(readSourceLocation());
1576 E->setSelectorNameLoc(readSourceLocation());
1577 E->setRParenLoc(readSourceLocation());
1578}
1579
1580void ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
1581 VisitExpr(E);
1582 E->setProtocol(readDeclAs<ObjCProtocolDecl>());
1583 E->setAtLoc(readSourceLocation());
1584 E->ProtoLoc = readSourceLocation();
1585 E->setRParenLoc(readSourceLocation());
1586}
1587
1588void ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1589 VisitExpr(E);
1590 E->setDecl(readDeclAs<ObjCIvarDecl>());
1591 E->setLocation(readSourceLocation());
1592 E->setOpLoc(readSourceLocation());
1593 E->setBase(Record.readSubExpr());
1594 E->setIsArrow(Record.readInt());
1595 E->setIsFreeIvar(Record.readInt());
1596}
1597
1598void ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1599 VisitExpr(E);
1600 unsigned MethodRefFlags = Record.readInt();
1601 bool Implicit = Record.readInt() != 0;
1602 if (Implicit) {
1603 auto *Getter = readDeclAs<ObjCMethodDecl>();
1604 auto *Setter = readDeclAs<ObjCMethodDecl>();
1605 E->setImplicitProperty(Getter, Setter, MethodRefFlags);
1606 } else {
1607 E->setExplicitProperty(readDeclAs<ObjCPropertyDecl>(), MethodRefFlags);
1608 }
1609 E->setLocation(readSourceLocation());
1610 E->setReceiverLocation(readSourceLocation());
1611 switch (Record.readInt()) {
1612 case 0:
1613 E->setBase(Record.readSubExpr());
1614 break;
1615 case 1:
1616 E->setSuperReceiver(Record.readType());
1617 break;
1618 case 2:
1619 E->setClassReceiver(readDeclAs<ObjCInterfaceDecl>());
1620 break;
1621 }
1622}
1623
1624void ASTStmtReader::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
1625 VisitExpr(E);
1626 E->setRBracket(readSourceLocation());
1627 E->setBaseExpr(Record.readSubExpr());
1628 E->setKeyExpr(Record.readSubExpr());
1629 E->GetAtIndexMethodDecl = readDeclAs<ObjCMethodDecl>();
1630 E->SetAtIndexMethodDecl = readDeclAs<ObjCMethodDecl>();
1631}
1632
1633void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1634 VisitExpr(E);
1635 assert(Record.peekInt() == E->getNumArgs());
1636 Record.skipInts(1);
1637 unsigned NumStoredSelLocs = Record.readInt();
1638 E->SelLocsKind = Record.readInt();
1639 E->setDelegateInitCall(Record.readInt());
1640 E->IsImplicit = Record.readInt();
1641 auto Kind = static_cast<ObjCMessageExpr::ReceiverKind>(Record.readInt());
1642 switch (Kind) {
1644 E->setInstanceReceiver(Record.readSubExpr());
1645 break;
1646
1648 E->setClassReceiver(readTypeSourceInfo());
1649 break;
1650
1653 QualType T = Record.readType();
1654 SourceLocation SuperLoc = readSourceLocation();
1655 E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
1656 break;
1657 }
1658 }
1659
1660 assert(Kind == E->getReceiverKind());
1661
1662 if (Record.readInt())
1663 E->setMethodDecl(readDeclAs<ObjCMethodDecl>());
1664 else
1665 E->setSelector(Record.readSelector());
1666
1667 E->LBracLoc = readSourceLocation();
1668 E->RBracLoc = readSourceLocation();
1669
1670 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1671 E->setArg(I, Record.readSubExpr());
1672
1673 SourceLocation *Locs = E->getStoredSelLocs();
1674 for (unsigned I = 0; I != NumStoredSelLocs; ++I)
1675 Locs[I] = readSourceLocation();
1676}
1677
1678void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
1679 VisitStmt(S);
1680 S->setElement(Record.readSubStmt());
1681 S->setCollection(Record.readSubExpr());
1682 S->setBody(Record.readSubStmt());
1683 S->setForLoc(readSourceLocation());
1684 S->setRParenLoc(readSourceLocation());
1685}
1686
1687void ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
1688 VisitStmt(S);
1689 S->setCatchBody(Record.readSubStmt());
1690 S->setCatchParamDecl(readDeclAs<VarDecl>());
1691 S->setAtCatchLoc(readSourceLocation());
1692 S->setRParenLoc(readSourceLocation());
1693}
1694
1695void ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
1696 VisitStmt(S);
1697 S->setFinallyBody(Record.readSubStmt());
1698 S->setAtFinallyLoc(readSourceLocation());
1699}
1700
1701void ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
1702 VisitStmt(S); // FIXME: no test coverage.
1703 S->setSubStmt(Record.readSubStmt());
1704 S->setAtLoc(readSourceLocation());
1705}
1706
1707void ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
1708 VisitStmt(S);
1709 assert(Record.peekInt() == S->getNumCatchStmts());
1710 Record.skipInts(1);
1711 bool HasFinally = Record.readInt();
1712 S->setTryBody(Record.readSubStmt());
1713 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
1714 S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Record.readSubStmt()));
1715
1716 if (HasFinally)
1717 S->setFinallyStmt(Record.readSubStmt());
1718 S->setAtTryLoc(readSourceLocation());
1719}
1720
1721void ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
1722 VisitStmt(S); // FIXME: no test coverage.
1723 S->setSynchExpr(Record.readSubStmt());
1724 S->setSynchBody(Record.readSubStmt());
1725 S->setAtSynchronizedLoc(readSourceLocation());
1726}
1727
1728void ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
1729 VisitStmt(S); // FIXME: no test coverage.
1730 S->setThrowExpr(Record.readSubStmt());
1731 S->setThrowLoc(readSourceLocation());
1732}
1733
1734void ASTStmtReader::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
1735 VisitExpr(E);
1736 E->setValue(Record.readInt());
1737 E->setLocation(readSourceLocation());
1738}
1739
1740void ASTStmtReader::VisitObjCAvailabilityCheckExpr(ObjCAvailabilityCheckExpr *E) {
1741 VisitExpr(E);
1742 SourceRange R = Record.readSourceRange();
1743 E->AtLoc = R.getBegin();
1744 E->RParen = R.getEnd();
1745 E->VersionToCheck = Record.readVersionTuple();
1746}
1747
1748//===----------------------------------------------------------------------===//
1749// C++ Expressions and Statements
1750//===----------------------------------------------------------------------===//
1751
1752void ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
1753 VisitStmt(S);
1754 S->CatchLoc = readSourceLocation();
1755 S->ExceptionDecl = readDeclAs<VarDecl>();
1756 S->HandlerBlock = Record.readSubStmt();
1757}
1758
1759void ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
1760 VisitStmt(S);
1761 assert(Record.peekInt() == S->getNumHandlers() && "NumStmtFields is wrong ?");
1762 Record.skipInts(1);
1763 S->TryLoc = readSourceLocation();
1764 S->getStmts()[0] = Record.readSubStmt();
1765 for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
1766 S->getStmts()[i + 1] = Record.readSubStmt();
1767}
1768
1769void ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
1770 VisitStmt(S);
1771 S->ForLoc = readSourceLocation();
1772 S->CoawaitLoc = readSourceLocation();
1773 S->ColonLoc = readSourceLocation();
1774 S->RParenLoc = readSourceLocation();
1775 S->setInit(Record.readSubStmt());
1776 S->setRangeStmt(Record.readSubStmt());
1777 S->setBeginStmt(Record.readSubStmt());
1778 S->setEndStmt(Record.readSubStmt());
1779 S->setCond(Record.readSubExpr());
1780 S->setInc(Record.readSubExpr());
1781 S->setLoopVarStmt(Record.readSubStmt());
1782 S->setBody(Record.readSubStmt());
1783}
1784
1785void ASTStmtReader::VisitCXXExpansionStmtPattern(CXXExpansionStmtPattern *S) {
1786 VisitStmt(S);
1787 Record.skipInts(1); // Skip kind.
1788 S->LParenLoc = readSourceLocation();
1789 S->ColonLoc = readSourceLocation();
1790 S->RParenLoc = readSourceLocation();
1791 S->ParentDecl = cast<CXXExpansionStmtDecl>(Record.readDeclRef());
1792 for (Stmt *&SubStmt : S->children())
1793 SubStmt = Record.readSubStmt();
1794}
1795
1796void ASTStmtReader::VisitCXXExpansionStmtInstantiation(
1798 VisitStmt(S);
1799 Record.skipInts(2);
1800 S->Parent = cast<CXXExpansionStmtDecl>(Record.readDeclRef());
1801 for (unsigned I = 0; I < S->getNumSubStmts(); ++I)
1802 S->getAllSubStmts()[I] = Record.readSubStmt();
1803 S->setShouldApplyLifetimeExtensionToPreamble(Record.readBool());
1804}
1805
1806void ASTStmtReader::VisitCXXExpansionSelectExpr(CXXExpansionSelectExpr *E) {
1807 VisitExpr(E);
1808 E->setRangeExpr(cast<InitListExpr>(Record.readSubExpr()));
1809 E->setIndexExpr(Record.readSubExpr());
1810}
1811
1812void ASTStmtReader::VisitMSDependentExistsStmt(MSDependentExistsStmt *S) {
1813 VisitStmt(S);
1814 S->KeywordLoc = readSourceLocation();
1815 S->IsIfExists = Record.readInt();
1816 S->QualifierLoc = Record.readNestedNameSpecifierLoc();
1817 S->NameInfo = Record.readDeclarationNameInfo();
1818 S->SubStmt = Record.readSubStmt();
1819}
1820
1821void ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
1822 VisitCallExpr(E);
1823 E->CXXOperatorCallExprBits.OperatorKind = Record.readInt();
1824 E->CXXOperatorCallExprBits.IsReversed = Record.readInt();
1825 E->BeginLoc = Record.readSourceLocation();
1826}
1827
1828void ASTStmtReader::VisitCXXRewrittenBinaryOperator(
1830 VisitExpr(E);
1831 E->CXXRewrittenBinaryOperatorBits.IsReversed = Record.readInt();
1832 E->SemanticForm = Record.readSubExpr();
1833}
1834
1835void ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
1836 VisitExpr(E);
1837
1838 unsigned NumArgs = Record.readInt();
1839 assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!");
1840
1841 E->CXXConstructExprBits.Elidable = Record.readInt();
1842 E->CXXConstructExprBits.HadMultipleCandidates = Record.readInt();
1843 E->CXXConstructExprBits.ListInitialization = Record.readInt();
1844 E->CXXConstructExprBits.StdInitListInitialization = Record.readInt();
1845 E->CXXConstructExprBits.ZeroInitialization = Record.readInt();
1846 E->CXXConstructExprBits.ConstructionKind = Record.readInt();
1847 E->CXXConstructExprBits.IsImmediateEscalating = Record.readInt();
1848 E->CXXConstructExprBits.Loc = readSourceLocation();
1849 E->Constructor = readDeclAs<CXXConstructorDecl>();
1850 E->ParenOrBraceRange = readSourceRange();
1851
1852 for (unsigned I = 0; I != NumArgs; ++I)
1853 E->setArg(I, Record.readSubExpr());
1854}
1855
1856void ASTStmtReader::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {
1857 VisitExpr(E);
1858 E->Constructor = readDeclAs<CXXConstructorDecl>();
1859 E->Loc = readSourceLocation();
1860 E->ConstructsVirtualBase = Record.readInt();
1861 E->InheritedFromVirtualBase = Record.readInt();
1862}
1863
1864void ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
1865 VisitCXXConstructExpr(E);
1866 E->TSI = readTypeSourceInfo();
1867}
1868
1869void ASTStmtReader::VisitLambdaExpr(LambdaExpr *E) {
1870 VisitExpr(E);
1871 unsigned NumCaptures = Record.readInt();
1872 (void)NumCaptures;
1873 assert(NumCaptures == E->LambdaExprBits.NumCaptures);
1874 E->IntroducerRange = readSourceRange();
1875 E->LambdaExprBits.CaptureDefault = Record.readInt();
1876 E->CaptureDefaultLoc = readSourceLocation();
1877 E->LambdaExprBits.ExplicitParams = Record.readInt();
1878 E->LambdaExprBits.ExplicitResultType = Record.readInt();
1879 E->ClosingBrace = readSourceLocation();
1880
1881 // Read capture initializers.
1883 CEnd = E->capture_init_end();
1884 C != CEnd; ++C)
1885 *C = Record.readSubExpr();
1886
1887 // The body will be lazily deserialized when needed from the call operator
1888 // declaration.
1889}
1890
1891void
1892ASTStmtReader::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
1893 VisitExpr(E);
1894 E->SubExpr = Record.readSubExpr();
1895}
1896
1897void ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
1898 VisitExplicitCastExpr(E);
1899 SourceRange R = readSourceRange();
1900 E->Loc = R.getBegin();
1901 E->RParenLoc = R.getEnd();
1902 if (CurrentUnpackingBits->getNextBit())
1903 E->AngleBrackets = readSourceRange();
1904}
1905
1906void ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1907 return VisitCXXNamedCastExpr(E);
1908}
1909
1910void ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
1911 return VisitCXXNamedCastExpr(E);
1912}
1913
1914void ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1915 return VisitCXXNamedCastExpr(E);
1916}
1917
1918void ASTStmtReader::VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
1919 return VisitCXXNamedCastExpr(E);
1920}
1921
1922void ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1923 return VisitCXXNamedCastExpr(E);
1924}
1925
1926void ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1927 VisitExplicitCastExpr(E);
1928 E->setLParenLoc(readSourceLocation());
1929 E->setRParenLoc(readSourceLocation());
1930}
1931
1932void ASTStmtReader::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *E) {
1933 VisitExplicitCastExpr(E);
1934 E->KWLoc = readSourceLocation();
1935 E->RParenLoc = readSourceLocation();
1936}
1937
1938void ASTStmtReader::VisitUserDefinedLiteral(UserDefinedLiteral *E) {
1939 VisitCallExpr(E);
1940 E->UDSuffixLoc = readSourceLocation();
1941}
1942
1943void ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1944 VisitExpr(E);
1945 E->setValue(Record.readInt());
1946 E->setLocation(readSourceLocation());
1947}
1948
1949void ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1950 VisitExpr(E);
1951 E->setLocation(readSourceLocation());
1952}
1953
1954void ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1955 VisitExpr(E);
1956 E->setSourceRange(readSourceRange());
1957 if (E->isTypeOperand())
1958 E->Operand = readTypeSourceInfo();
1959 else
1960 E->Operand = Record.readSubExpr();
1961}
1962
1963void ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
1964 VisitExpr(E);
1965 E->setLocation(readSourceLocation());
1966 E->setImplicit(Record.readInt());
1968}
1969
1970void ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
1971 VisitExpr(E);
1972 E->CXXThrowExprBits.ThrowLoc = readSourceLocation();
1973 E->Operand = Record.readSubExpr();
1974 E->CXXThrowExprBits.IsThrownVariableInScope = Record.readInt();
1975}
1976
1977void ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1978 VisitExpr(E);
1979 E->Param = readDeclAs<ParmVarDecl>();
1980 E->UsedContext = readDeclAs<DeclContext>();
1981 E->CXXDefaultArgExprBits.Loc = readSourceLocation();
1982 E->CXXDefaultArgExprBits.HasRewrittenInit = Record.readInt();
1983 if (E->CXXDefaultArgExprBits.HasRewrittenInit)
1984 *E->getTrailingObjects() = Record.readSubExpr();
1985}
1986
1987void ASTStmtReader::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
1988 VisitExpr(E);
1989 E->CXXDefaultInitExprBits.HasRewrittenInit = Record.readInt();
1990 E->Field = readDeclAs<FieldDecl>();
1991 E->UsedContext = readDeclAs<DeclContext>();
1992 E->CXXDefaultInitExprBits.Loc = readSourceLocation();
1993 if (E->CXXDefaultInitExprBits.HasRewrittenInit)
1994 *E->getTrailingObjects() = Record.readSubExpr();
1995}
1996
1997void ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1998 VisitExpr(E);
1999 E->setTemporary(Record.readCXXTemporary());
2000 E->setSubExpr(Record.readSubExpr());
2001}
2002
2003void ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
2004 VisitExpr(E);
2005 E->TypeInfo = readTypeSourceInfo();
2006 E->CXXScalarValueInitExprBits.RParenLoc = readSourceLocation();
2007}
2008
2009void ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
2010 VisitExpr(E);
2011
2012 bool IsArray = Record.readInt();
2013 bool HasInit = Record.readInt();
2014 unsigned NumPlacementArgs = Record.readInt();
2015 bool IsParenTypeId = Record.readInt();
2016
2017 E->CXXNewExprBits.IsGlobalNew = Record.readInt();
2018 E->CXXNewExprBits.ShouldPassAlignment = Record.readInt();
2019 E->CXXNewExprBits.ShouldPassTypeIdentity = Record.readInt();
2020 E->CXXNewExprBits.UsualArrayDeleteWantsSize = Record.readInt();
2021 E->CXXNewExprBits.HasInitializer = Record.readInt();
2022 E->CXXNewExprBits.StoredInitializationStyle = Record.readInt();
2023
2024 assert((IsArray == E->isArray()) && "Wrong IsArray!");
2025 assert((HasInit == E->hasInitializer()) && "Wrong HasInit!");
2026 assert((NumPlacementArgs == E->getNumPlacementArgs()) &&
2027 "Wrong NumPlacementArgs!");
2028 assert((IsParenTypeId == E->isParenTypeId()) && "Wrong IsParenTypeId!");
2029 (void)IsArray;
2030 (void)HasInit;
2031 (void)NumPlacementArgs;
2032
2033 E->setOperatorNew(readDeclAs<FunctionDecl>());
2034 E->setOperatorDelete(readDeclAs<FunctionDecl>());
2035 E->AllocatedTypeInfo = readTypeSourceInfo();
2036 if (IsParenTypeId)
2037 E->getTrailingObjects<SourceRange>()[0] = readSourceRange();
2038 E->Range = readSourceRange();
2039 E->DirectInitRange = readSourceRange();
2040
2041 // Install all the subexpressions.
2043 N = E->raw_arg_end();
2044 I != N; ++I)
2045 *I = Record.readSubStmt();
2046}
2047
2048void ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
2049 VisitExpr(E);
2050 E->CXXDeleteExprBits.GlobalDelete = Record.readInt();
2051 E->CXXDeleteExprBits.ArrayForm = Record.readInt();
2052 E->CXXDeleteExprBits.ArrayFormAsWritten = Record.readInt();
2053 E->CXXDeleteExprBits.UsualArrayDeleteWantsSize = Record.readInt();
2054 E->OperatorDelete = readDeclAs<FunctionDecl>();
2055 E->Argument = Record.readSubExpr();
2056 E->CXXDeleteExprBits.Loc = readSourceLocation();
2057}
2058
2059void ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
2060 VisitExpr(E);
2061
2062 E->Base = Record.readSubExpr();
2063 E->IsArrow = Record.readInt();
2064 E->OperatorLoc = readSourceLocation();
2065 E->QualifierLoc = Record.readNestedNameSpecifierLoc();
2066 E->ScopeType = readTypeSourceInfo();
2067 E->ColonColonLoc = readSourceLocation();
2068 E->TildeLoc = readSourceLocation();
2069
2070 IdentifierInfo *II = Record.readIdentifier();
2071 if (II)
2072 E->setDestroyedType(II, readSourceLocation());
2073 else
2074 E->setDestroyedType(readTypeSourceInfo());
2075}
2076
2077void ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) {
2078 VisitExpr(E);
2079
2080 unsigned NumObjects = Record.readInt();
2081 assert(NumObjects == E->getNumObjects());
2082 for (unsigned i = 0; i != NumObjects; ++i) {
2083 unsigned CleanupKind = Record.readInt();
2085 if (CleanupKind == COK_Block)
2086 Obj = readDeclAs<BlockDecl>();
2087 else if (CleanupKind == COK_CompoundLiteral)
2088 Obj = cast<CompoundLiteralExpr>(Record.readSubExpr());
2089 else
2090 llvm_unreachable("unexpected cleanup object type");
2091 E->getTrailingObjects()[i] = Obj;
2092 }
2093
2094 E->ExprWithCleanupsBits.CleanupsHaveSideEffects = Record.readInt();
2095 E->SubExpr = Record.readSubExpr();
2096}
2097
2098void ASTStmtReader::VisitCXXDependentScopeMemberExpr(
2100 VisitExpr(E);
2101
2102 unsigned NumTemplateArgs = Record.readInt();
2103 CurrentUnpackingBits.emplace(Record.readInt());
2104 bool HasTemplateKWAndArgsInfo = CurrentUnpackingBits->getNextBit();
2105 bool HasFirstQualifierFoundInScope = CurrentUnpackingBits->getNextBit();
2106
2107 assert((HasTemplateKWAndArgsInfo == E->hasTemplateKWAndArgsInfo()) &&
2108 "Wrong HasTemplateKWAndArgsInfo!");
2109 assert(
2110 (HasFirstQualifierFoundInScope == E->hasFirstQualifierFoundInScope()) &&
2111 "Wrong HasFirstQualifierFoundInScope!");
2112
2113 if (HasTemplateKWAndArgsInfo)
2115 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
2116 E->getTrailingObjects<TemplateArgumentLoc>(), NumTemplateArgs);
2117
2118 assert((NumTemplateArgs == E->getNumTemplateArgs()) &&
2119 "Wrong NumTemplateArgs!");
2120
2122 CurrentUnpackingBits->getNextBit();
2123
2124 E->BaseType = Record.readType();
2125 E->QualifierLoc = Record.readNestedNameSpecifierLoc();
2126 // not ImplicitAccess
2127 if (CurrentUnpackingBits->getNextBit())
2128 E->Base = Record.readSubExpr();
2129 else
2130 E->Base = nullptr;
2131
2132 E->CXXDependentScopeMemberExprBits.OperatorLoc = readSourceLocation();
2133
2134 if (HasFirstQualifierFoundInScope)
2135 *E->getTrailingObjects<NamedDecl *>() = readDeclAs<NamedDecl>();
2136
2137 E->MemberNameInfo = Record.readDeclarationNameInfo();
2138}
2139
2140void
2141ASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
2142 VisitExpr(E);
2143
2144 if (CurrentUnpackingBits->getNextBit()) // HasTemplateKWAndArgsInfo
2146 *E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(),
2147 E->getTrailingObjects<TemplateArgumentLoc>(),
2148 /*NumTemplateArgs=*/CurrentUnpackingBits->getNextBits(/*Width=*/16));
2149
2150 E->QualifierLoc = Record.readNestedNameSpecifierLoc();
2151 E->NameInfo = Record.readDeclarationNameInfo();
2152}
2153
2154void
2155ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
2156 VisitExpr(E);
2157 assert(Record.peekInt() == E->getNumArgs() &&
2158 "Read wrong record during creation ?");
2159 Record.skipInts(1);
2160 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
2161 E->setArg(I, Record.readSubExpr());
2162 E->TypeAndInitForm.setPointer(readTypeSourceInfo());
2163 E->setLParenLoc(readSourceLocation());
2164 E->setRParenLoc(readSourceLocation());
2165 E->TypeAndInitForm.setInt(Record.readInt());
2166}
2167
2168void ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
2169 VisitExpr(E);
2170
2171 unsigned NumResults = Record.readInt();
2172 CurrentUnpackingBits.emplace(Record.readInt());
2173 bool HasTemplateKWAndArgsInfo = CurrentUnpackingBits->getNextBit();
2174 assert((E->getNumDecls() == NumResults) && "Wrong NumResults!");
2175 assert((E->hasTemplateKWAndArgsInfo() == HasTemplateKWAndArgsInfo) &&
2176 "Wrong HasTemplateKWAndArgsInfo!");
2177
2178 unsigned NumTemplateArgs = 0;
2179 if (HasTemplateKWAndArgsInfo) {
2180 NumTemplateArgs = Record.readInt();
2183 NumTemplateArgs);
2184 }
2185
2186 UnresolvedSet<8> Decls;
2187 for (unsigned I = 0; I != NumResults; ++I) {
2188 auto *D = readDeclAs<NamedDecl>();
2189 auto AS = (AccessSpecifier)Record.readInt();
2190 Decls.addDecl(D, AS);
2191 }
2192
2193 DeclAccessPair *Results = E->getTrailingResults();
2194 UnresolvedSetIterator Iter = Decls.begin();
2195 for (unsigned I = 0; I != NumResults; ++I) {
2196 Results[I] = (Iter + I).getPair();
2197 }
2198
2199 assert((E->getNumTemplateArgs() == NumTemplateArgs) &&
2200 "Wrong NumTemplateArgs!");
2201
2202 E->NameInfo = Record.readDeclarationNameInfo();
2203 E->QualifierLoc = Record.readNestedNameSpecifierLoc();
2204}
2205
2206void ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
2207 VisitOverloadExpr(E);
2208 E->UnresolvedMemberExprBits.IsArrow = CurrentUnpackingBits->getNextBit();
2209 E->UnresolvedMemberExprBits.HasUnresolvedUsing =
2210 CurrentUnpackingBits->getNextBit();
2211
2212 if (/*!isImplicitAccess=*/CurrentUnpackingBits->getNextBit())
2213 E->Base = Record.readSubExpr();
2214 else
2215 E->Base = nullptr;
2216
2217 E->OperatorLoc = readSourceLocation();
2218
2219 E->BaseType = Record.readType();
2220}
2221
2222void ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
2223 VisitOverloadExpr(E);
2224 E->UnresolvedLookupExprBits.RequiresADL = CurrentUnpackingBits->getNextBit();
2225 E->NamingClass = readDeclAs<CXXRecordDecl>();
2226}
2227
2228void ASTStmtReader::VisitTypeTraitExpr(TypeTraitExpr *E) {
2229 VisitExpr(E);
2230 E->TypeTraitExprBits.IsBooleanTypeTrait = Record.readInt();
2231 E->TypeTraitExprBits.NumArgs = Record.readInt();
2232 E->TypeTraitExprBits.Kind = Record.readInt();
2233
2234 if (E->TypeTraitExprBits.IsBooleanTypeTrait)
2235 E->TypeTraitExprBits.Value = Record.readInt();
2236 else
2237 *E->getTrailingObjects<APValue>() = Record.readAPValue();
2238
2239 SourceRange Range = readSourceRange();
2240 E->Loc = Range.getBegin();
2241 E->RParenLoc = Range.getEnd();
2242
2243 auto **Args = E->getTrailingObjects<TypeSourceInfo *>();
2244 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
2245 Args[I] = readTypeSourceInfo();
2246}
2247
2248void ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
2249 VisitExpr(E);
2250 E->ArrayTypeTraitExprBits.ATT = (ArrayTypeTrait)Record.readInt();
2251 E->Value = (unsigned int)Record.readInt();
2252 SourceRange Range = readSourceRange();
2253 E->Loc = Range.getBegin();
2254 E->RParen = Range.getEnd();
2255 E->QueriedType = readTypeSourceInfo();
2256 E->Dimension = Record.readSubExpr();
2257}
2258
2259void ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
2260 VisitExpr(E);
2261 E->ExpressionTraitExprBits.ET = (ExpressionTrait)Record.readInt();
2262 E->ExpressionTraitExprBits.Value = (bool)Record.readInt();
2263 SourceRange Range = readSourceRange();
2264 E->QueriedExpression = Record.readSubExpr();
2265 E->Loc = Range.getBegin();
2266 E->RParen = Range.getEnd();
2267}
2268
2269void ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
2270 VisitExpr(E);
2271 E->CXXNoexceptExprBits.Value = Record.readInt();
2272 E->Range = readSourceRange();
2273 E->Operand = Record.readSubExpr();
2274}
2275
2276void ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) {
2277 VisitExpr(E);
2278 E->EllipsisLoc = readSourceLocation();
2279 E->NumExpansions = Record.readInt();
2280 E->Pattern = Record.readSubExpr();
2281}
2282
2283void ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
2284 VisitExpr(E);
2285 unsigned NumPartialArgs = Record.readInt();
2286 E->OperatorLoc = readSourceLocation();
2287 E->PackLoc = readSourceLocation();
2288 E->RParenLoc = readSourceLocation();
2289 E->Pack = Record.readDeclAs<NamedDecl>();
2290 if (E->isPartiallySubstituted()) {
2291 assert(E->Length == NumPartialArgs);
2292 for (auto *I = E->getTrailingObjects(), *E = I + NumPartialArgs; I != E;
2293 ++I)
2294 new (I) TemplateArgument(Record.readTemplateArgument());
2295 } else if (!E->isValueDependent()) {
2296 E->Length = Record.readInt();
2297 }
2298}
2299
2300void ASTStmtReader::VisitPackIndexingExpr(PackIndexingExpr *E) {
2301 VisitExpr(E);
2302 E->PackIndexingExprBits.TransformedExpressions = Record.readInt();
2303 E->PackIndexingExprBits.FullySubstituted = Record.readInt();
2304 E->EllipsisLoc = readSourceLocation();
2305 E->RSquareLoc = readSourceLocation();
2306 E->SubExprs[0] = Record.readStmt();
2307 E->SubExprs[1] = Record.readStmt();
2308 auto **Exprs = E->getTrailingObjects();
2309 for (unsigned I = 0; I < E->PackIndexingExprBits.TransformedExpressions; ++I)
2310 Exprs[I] = Record.readExpr();
2311}
2312
2313void ASTStmtReader::VisitSubstNonTypeTemplateParmExpr(
2315 VisitExpr(E);
2316 E->AssociatedDeclAndFinal.setPointer(readDeclAs<Decl>());
2317 E->AssociatedDeclAndFinal.setInt(CurrentUnpackingBits->getNextBit());
2318 E->Index = CurrentUnpackingBits->getNextBits(/*Width=*/12);
2319 E->PackIndex = Record.readUnsignedOrNone().toInternalRepresentation();
2320 E->ParamType = Record.readType();
2321 E->SubstNonTypeTemplateParmExprBits.NameLoc = readSourceLocation();
2322 E->Replacement = Record.readSubExpr();
2323}
2324
2325void ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(
2327 VisitExpr(E);
2328 E->AssociatedDecl = readDeclAs<Decl>();
2329 E->Final = CurrentUnpackingBits->getNextBit();
2330 E->Index = Record.readInt();
2331 TemplateArgument ArgPack = Record.readTemplateArgument();
2332 if (ArgPack.getKind() != TemplateArgument::Pack)
2333 return;
2334
2335 E->Arguments = ArgPack.pack_begin();
2336 E->NumArguments = ArgPack.pack_size();
2337 E->NameLoc = readSourceLocation();
2338}
2339
2340void ASTStmtReader::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
2341 VisitExpr(E);
2342 E->NumParameters = Record.readInt();
2343 E->ParamPack = readDeclAs<ValueDecl>();
2344 E->NameLoc = readSourceLocation();
2345 auto **Parms = E->getTrailingObjects();
2346 for (unsigned i = 0, n = E->NumParameters; i != n; ++i)
2347 Parms[i] = readDeclAs<ValueDecl>();
2348}
2349
2350void ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
2351 VisitExpr(E);
2352 bool HasMaterialzedDecl = Record.readInt();
2353 if (HasMaterialzedDecl)
2354 E->State = cast<LifetimeExtendedTemporaryDecl>(Record.readDecl());
2355 else
2356 E->State = Record.readSubExpr();
2357}
2358
2359void ASTStmtReader::VisitCXXFoldExpr(CXXFoldExpr *E) {
2360 VisitExpr(E);
2361 E->LParenLoc = readSourceLocation();
2362 E->EllipsisLoc = readSourceLocation();
2363 E->RParenLoc = readSourceLocation();
2364 E->NumExpansions = Record.readUnsignedOrNone();
2365 E->SubExprs[0] = Record.readSubExpr();
2366 E->SubExprs[1] = Record.readSubExpr();
2367 E->SubExprs[2] = Record.readSubExpr();
2368 E->CXXFoldExprBits.Opcode = (BinaryOperatorKind)Record.readInt();
2369}
2370
2371void ASTStmtReader::VisitCXXParenListInitExpr(CXXParenListInitExpr *E) {
2372 VisitExpr(E);
2373 unsigned ExpectedNumExprs = Record.readInt();
2374 assert(E->NumExprs == ExpectedNumExprs &&
2375 "expected number of expressions does not equal the actual number of "
2376 "serialized expressions.");
2377 E->NumUserSpecifiedExprs = Record.readInt();
2378 E->InitLoc = readSourceLocation();
2379 E->LParenLoc = readSourceLocation();
2380 E->RParenLoc = readSourceLocation();
2381 for (unsigned I = 0; I < ExpectedNumExprs; I++)
2382 E->getTrailingObjects()[I] = Record.readSubExpr();
2383
2384 bool HasArrayFillerOrUnionDecl = Record.readBool();
2385 if (HasArrayFillerOrUnionDecl) {
2386 bool HasArrayFiller = Record.readBool();
2387 if (HasArrayFiller) {
2388 E->setArrayFiller(Record.readSubExpr());
2389 } else {
2390 E->setInitializedFieldInUnion(readDeclAs<FieldDecl>());
2391 }
2392 }
2393 E->updateDependence();
2394}
2395
2396void ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
2397 VisitExpr(E);
2398 E->SourceExpr = Record.readSubExpr();
2399 E->OpaqueValueExprBits.Loc = readSourceLocation();
2400 E->setIsUnique(Record.readInt());
2401}
2402
2403void ASTStmtReader::VisitRecoveryExpr(RecoveryExpr *E) {
2404 VisitExpr(E);
2405 unsigned NumArgs = Record.readInt();
2406 E->BeginLoc = readSourceLocation();
2407 E->EndLoc = readSourceLocation();
2408 assert((NumArgs + 0LL ==
2409 std::distance(E->children().begin(), E->children().end())) &&
2410 "Wrong NumArgs!");
2411 (void)NumArgs;
2412 for (Stmt *&Child : E->children())
2413 Child = Record.readSubStmt();
2414}
2415
2416//===----------------------------------------------------------------------===//
2417// Microsoft Expressions and Statements
2418//===----------------------------------------------------------------------===//
2419void ASTStmtReader::VisitMSPropertyRefExpr(MSPropertyRefExpr *E) {
2420 VisitExpr(E);
2421 E->IsArrow = (Record.readInt() != 0);
2422 E->BaseExpr = Record.readSubExpr();
2423 E->QualifierLoc = Record.readNestedNameSpecifierLoc();
2424 E->MemberLoc = readSourceLocation();
2425 E->TheDecl = readDeclAs<MSPropertyDecl>();
2426}
2427
2428void ASTStmtReader::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *E) {
2429 VisitExpr(E);
2430 E->setBase(Record.readSubExpr());
2431 E->setIdx(Record.readSubExpr());
2432 E->setRBracketLoc(readSourceLocation());
2433}
2434
2435void ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
2436 VisitExpr(E);
2437 E->setSourceRange(readSourceRange());
2438 E->Guid = readDeclAs<MSGuidDecl>();
2439 if (E->isTypeOperand())
2440 E->Operand = readTypeSourceInfo();
2441 else
2442 E->Operand = Record.readSubExpr();
2443}
2444
2445void ASTStmtReader::VisitSEHLeaveStmt(SEHLeaveStmt *S) {
2446 VisitStmt(S);
2447 S->setLeaveLoc(readSourceLocation());
2448}
2449
2450void ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) {
2451 VisitStmt(S);
2452 S->Loc = readSourceLocation();
2453 S->Children[SEHExceptStmt::FILTER_EXPR] = Record.readSubStmt();
2454 S->Children[SEHExceptStmt::BLOCK] = Record.readSubStmt();
2455}
2456
2457void ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
2458 VisitStmt(S);
2459 S->Loc = readSourceLocation();
2460 S->Block = Record.readSubStmt();
2461}
2462
2463void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) {
2464 VisitStmt(S);
2465 S->IsCXXTry = Record.readInt();
2466 S->TryLoc = readSourceLocation();
2467 S->Children[SEHTryStmt::TRY] = Record.readSubStmt();
2468 S->Children[SEHTryStmt::HANDLER] = Record.readSubStmt();
2469}
2470
2471//===----------------------------------------------------------------------===//
2472// CUDA Expressions and Statements
2473//===----------------------------------------------------------------------===//
2474
2475void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
2476 VisitCallExpr(E);
2477 E->setPreArg(CUDAKernelCallExpr::CONFIG, Record.readSubExpr());
2478}
2479
2480//===----------------------------------------------------------------------===//
2481// OpenCL Expressions and Statements.
2482//===----------------------------------------------------------------------===//
2483void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {
2484 VisitExpr(E);
2485 E->BuiltinLoc = readSourceLocation();
2486 E->RParenLoc = readSourceLocation();
2487 E->SrcExpr = Record.readSubExpr();
2488}
2489
2490//===----------------------------------------------------------------------===//
2491// OpenMP Directives.
2492//===----------------------------------------------------------------------===//
2493
2494void ASTStmtReader::VisitOMPCanonicalLoop(OMPCanonicalLoop *S) {
2495 VisitStmt(S);
2496 for (Stmt *&SubStmt : S->SubStmts)
2497 SubStmt = Record.readSubStmt();
2498}
2499
2500void ASTStmtReader::VisitOMPExecutableDirective(OMPExecutableDirective *E) {
2501 Record.readOMPChildren(E->Data);
2502 E->setLocStart(readSourceLocation());
2503 E->setLocEnd(readSourceLocation());
2504}
2505
2506void ASTStmtReader::VisitOMPLoopBasedDirective(OMPLoopBasedDirective *D) {
2507 VisitStmt(D);
2508 // Field CollapsedNum was read in ReadStmtFromStream.
2509 Record.skipInts(1);
2510 VisitOMPExecutableDirective(D);
2511}
2512
2513void ASTStmtReader::VisitOMPLoopDirective(OMPLoopDirective *D) {
2514 VisitOMPLoopBasedDirective(D);
2515}
2516
2517void ASTStmtReader::VisitOMPMetaDirective(OMPMetaDirective *D) {
2518 VisitStmt(D);
2519 // The NumClauses field was read in ReadStmtFromStream.
2520 Record.skipInts(1);
2521 VisitOMPExecutableDirective(D);
2522}
2523
2524void ASTStmtReader::VisitOMPParallelDirective(OMPParallelDirective *D) {
2525 VisitStmt(D);
2526 VisitOMPExecutableDirective(D);
2527 D->setHasCancel(Record.readBool());
2528}
2529
2530void ASTStmtReader::VisitOMPSimdDirective(OMPSimdDirective *D) {
2531 VisitOMPLoopDirective(D);
2532}
2533
2534void ASTStmtReader::VisitOMPCanonicalLoopNestTransformationDirective(
2535 OMPCanonicalLoopNestTransformationDirective *D) {
2536 VisitOMPLoopBasedDirective(D);
2537 D->setNumGeneratedTopLevelLoops(Record.readUInt32());
2538}
2539
2540void ASTStmtReader::VisitOMPTileDirective(OMPTileDirective *D) {
2541 VisitOMPCanonicalLoopNestTransformationDirective(D);
2542}
2543
2544void ASTStmtReader::VisitOMPStripeDirective(OMPStripeDirective *D) {
2545 VisitOMPCanonicalLoopNestTransformationDirective(D);
2546}
2547
2548void ASTStmtReader::VisitOMPUnrollDirective(OMPUnrollDirective *D) {
2549 VisitOMPCanonicalLoopNestTransformationDirective(D);
2550}
2551
2552void ASTStmtReader::VisitOMPReverseDirective(OMPReverseDirective *D) {
2553 VisitOMPCanonicalLoopNestTransformationDirective(D);
2554}
2555
2556void ASTStmtReader::VisitOMPCanonicalLoopSequenceTransformationDirective(
2557 OMPCanonicalLoopSequenceTransformationDirective *D) {
2558 VisitStmt(D);
2559 VisitOMPExecutableDirective(D);
2560 D->setNumGeneratedTopLevelLoops(Record.readUInt32());
2561}
2562
2563void ASTStmtReader::VisitOMPInterchangeDirective(OMPInterchangeDirective *D) {
2564 VisitOMPCanonicalLoopNestTransformationDirective(D);
2565}
2566
2567void ASTStmtReader::VisitOMPSplitDirective(OMPSplitDirective *D) {
2568 VisitOMPCanonicalLoopNestTransformationDirective(D);
2569}
2570
2571void ASTStmtReader::VisitOMPFuseDirective(OMPFuseDirective *D) {
2572 VisitOMPCanonicalLoopSequenceTransformationDirective(D);
2573}
2574
2575void ASTStmtReader::VisitOMPForDirective(OMPForDirective *D) {
2576 VisitOMPLoopDirective(D);
2577 D->setHasCancel(Record.readBool());
2578}
2579
2580void ASTStmtReader::VisitOMPForSimdDirective(OMPForSimdDirective *D) {
2581 VisitOMPLoopDirective(D);
2582}
2583
2584void ASTStmtReader::VisitOMPSectionsDirective(OMPSectionsDirective *D) {
2585 VisitStmt(D);
2586 VisitOMPExecutableDirective(D);
2587 D->setHasCancel(Record.readBool());
2588}
2589
2590void ASTStmtReader::VisitOMPSectionDirective(OMPSectionDirective *D) {
2591 VisitStmt(D);
2592 VisitOMPExecutableDirective(D);
2593 D->setHasCancel(Record.readBool());
2594}
2595
2596void ASTStmtReader::VisitOMPScopeDirective(OMPScopeDirective *D) {
2597 VisitStmt(D);
2598 VisitOMPExecutableDirective(D);
2599}
2600
2601void ASTStmtReader::VisitOMPSingleDirective(OMPSingleDirective *D) {
2602 VisitStmt(D);
2603 VisitOMPExecutableDirective(D);
2604}
2605
2606void ASTStmtReader::VisitOMPMasterDirective(OMPMasterDirective *D) {
2607 VisitStmt(D);
2608 VisitOMPExecutableDirective(D);
2609}
2610
2611void ASTStmtReader::VisitOMPCriticalDirective(OMPCriticalDirective *D) {
2612 VisitStmt(D);
2613 VisitOMPExecutableDirective(D);
2614 D->DirName = Record.readDeclarationNameInfo();
2615}
2616
2617void ASTStmtReader::VisitOMPParallelForDirective(OMPParallelForDirective *D) {
2618 VisitOMPLoopDirective(D);
2619 D->setHasCancel(Record.readBool());
2620}
2621
2622void ASTStmtReader::VisitOMPParallelForSimdDirective(
2623 OMPParallelForSimdDirective *D) {
2624 VisitOMPLoopDirective(D);
2625}
2626
2627void ASTStmtReader::VisitOMPParallelMasterDirective(
2628 OMPParallelMasterDirective *D) {
2629 VisitStmt(D);
2630 VisitOMPExecutableDirective(D);
2631}
2632
2633void ASTStmtReader::VisitOMPParallelMaskedDirective(
2634 OMPParallelMaskedDirective *D) {
2635 VisitStmt(D);
2636 VisitOMPExecutableDirective(D);
2637}
2638
2639void ASTStmtReader::VisitOMPParallelSectionsDirective(
2640 OMPParallelSectionsDirective *D) {
2641 VisitStmt(D);
2642 VisitOMPExecutableDirective(D);
2643 D->setHasCancel(Record.readBool());
2644}
2645
2646void ASTStmtReader::VisitOMPTaskDirective(OMPTaskDirective *D) {
2647 VisitStmt(D);
2648 VisitOMPExecutableDirective(D);
2649 D->setHasCancel(Record.readBool());
2650}
2651
2652void ASTStmtReader::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *D) {
2653 VisitStmt(D);
2654 VisitOMPExecutableDirective(D);
2655}
2656
2657void ASTStmtReader::VisitOMPBarrierDirective(OMPBarrierDirective *D) {
2658 VisitStmt(D);
2659 VisitOMPExecutableDirective(D);
2660}
2661
2662void ASTStmtReader::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
2663 VisitStmt(D);
2664 // The NumClauses field was read in ReadStmtFromStream.
2665 Record.skipInts(1);
2666 VisitOMPExecutableDirective(D);
2667}
2668
2669void ASTStmtReader::VisitOMPAssumeDirective(OMPAssumeDirective *D) {
2670 VisitStmt(D);
2671 VisitOMPExecutableDirective(D);
2672}
2673
2674void ASTStmtReader::VisitOMPErrorDirective(OMPErrorDirective *D) {
2675 VisitStmt(D);
2676 // The NumClauses field was read in ReadStmtFromStream.
2677 Record.skipInts(1);
2678 VisitOMPExecutableDirective(D);
2679}
2680
2681void ASTStmtReader::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *D) {
2682 VisitStmt(D);
2683 VisitOMPExecutableDirective(D);
2684}
2685
2686void ASTStmtReader::VisitOMPFlushDirective(OMPFlushDirective *D) {
2687 VisitStmt(D);
2688 VisitOMPExecutableDirective(D);
2689}
2690
2691void ASTStmtReader::VisitOMPDepobjDirective(OMPDepobjDirective *D) {
2692 VisitStmt(D);
2693 VisitOMPExecutableDirective(D);
2694}
2695
2696void ASTStmtReader::VisitOMPScanDirective(OMPScanDirective *D) {
2697 VisitStmt(D);
2698 VisitOMPExecutableDirective(D);
2699}
2700
2701void ASTStmtReader::VisitOMPOrderedStandaloneDirective(
2702 OMPOrderedStandaloneDirective *D) {
2703 VisitStmt(D);
2704 VisitOMPExecutableDirective(D);
2705}
2706
2707void ASTStmtReader::VisitOMPOrderedBlockAssocDirective(
2708 OMPOrderedBlockAssocDirective *D) {
2709 VisitStmt(D);
2710 VisitOMPExecutableDirective(D);
2711}
2712
2713void ASTStmtReader::VisitOMPAtomicDirective(OMPAtomicDirective *D) {
2714 VisitStmt(D);
2715 VisitOMPExecutableDirective(D);
2716 D->Flags.IsXLHSInRHSPart = Record.readBool() ? 1 : 0;
2717 D->Flags.IsPostfixUpdate = Record.readBool() ? 1 : 0;
2718 D->Flags.IsFailOnly = Record.readBool() ? 1 : 0;
2719}
2720
2721void ASTStmtReader::VisitOMPTargetDirective(OMPTargetDirective *D) {
2722 VisitStmt(D);
2723 VisitOMPExecutableDirective(D);
2724}
2725
2726void ASTStmtReader::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) {
2727 VisitStmt(D);
2728 VisitOMPExecutableDirective(D);
2729}
2730
2731void ASTStmtReader::VisitOMPTargetEnterDataDirective(
2732 OMPTargetEnterDataDirective *D) {
2733 VisitStmt(D);
2734 VisitOMPExecutableDirective(D);
2735}
2736
2737void ASTStmtReader::VisitOMPTargetExitDataDirective(
2738 OMPTargetExitDataDirective *D) {
2739 VisitStmt(D);
2740 VisitOMPExecutableDirective(D);
2741}
2742
2743void ASTStmtReader::VisitOMPTargetParallelDirective(
2744 OMPTargetParallelDirective *D) {
2745 VisitStmt(D);
2746 VisitOMPExecutableDirective(D);
2747 D->setHasCancel(Record.readBool());
2748}
2749
2750void ASTStmtReader::VisitOMPTargetParallelForDirective(
2751 OMPTargetParallelForDirective *D) {
2752 VisitOMPLoopDirective(D);
2753 D->setHasCancel(Record.readBool());
2754}
2755
2756void ASTStmtReader::VisitOMPTeamsDirective(OMPTeamsDirective *D) {
2757 VisitStmt(D);
2758 VisitOMPExecutableDirective(D);
2759}
2760
2761void ASTStmtReader::VisitOMPCancellationPointDirective(
2762 OMPCancellationPointDirective *D) {
2763 VisitStmt(D);
2764 VisitOMPExecutableDirective(D);
2765 D->setCancelRegion(Record.readEnum<OpenMPDirectiveKind>());
2766}
2767
2768void ASTStmtReader::VisitOMPCancelDirective(OMPCancelDirective *D) {
2769 VisitStmt(D);
2770 VisitOMPExecutableDirective(D);
2771 D->setCancelRegion(Record.readEnum<OpenMPDirectiveKind>());
2772}
2773
2774void ASTStmtReader::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
2775 VisitOMPLoopDirective(D);
2776 D->setHasCancel(Record.readBool());
2777}
2778
2779void ASTStmtReader::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) {
2780 VisitOMPLoopDirective(D);
2781}
2782
2783void ASTStmtReader::VisitOMPMasterTaskLoopDirective(
2784 OMPMasterTaskLoopDirective *D) {
2785 VisitOMPLoopDirective(D);
2786 D->setHasCancel(Record.readBool());
2787}
2788
2789void ASTStmtReader::VisitOMPMaskedTaskLoopDirective(
2790 OMPMaskedTaskLoopDirective *D) {
2791 VisitOMPLoopDirective(D);
2792 D->setHasCancel(Record.readBool());
2793}
2794
2795void ASTStmtReader::VisitOMPMasterTaskLoopSimdDirective(
2796 OMPMasterTaskLoopSimdDirective *D) {
2797 VisitOMPLoopDirective(D);
2798}
2799
2800void ASTStmtReader::VisitOMPMaskedTaskLoopSimdDirective(
2801 OMPMaskedTaskLoopSimdDirective *D) {
2802 VisitOMPLoopDirective(D);
2803}
2804
2805void ASTStmtReader::VisitOMPParallelMasterTaskLoopDirective(
2806 OMPParallelMasterTaskLoopDirective *D) {
2807 VisitOMPLoopDirective(D);
2808 D->setHasCancel(Record.readBool());
2809}
2810
2811void ASTStmtReader::VisitOMPParallelMaskedTaskLoopDirective(
2812 OMPParallelMaskedTaskLoopDirective *D) {
2813 VisitOMPLoopDirective(D);
2814 D->setHasCancel(Record.readBool());
2815}
2816
2817void ASTStmtReader::VisitOMPParallelMasterTaskLoopSimdDirective(
2818 OMPParallelMasterTaskLoopSimdDirective *D) {
2819 VisitOMPLoopDirective(D);
2820}
2821
2822void ASTStmtReader::VisitOMPParallelMaskedTaskLoopSimdDirective(
2823 OMPParallelMaskedTaskLoopSimdDirective *D) {
2824 VisitOMPLoopDirective(D);
2825}
2826
2827void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective *D) {
2828 VisitOMPLoopDirective(D);
2829}
2830
2831void ASTStmtReader::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) {
2832 VisitStmt(D);
2833 VisitOMPExecutableDirective(D);
2834}
2835
2836void ASTStmtReader::VisitOMPDistributeParallelForDirective(
2837 OMPDistributeParallelForDirective *D) {
2838 VisitOMPLoopDirective(D);
2839 D->setHasCancel(Record.readBool());
2840}
2841
2842void ASTStmtReader::VisitOMPDistributeParallelForSimdDirective(
2843 OMPDistributeParallelForSimdDirective *D) {
2844 VisitOMPLoopDirective(D);
2845}
2846
2847void ASTStmtReader::VisitOMPDistributeSimdDirective(
2848 OMPDistributeSimdDirective *D) {
2849 VisitOMPLoopDirective(D);
2850}
2851
2852void ASTStmtReader::VisitOMPTargetParallelForSimdDirective(
2853 OMPTargetParallelForSimdDirective *D) {
2854 VisitOMPLoopDirective(D);
2855}
2856
2857void ASTStmtReader::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *D) {
2858 VisitOMPLoopDirective(D);
2859}
2860
2861void ASTStmtReader::VisitOMPTeamsDistributeDirective(
2862 OMPTeamsDistributeDirective *D) {
2863 VisitOMPLoopDirective(D);
2864}
2865
2866void ASTStmtReader::VisitOMPTeamsDistributeSimdDirective(
2867 OMPTeamsDistributeSimdDirective *D) {
2868 VisitOMPLoopDirective(D);
2869}
2870
2871void ASTStmtReader::VisitOMPTeamsDistributeParallelForSimdDirective(
2872 OMPTeamsDistributeParallelForSimdDirective *D) {
2873 VisitOMPLoopDirective(D);
2874}
2875
2876void ASTStmtReader::VisitOMPTeamsDistributeParallelForDirective(
2877 OMPTeamsDistributeParallelForDirective *D) {
2878 VisitOMPLoopDirective(D);
2879 D->setHasCancel(Record.readBool());
2880}
2881
2882void ASTStmtReader::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *D) {
2883 VisitStmt(D);
2884 VisitOMPExecutableDirective(D);
2885}
2886
2887void ASTStmtReader::VisitOMPTargetTeamsDistributeDirective(
2888 OMPTargetTeamsDistributeDirective *D) {
2889 VisitOMPLoopDirective(D);
2890}
2891
2892void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForDirective(
2893 OMPTargetTeamsDistributeParallelForDirective *D) {
2894 VisitOMPLoopDirective(D);
2895 D->setHasCancel(Record.readBool());
2896}
2897
2898void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
2899 OMPTargetTeamsDistributeParallelForSimdDirective *D) {
2900 VisitOMPLoopDirective(D);
2901}
2902
2903void ASTStmtReader::VisitOMPTargetTeamsDistributeSimdDirective(
2904 OMPTargetTeamsDistributeSimdDirective *D) {
2905 VisitOMPLoopDirective(D);
2906}
2907
2908void ASTStmtReader::VisitOMPInteropDirective(OMPInteropDirective *D) {
2909 VisitStmt(D);
2910 VisitOMPExecutableDirective(D);
2911}
2912
2913void ASTStmtReader::VisitOMPDispatchDirective(OMPDispatchDirective *D) {
2914 VisitStmt(D);
2915 VisitOMPExecutableDirective(D);
2916 D->setTargetCallLoc(Record.readSourceLocation());
2917}
2918
2919void ASTStmtReader::VisitOMPMaskedDirective(OMPMaskedDirective *D) {
2920 VisitStmt(D);
2921 VisitOMPExecutableDirective(D);
2922}
2923
2924void ASTStmtReader::VisitOMPGenericLoopDirective(OMPGenericLoopDirective *D) {
2925 VisitOMPLoopDirective(D);
2926}
2927
2928void ASTStmtReader::VisitOMPTeamsGenericLoopDirective(
2929 OMPTeamsGenericLoopDirective *D) {
2930 VisitOMPLoopDirective(D);
2931}
2932
2933void ASTStmtReader::VisitOMPTargetTeamsGenericLoopDirective(
2934 OMPTargetTeamsGenericLoopDirective *D) {
2935 VisitOMPLoopDirective(D);
2936 D->setCanBeParallelFor(Record.readBool());
2937}
2938
2939void ASTStmtReader::VisitOMPParallelGenericLoopDirective(
2940 OMPParallelGenericLoopDirective *D) {
2941 VisitOMPLoopDirective(D);
2942}
2943
2944void ASTStmtReader::VisitOMPTargetParallelGenericLoopDirective(
2945 OMPTargetParallelGenericLoopDirective *D) {
2946 VisitOMPLoopDirective(D);
2947}
2948
2949//===----------------------------------------------------------------------===//
2950// OpenACC Constructs/Directives.
2951//===----------------------------------------------------------------------===//
2952void ASTStmtReader::VisitOpenACCConstructStmt(OpenACCConstructStmt *S) {
2953 (void)Record.readInt();
2954 S->Kind = Record.readEnum<OpenACCDirectiveKind>();
2955 S->Range = Record.readSourceRange();
2956 S->DirectiveLoc = Record.readSourceLocation();
2957 Record.readOpenACCClauseList(S->Clauses);
2958}
2959
2960void ASTStmtReader::VisitOpenACCAssociatedStmtConstruct(
2962 VisitOpenACCConstructStmt(S);
2963 S->setAssociatedStmt(Record.readSubStmt());
2964}
2965
2966void ASTStmtReader::VisitOpenACCComputeConstruct(OpenACCComputeConstruct *S) {
2967 VisitStmt(S);
2968 VisitOpenACCAssociatedStmtConstruct(S);
2969}
2970
2971void ASTStmtReader::VisitOpenACCLoopConstruct(OpenACCLoopConstruct *S) {
2972 VisitStmt(S);
2973 VisitOpenACCAssociatedStmtConstruct(S);
2974 S->ParentComputeConstructKind = Record.readEnum<OpenACCDirectiveKind>();
2975}
2976
2977void ASTStmtReader::VisitOpenACCCombinedConstruct(OpenACCCombinedConstruct *S) {
2978 VisitStmt(S);
2979 VisitOpenACCAssociatedStmtConstruct(S);
2980}
2981
2982void ASTStmtReader::VisitOpenACCDataConstruct(OpenACCDataConstruct *S) {
2983 VisitStmt(S);
2984 VisitOpenACCAssociatedStmtConstruct(S);
2985}
2986
2987void ASTStmtReader::VisitOpenACCEnterDataConstruct(
2988 OpenACCEnterDataConstruct *S) {
2989 VisitStmt(S);
2990 VisitOpenACCConstructStmt(S);
2991}
2992
2993void ASTStmtReader::VisitOpenACCExitDataConstruct(OpenACCExitDataConstruct *S) {
2994 VisitStmt(S);
2995 VisitOpenACCConstructStmt(S);
2996}
2997
2998void ASTStmtReader::VisitOpenACCInitConstruct(OpenACCInitConstruct *S) {
2999 VisitStmt(S);
3000 VisitOpenACCConstructStmt(S);
3001}
3002
3003void ASTStmtReader::VisitOpenACCShutdownConstruct(OpenACCShutdownConstruct *S) {
3004 VisitStmt(S);
3005 VisitOpenACCConstructStmt(S);
3006}
3007
3008void ASTStmtReader::VisitOpenACCSetConstruct(OpenACCSetConstruct *S) {
3009 VisitStmt(S);
3010 VisitOpenACCConstructStmt(S);
3011}
3012
3013void ASTStmtReader::VisitOpenACCUpdateConstruct(OpenACCUpdateConstruct *S) {
3014 VisitStmt(S);
3015 VisitOpenACCConstructStmt(S);
3016}
3017
3018void ASTStmtReader::VisitOpenACCHostDataConstruct(OpenACCHostDataConstruct *S) {
3019 VisitStmt(S);
3020 VisitOpenACCAssociatedStmtConstruct(S);
3021}
3022
3023void ASTStmtReader::VisitOpenACCWaitConstruct(OpenACCWaitConstruct *S) {
3024 VisitStmt(S);
3025 // Consume the count of Expressions.
3026 (void)Record.readInt();
3027 VisitOpenACCConstructStmt(S);
3028 S->LParenLoc = Record.readSourceLocation();
3029 S->RParenLoc = Record.readSourceLocation();
3030 S->QueuesLoc = Record.readSourceLocation();
3031
3032 for (unsigned I = 0; I < S->NumExprs; ++I) {
3033 S->getExprPtr()[I] = cast_if_present<Expr>(Record.readSubStmt());
3034 assert((I == 0 || S->getExprPtr()[I] != nullptr) &&
3035 "Only first expression should be null");
3036 }
3037}
3038
3039void ASTStmtReader::VisitOpenACCCacheConstruct(OpenACCCacheConstruct *S) {
3040 VisitStmt(S);
3041 (void)Record.readInt();
3042 VisitOpenACCConstructStmt(S);
3043 S->ParensLoc = Record.readSourceRange();
3044 S->ReadOnlyLoc = Record.readSourceLocation();
3045 for (unsigned I = 0; I < S->NumVars; ++I)
3046 S->getVarList()[I] = cast<Expr>(Record.readSubStmt());
3047}
3048
3049void ASTStmtReader::VisitOpenACCAtomicConstruct(OpenACCAtomicConstruct *S) {
3050 VisitStmt(S);
3051 VisitOpenACCConstructStmt(S);
3052 S->AtomicKind = Record.readEnum<OpenACCAtomicKind>();
3053 S->setAssociatedStmt(Record.readSubStmt());
3054}
3055
3056//===----------------------------------------------------------------------===//
3057// HLSL Constructs/Directives.
3058//===----------------------------------------------------------------------===//
3059
3060void ASTStmtReader::VisitHLSLOutArgExpr(HLSLOutArgExpr *S) {
3061 VisitExpr(S);
3062 S->SubExprs[HLSLOutArgExpr::BaseLValue] = Record.readSubExpr();
3063 S->SubExprs[HLSLOutArgExpr::CastedTemporary] = Record.readSubExpr();
3064 S->SubExprs[HLSLOutArgExpr::WritebackCast] = Record.readSubExpr();
3065 S->IsInOut = Record.readBool();
3066}
3067
3068//===----------------------------------------------------------------------===//
3069// ASTReader Implementation
3070//===----------------------------------------------------------------------===//
3071
3073 switch (ReadingKind) {
3074 case Read_None:
3075 llvm_unreachable("should not call this when not reading anything");
3076 case Read_Decl:
3077 case Read_Type:
3078 return ReadStmtFromStream(F);
3079 case Read_Stmt:
3080 return ReadSubStmt();
3081 }
3082
3083 llvm_unreachable("ReadingKind not set ?");
3084}
3085
3087 return cast_or_null<Expr>(ReadStmt(F));
3088}
3089
3091 return cast_or_null<Expr>(ReadSubStmt());
3092}
3093
3094// Within the bitstream, expressions are stored in Reverse Polish
3095// Notation, with each of the subexpressions preceding the
3096// expression they are stored in. Subexpressions are stored from last to first.
3097// To evaluate expressions, we continue reading expressions and placing them on
3098// the stack, with expressions having operands removing those operands from the
3099// stack. Evaluation terminates when we see a STMT_STOP record, and
3100// the single remaining expression on the stack is our result.
3101Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
3102 ReadingKindTracker ReadingKind(Read_Stmt, *this);
3103 llvm::BitstreamCursor &Cursor = F.DeclsCursor;
3104
3105 // Map of offset to previously deserialized stmt. The offset points
3106 // just after the stmt record.
3107 llvm::DenseMap<uint64_t, Stmt *> StmtEntries;
3108
3109#ifndef NDEBUG
3110 unsigned PrevNumStmts = StmtStack.size();
3111#endif
3112
3113 ASTRecordReader Record(*this, F);
3114 ASTStmtReader Reader(Record, Cursor);
3116
3117 while (true) {
3119 Cursor.advanceSkippingSubblocks();
3120 if (!MaybeEntry) {
3121 Error(toString(MaybeEntry.takeError()));
3122 return nullptr;
3123 }
3124 llvm::BitstreamEntry Entry = MaybeEntry.get();
3125
3126 switch (Entry.Kind) {
3127 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
3128 case llvm::BitstreamEntry::Error:
3129 Error("malformed block record in AST file");
3130 return nullptr;
3131 case llvm::BitstreamEntry::EndBlock:
3132 goto Done;
3133 case llvm::BitstreamEntry::Record:
3134 // The interesting case.
3135 break;
3136 }
3137
3138 ASTContext &Context = getContext();
3139 Stmt *S = nullptr;
3140 bool Finished = false;
3141 bool IsStmtReference = false;
3142 Expected<unsigned> MaybeStmtCode = Record.readRecord(Cursor, Entry.ID);
3143 if (!MaybeStmtCode) {
3144 Error(toString(MaybeStmtCode.takeError()));
3145 return nullptr;
3146 }
3147 switch ((StmtCode)MaybeStmtCode.get()) {
3148 case STMT_STOP:
3149 Finished = true;
3150 break;
3151
3152 case STMT_REF_PTR:
3153 IsStmtReference = true;
3154 assert(StmtEntries.contains(Record[0]) &&
3155 "No stmt was recorded for this offset reference!");
3156 S = StmtEntries[Record.readInt()];
3157 break;
3158
3159 case STMT_NULL_PTR:
3160 S = nullptr;
3161 break;
3162
3163 case STMT_NULL:
3164 S = new (Context) NullStmt(Empty);
3165 break;
3166
3167 case STMT_COMPOUND: {
3168 unsigned NumStmts = Record[ASTStmtReader::NumStmtFields];
3169 bool HasFPFeatures = Record[ASTStmtReader::NumStmtFields + 1];
3170 S = CompoundStmt::CreateEmpty(Context, NumStmts, HasFPFeatures);
3171 break;
3172 }
3173
3174 case STMT_CASE:
3176 Context,
3177 /*CaseStmtIsGNURange*/ Record[ASTStmtReader::NumStmtFields + 3]);
3178 break;
3179
3180 case STMT_DEFAULT:
3181 S = new (Context) DefaultStmt(Empty);
3182 break;
3183
3184 case STMT_LABEL:
3185 S = new (Context) LabelStmt(Empty);
3186 break;
3187
3188 case STMT_ATTRIBUTED:
3190 Context,
3192 break;
3193
3194 case STMT_IF: {
3195 BitsUnpacker IfStmtBits(Record[ASTStmtReader::NumStmtFields]);
3196 bool HasElse = IfStmtBits.getNextBit();
3197 bool HasVar = IfStmtBits.getNextBit();
3198 bool HasInit = IfStmtBits.getNextBit();
3199 S = IfStmt::CreateEmpty(Context, HasElse, HasVar, HasInit);
3200 break;
3201 }
3202
3203 case STMT_SWITCH:
3205 Context,
3207 /* HasVar=*/Record[ASTStmtReader::NumStmtFields + 1]);
3208 break;
3209
3210 case STMT_WHILE:
3212 Context,
3214 break;
3215
3216 case STMT_DO:
3217 S = new (Context) DoStmt(Empty);
3218 break;
3219
3220 case STMT_FOR:
3221 S = new (Context) ForStmt(Empty);
3222 break;
3223
3224 case STMT_GOTO:
3225 S = new (Context) GotoStmt(Empty);
3226 break;
3227
3228 case STMT_INDIRECT_GOTO:
3229 S = new (Context) IndirectGotoStmt(Empty);
3230 break;
3231
3232 case STMT_CONTINUE:
3233 S = new (Context) ContinueStmt(Empty);
3234 break;
3235
3236 case STMT_BREAK:
3237 S = new (Context) BreakStmt(Empty);
3238 break;
3239
3240 case STMT_DEFER:
3241 S = DeferStmt::CreateEmpty(Context, Empty);
3242 break;
3243
3244 case STMT_RETURN:
3246 Context, /* HasNRVOCandidate=*/Record[ASTStmtReader::NumStmtFields]);
3247 break;
3248
3249 case STMT_DECL:
3250 S = new (Context) DeclStmt(Empty);
3251 break;
3252
3253 case STMT_GCCASM:
3254 S = new (Context) GCCAsmStmt(Empty);
3255 break;
3256
3257 case STMT_MSASM:
3258 S = new (Context) MSAsmStmt(Empty);
3259 break;
3260
3261 case STMT_CAPTURED:
3264 break;
3265
3267 S = new (Context) SYCLKernelCallStmt(Empty);
3268 break;
3269
3270 case EXPR_CONSTANT:
3272 Context, static_cast<ConstantResultStorageKind>(
3273 /*StorageKind=*/Record[ASTStmtReader::NumExprFields]));
3274 break;
3275
3278 break;
3279
3282 break;
3283
3286 break;
3287
3288 case EXPR_PREDEFINED:
3290 Context,
3291 /*HasFunctionName*/ Record[ASTStmtReader::NumExprFields]);
3292 break;
3293
3294 case EXPR_DECL_REF: {
3295 BitsUnpacker DeclRefExprBits(Record[ASTStmtReader::NumExprFields]);
3296 DeclRefExprBits.advance(5);
3297 bool HasFoundDecl = DeclRefExprBits.getNextBit();
3298 bool HasQualifier = DeclRefExprBits.getNextBit();
3299 bool HasTemplateKWAndArgsInfo = DeclRefExprBits.getNextBit();
3300 unsigned NumTemplateArgs = HasTemplateKWAndArgsInfo
3302 : 0;
3303 S = DeclRefExpr::CreateEmpty(Context, HasQualifier, HasFoundDecl,
3304 HasTemplateKWAndArgsInfo, NumTemplateArgs);
3305 break;
3306 }
3307
3309 S = IntegerLiteral::Create(Context, Empty);
3310 break;
3311
3313 S = FixedPointLiteral::Create(Context, Empty);
3314 break;
3315
3317 S = FloatingLiteral::Create(Context, Empty);
3318 break;
3319
3321 S = new (Context) ImaginaryLiteral(Empty);
3322 break;
3323
3326 Context,
3327 /* NumConcatenated=*/Record[ASTStmtReader::NumExprFields],
3328 /* Length=*/Record[ASTStmtReader::NumExprFields + 1],
3329 /* CharByteWidth=*/Record[ASTStmtReader::NumExprFields + 2]);
3330 break;
3331
3333 S = new (Context) CharacterLiteral(Empty);
3334 break;
3335
3336 case EXPR_PAREN:
3337 S = new (Context) ParenExpr(Empty);
3338 break;
3339
3340 case EXPR_PAREN_LIST:
3342 Context,
3343 /* NumExprs=*/Record[ASTStmtReader::NumExprFields]);
3344 break;
3345
3346 case EXPR_UNARY_OPERATOR: {
3347 BitsUnpacker UnaryOperatorBits(Record[ASTStmtReader::NumStmtFields]);
3348 UnaryOperatorBits.advance(ASTStmtReader::NumExprBits);
3349 bool HasFPFeatures = UnaryOperatorBits.getNextBit();
3350 S = UnaryOperator::CreateEmpty(Context, HasFPFeatures);
3351 break;
3352 }
3353
3354 case EXPR_OFFSETOF:
3355 S = OffsetOfExpr::CreateEmpty(Context,
3358 break;
3359
3361 S = new (Context) UnaryExprOrTypeTraitExpr(Empty);
3362 break;
3363
3365 S = new (Context) ArraySubscriptExpr(Empty);
3366 break;
3367
3369 S = new (Context) MatrixSubscriptExpr(Empty);
3370 break;
3371
3372 case EXPR_ARRAY_SECTION:
3373 S = new (Context) ArraySectionExpr(Empty);
3374 break;
3375
3379 break;
3380
3381 case EXPR_OMP_ITERATOR:
3382 S = OMPIteratorExpr::CreateEmpty(Context,
3384 break;
3385
3386 case EXPR_CALL: {
3387 auto NumArgs = Record[ASTStmtReader::NumExprFields];
3388 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);
3389 CallExprBits.advance(1);
3390 auto HasFPFeatures = CallExprBits.getNextBit();
3391 S = CallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures, Empty);
3392 break;
3393 }
3394
3395 case EXPR_RECOVERY:
3397 Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
3398 break;
3399
3400 case EXPR_MEMBER: {
3401 BitsUnpacker ExprMemberBits(Record[ASTStmtReader::NumExprFields]);
3402 bool HasQualifier = ExprMemberBits.getNextBit();
3403 bool HasFoundDecl = ExprMemberBits.getNextBit();
3404 bool HasTemplateInfo = ExprMemberBits.getNextBit();
3405 unsigned NumTemplateArgs = Record[ASTStmtReader::NumExprFields + 1];
3406 S = MemberExpr::CreateEmpty(Context, HasQualifier, HasFoundDecl,
3407 HasTemplateInfo, NumTemplateArgs);
3408 break;
3409 }
3410
3411 case EXPR_BINARY_OPERATOR: {
3412 BitsUnpacker BinaryOperatorBits(Record[ASTStmtReader::NumExprFields]);
3413 BinaryOperatorBits.advance(/*Size of opcode*/ 6);
3414 bool HasFPFeatures = BinaryOperatorBits.getNextBit();
3415 S = BinaryOperator::CreateEmpty(Context, HasFPFeatures);
3416 break;
3417 }
3418
3420 BitsUnpacker BinaryOperatorBits(Record[ASTStmtReader::NumExprFields]);
3421 BinaryOperatorBits.advance(/*Size of opcode*/ 6);
3422 bool HasFPFeatures = BinaryOperatorBits.getNextBit();
3423 S = CompoundAssignOperator::CreateEmpty(Context, HasFPFeatures);
3424 break;
3425 }
3426
3428 S = new (Context) ConditionalOperator(Empty);
3429 break;
3430
3432 S = new (Context) BinaryConditionalOperator(Empty);
3433 break;
3434
3435 case EXPR_IMPLICIT_CAST: {
3436 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
3437 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);
3438 CastExprBits.advance(7);
3439 bool HasFPFeatures = CastExprBits.getNextBit();
3440 S = ImplicitCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);
3441 break;
3442 }
3443
3444 case EXPR_CSTYLE_CAST: {
3445 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
3446 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);
3447 CastExprBits.advance(7);
3448 bool HasFPFeatures = CastExprBits.getNextBit();
3449 S = CStyleCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);
3450 break;
3451 }
3452
3454 S = new (Context) CompoundLiteralExpr(Empty);
3455 break;
3456
3458 S = new (Context) ExtVectorElementExpr(Empty);
3459 break;
3460
3462 S = new (Context) MatrixElementExpr(Empty);
3463 break;
3464
3465 case EXPR_INIT_LIST:
3466 S = new (Context) InitListExpr(Empty);
3467 break;
3468
3472
3473 break;
3474
3476 S = new (Context) DesignatedInitUpdateExpr(Empty);
3477 break;
3478
3480 S = new (Context) ImplicitValueInitExpr(Empty);
3481 break;
3482
3483 case EXPR_NO_INIT:
3484 S = new (Context) NoInitExpr(Empty);
3485 break;
3486
3488 S = new (Context) ArrayInitLoopExpr(Empty);
3489 break;
3490
3492 S = new (Context) ArrayInitIndexExpr(Empty);
3493 break;
3494
3495 case EXPR_VA_ARG:
3496 S = new (Context) VAArgExpr(Empty);
3497 break;
3498
3499 case EXPR_SOURCE_LOC:
3500 S = new (Context) SourceLocExpr(Empty);
3501 break;
3502
3504 S = new (Context) EmbedExpr(Empty);
3505 break;
3506
3507 case EXPR_ADDR_LABEL:
3508 S = new (Context) AddrLabelExpr(Empty);
3509 break;
3510
3511 case EXPR_STMT:
3512 S = new (Context) StmtExpr(Empty);
3513 break;
3514
3515 case EXPR_CHOOSE:
3516 S = new (Context) ChooseExpr(Empty);
3517 break;
3518
3519 case EXPR_GNU_NULL:
3520 S = new (Context) GNUNullExpr(Empty);
3521 break;
3522
3524 S = new (Context) ShuffleVectorExpr(Empty);
3525 break;
3526
3527 case EXPR_CONVERT_VECTOR: {
3528 BitsUnpacker ConvertVectorExprBits(Record[ASTStmtReader::NumStmtFields]);
3529 ConvertVectorExprBits.advance(ASTStmtReader::NumExprBits);
3530 bool HasFPFeatures = ConvertVectorExprBits.getNextBit();
3531 S = ConvertVectorExpr::CreateEmpty(Context, HasFPFeatures);
3532 break;
3533 }
3534
3535 case EXPR_BLOCK:
3536 S = new (Context) BlockExpr(Empty);
3537 break;
3538
3541 Context,
3542 /*NumAssocs=*/Record[ASTStmtReader::NumExprFields]);
3543 break;
3544
3546 S = new (Context) ObjCStringLiteral(Empty);
3547 break;
3548
3550 S = new (Context) ObjCBoxedExpr(Empty);
3551 break;
3552
3556 break;
3557
3562 break;
3563
3564 case EXPR_OBJC_ENCODE:
3565 S = new (Context) ObjCEncodeExpr(Empty);
3566 break;
3567
3569 S = new (Context) ObjCSelectorExpr(Empty);
3570 break;
3571
3573 S = new (Context) ObjCProtocolExpr(Empty);
3574 break;
3575
3577 S = new (Context) ObjCIvarRefExpr(Empty);
3578 break;
3579
3581 S = new (Context) ObjCPropertyRefExpr(Empty);
3582 break;
3583
3585 S = new (Context) ObjCSubscriptRefExpr(Empty);
3586 break;
3587
3589 llvm_unreachable("mismatching AST file");
3590
3592 S = ObjCMessageExpr::CreateEmpty(Context,
3595 break;
3596
3597 case EXPR_OBJC_ISA:
3598 S = new (Context) ObjCIsaExpr(Empty);
3599 break;
3600
3602 S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);
3603 break;
3604
3606 S = new (Context) ObjCBridgedCastExpr(Empty);
3607 break;
3608
3610 S = new (Context) ObjCForCollectionStmt(Empty);
3611 break;
3612
3613 case STMT_OBJC_CATCH:
3614 S = new (Context) ObjCAtCatchStmt(Empty);
3615 break;
3616
3617 case STMT_OBJC_FINALLY:
3618 S = new (Context) ObjCAtFinallyStmt(Empty);
3619 break;
3620
3621 case STMT_OBJC_AT_TRY:
3622 S = ObjCAtTryStmt::CreateEmpty(Context,
3625 break;
3626
3628 S = new (Context) ObjCAtSynchronizedStmt(Empty);
3629 break;
3630
3631 case STMT_OBJC_AT_THROW:
3632 S = new (Context) ObjCAtThrowStmt(Empty);
3633 break;
3634
3636 S = new (Context) ObjCAutoreleasePoolStmt(Empty);
3637 break;
3638
3640 S = new (Context) ObjCBoolLiteralExpr(Empty);
3641 break;
3642
3644 S = new (Context) ObjCAvailabilityCheckExpr(Empty);
3645 break;
3646
3647 case STMT_SEH_LEAVE:
3648 S = new (Context) SEHLeaveStmt(Empty);
3649 break;
3650
3651 case STMT_SEH_EXCEPT:
3652 S = new (Context) SEHExceptStmt(Empty);
3653 break;
3654
3655 case STMT_SEH_FINALLY:
3656 S = new (Context) SEHFinallyStmt(Empty);
3657 break;
3658
3659 case STMT_SEH_TRY:
3660 S = new (Context) SEHTryStmt(Empty);
3661 break;
3662
3663 case STMT_CXX_CATCH:
3664 S = new (Context) CXXCatchStmt(Empty);
3665 break;
3666
3667 case STMT_CXX_TRY:
3668 S = CXXTryStmt::Create(Context, Empty,
3669 /*numHandlers=*/Record[ASTStmtReader::NumStmtFields]);
3670 break;
3671
3674 Context, Empty,
3677 break;
3678
3683 break;
3684
3685 case STMT_CXX_FOR_RANGE:
3686 S = new (Context) CXXForRangeStmt(Empty);
3687 break;
3688
3690 S = new (Context) MSDependentExistsStmt(SourceLocation(), true,
3691 NestedNameSpecifierLoc(),
3692 DeclarationNameInfo(),
3693 nullptr);
3694 break;
3695
3697 S = OMPCanonicalLoop::createEmpty(Context);
3698 break;
3699
3703 break;
3704
3706 S =
3707 OMPParallelDirective::CreateEmpty(Context,
3709 Empty);
3710 break;
3711
3713 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3714 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3715 S = OMPSimdDirective::CreateEmpty(Context, NumClauses,
3716 CollapsedNum, Empty);
3717 break;
3718 }
3719
3721 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];
3722 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3723 S = OMPTileDirective::CreateEmpty(Context, NumClauses, NumLoops);
3724 break;
3725 }
3726
3728 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];
3729 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3730 S = OMPStripeDirective::CreateEmpty(Context, NumClauses, NumLoops);
3731 break;
3732 }
3733
3735 assert(Record[ASTStmtReader::NumStmtFields] == 1 && "Unroll directive accepts only a single loop");
3736 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3737 S = OMPUnrollDirective::CreateEmpty(Context, NumClauses);
3738 break;
3739 }
3740
3742 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];
3743 assert(Record[ASTStmtReader::NumStmtFields + 1] == 0 &&
3744 "Reverse directive has no clauses");
3745 S = OMPReverseDirective::CreateEmpty(Context, NumLoops);
3746 break;
3747 }
3748
3750 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];
3751 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3752 S = OMPSplitDirective::CreateEmpty(Context, NumClauses, NumLoops);
3753 break;
3754 }
3755
3757 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3758 S = OMPFuseDirective::CreateEmpty(Context, NumClauses);
3759 break;
3760 }
3761
3763 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];
3764 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3765 S = OMPInterchangeDirective::CreateEmpty(Context, NumClauses, NumLoops);
3766 break;
3767 }
3768
3770 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3771 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3772 S = OMPForDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3773 Empty);
3774 break;
3775 }
3776
3778 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3779 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3780 S = OMPForSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3781 Empty);
3782 break;
3783 }
3784
3786 S = OMPSectionsDirective::CreateEmpty(
3788 break;
3789
3791 S = OMPSectionDirective::CreateEmpty(Context, Empty);
3792 break;
3793
3795 S = OMPScopeDirective::CreateEmpty(
3797 break;
3798
3800 S = OMPSingleDirective::CreateEmpty(
3802 break;
3803
3805 S = OMPMasterDirective::CreateEmpty(Context, Empty);
3806 break;
3807
3809 S = OMPCriticalDirective::CreateEmpty(
3811 break;
3812
3814 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3815 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3816 S = OMPParallelForDirective::CreateEmpty(Context, NumClauses,
3817 CollapsedNum, Empty);
3818 break;
3819 }
3820
3822 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3823 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3824 S = OMPParallelForSimdDirective::CreateEmpty(Context, NumClauses,
3825 CollapsedNum, Empty);
3826 break;
3827 }
3828
3830 S = OMPParallelMasterDirective::CreateEmpty(
3832 break;
3833
3835 S = OMPParallelMaskedDirective::CreateEmpty(
3837 break;
3838
3840 S = OMPParallelSectionsDirective::CreateEmpty(
3842 break;
3843
3845 S = OMPTaskDirective::CreateEmpty(
3847 break;
3848
3850 S = OMPTaskyieldDirective::CreateEmpty(Context, Empty);
3851 break;
3852
3854 S = OMPBarrierDirective::CreateEmpty(Context, Empty);
3855 break;
3856
3858 S = OMPTaskwaitDirective::CreateEmpty(
3860 break;
3861
3865 break;
3866
3868 S = OMPTaskgroupDirective::CreateEmpty(
3870 break;
3871
3873 S = OMPFlushDirective::CreateEmpty(
3875 break;
3876
3878 S = OMPDepobjDirective::CreateEmpty(
3880 break;
3881
3885 break;
3886
3888 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3889 S = OMPOrderedStandaloneDirective::CreateEmpty(Context, NumClauses,
3890 Empty);
3891 break;
3892 }
3893
3895 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3896 S = OMPOrderedBlockAssocDirective::CreateEmpty(Context, NumClauses,
3897 Empty);
3898 break;
3899 }
3900
3902 S = OMPAtomicDirective::CreateEmpty(
3904 break;
3905
3909 break;
3910
3914 break;
3915
3919 break;
3920
3924 break;
3925
3929 break;
3930
3932 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3933 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3934 S = OMPTargetParallelForDirective::CreateEmpty(Context, NumClauses,
3935 CollapsedNum, Empty);
3936 break;
3937 }
3938
3942 break;
3943
3947 break;
3948
3951 break;
3952
3956 break;
3957
3959 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3960 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3961 S = OMPTaskLoopDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3962 Empty);
3963 break;
3964 }
3965
3967 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3968 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3969 S = OMPTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,
3970 CollapsedNum, Empty);
3971 break;
3972 }
3973
3975 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3976 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3977 S = OMPMasterTaskLoopDirective::CreateEmpty(Context, NumClauses,
3978 CollapsedNum, Empty);
3979 break;
3980 }
3981
3983 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3984 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3985 S = OMPMaskedTaskLoopDirective::CreateEmpty(Context, NumClauses,
3986 CollapsedNum, Empty);
3987 break;
3988 }
3989
3991 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3992 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3993 S = OMPMasterTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,
3994 CollapsedNum, Empty);
3995 break;
3996 }
3997
3999 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4000 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4001 S = OMPMaskedTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,
4002 CollapsedNum, Empty);
4003 break;
4004 }
4005
4007 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4008 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4010 CollapsedNum, Empty);
4011 break;
4012 }
4013
4015 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4016 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4018 CollapsedNum, Empty);
4019 break;
4020 }
4021
4023 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4024 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4026 Context, NumClauses, CollapsedNum, Empty);
4027 break;
4028 }
4029
4031 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4032 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4034 Context, NumClauses, CollapsedNum, Empty);
4035 break;
4036 }
4037
4039 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4040 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4041 S = OMPDistributeDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
4042 Empty);
4043 break;
4044 }
4045
4047 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4048 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4049 S = OMPDistributeParallelForDirective::CreateEmpty(Context, NumClauses,
4050 CollapsedNum, Empty);
4051 break;
4052 }
4053
4055 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4056 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4058 CollapsedNum,
4059 Empty);
4060 break;
4061 }
4062
4064 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4065 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4066 S = OMPDistributeSimdDirective::CreateEmpty(Context, NumClauses,
4067 CollapsedNum, Empty);
4068 break;
4069 }
4070
4072 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4073 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4074 S = OMPTargetParallelForSimdDirective::CreateEmpty(Context, NumClauses,
4075 CollapsedNum, Empty);
4076 break;
4077 }
4078
4080 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4081 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4082 S = OMPTargetSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
4083 Empty);
4084 break;
4085 }
4086
4088 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4089 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4090 S = OMPTeamsDistributeDirective::CreateEmpty(Context, NumClauses,
4091 CollapsedNum, Empty);
4092 break;
4093 }
4094
4096 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4097 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4098 S = OMPTeamsDistributeSimdDirective::CreateEmpty(Context, NumClauses,
4099 CollapsedNum, Empty);
4100 break;
4101 }
4102
4104 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4105 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4107 Context, NumClauses, CollapsedNum, Empty);
4108 break;
4109 }
4110
4112 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4113 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4115 Context, NumClauses, CollapsedNum, Empty);
4116 break;
4117 }
4118
4122 break;
4123
4125 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4126 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4127 S = OMPTargetTeamsDistributeDirective::CreateEmpty(Context, NumClauses,
4128 CollapsedNum, Empty);
4129 break;
4130 }
4131
4133 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4134 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4136 Context, NumClauses, CollapsedNum, Empty);
4137 break;
4138 }
4139
4141 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4142 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4144 Context, NumClauses, CollapsedNum, Empty);
4145 break;
4146 }
4147
4149 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4150 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4152 Context, NumClauses, CollapsedNum, Empty);
4153 break;
4154 }
4155
4159 break;
4160
4164 break;
4165
4169 break;
4170
4172 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4173 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4174 S = OMPGenericLoopDirective::CreateEmpty(Context, NumClauses,
4175 CollapsedNum, Empty);
4176 break;
4177 }
4178
4180 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4181 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4182 S = OMPTeamsGenericLoopDirective::CreateEmpty(Context, NumClauses,
4183 CollapsedNum, Empty);
4184 break;
4185 }
4186
4188 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4189 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4191 CollapsedNum, Empty);
4192 break;
4193 }
4194
4196 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4197 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4198 S = OMPParallelGenericLoopDirective::CreateEmpty(Context, NumClauses,
4199 CollapsedNum, Empty);
4200 break;
4201 }
4202
4204 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4205 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4207 Context, NumClauses, CollapsedNum, Empty);
4208 break;
4209 }
4210
4212 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4213 S = OMPAssumeDirective::CreateEmpty(Context, NumClauses, Empty);
4214 break;
4215 }
4216
4218 auto NumArgs = Record[ASTStmtReader::NumExprFields];
4219 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4220 CallExprBits.advance(1);
4221 auto HasFPFeatures = CallExprBits.getNextBit();
4222 S = CXXOperatorCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
4223 Empty);
4224 break;
4225 }
4226
4227 case EXPR_CXX_MEMBER_CALL: {
4228 auto NumArgs = Record[ASTStmtReader::NumExprFields];
4229 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4230 CallExprBits.advance(1);
4231 auto HasFPFeatures = CallExprBits.getNextBit();
4232 S = CXXMemberCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
4233 Empty);
4234 break;
4235 }
4236
4238 S = new (Context) CXXRewrittenBinaryOperator(Empty);
4239 break;
4240
4241 case EXPR_CXX_CONSTRUCT:
4243 Context,
4244 /* NumArgs=*/Record[ASTStmtReader::NumExprFields]);
4245 break;
4246
4248 S = new (Context) CXXInheritedCtorInitExpr(Empty);
4249 break;
4250
4253 Context,
4254 /* NumArgs=*/Record[ASTStmtReader::NumExprFields]);
4255 break;
4256
4257 case EXPR_CXX_STATIC_CAST: {
4258 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
4259 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4260 CastExprBits.advance(7);
4261 bool HasFPFeatures = CastExprBits.getNextBit();
4262 S = CXXStaticCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);
4263 break;
4264 }
4265
4266 case EXPR_CXX_DYNAMIC_CAST: {
4267 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
4268 S = CXXDynamicCastExpr::CreateEmpty(Context, PathSize);
4269 break;
4270 }
4271
4273 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
4274 S = CXXReinterpretCastExpr::CreateEmpty(Context, PathSize);
4275 break;
4276 }
4277
4279 S = CXXConstCastExpr::CreateEmpty(Context);
4280 break;
4281
4284 break;
4285
4287 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
4288 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4289 CastExprBits.advance(7);
4290 bool HasFPFeatures = CastExprBits.getNextBit();
4291 S = CXXFunctionalCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);
4292 break;
4293 }
4294
4295 case EXPR_BUILTIN_BIT_CAST: {
4296#ifndef NDEBUG
4297 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
4298 assert(PathSize == 0 && "Wrong PathSize!");
4299#endif
4300 S = new (Context) BuiltinBitCastExpr(Empty);
4301 break;
4302 }
4303
4305 auto NumArgs = Record[ASTStmtReader::NumExprFields];
4306 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4307 CallExprBits.advance(1);
4308 auto HasFPFeatures = CallExprBits.getNextBit();
4309 S = UserDefinedLiteral::CreateEmpty(Context, NumArgs, HasFPFeatures,
4310 Empty);
4311 break;
4312 }
4313
4315 S = new (Context) CXXStdInitializerListExpr(Empty);
4316 break;
4317
4319 S = new (Context) CXXBoolLiteralExpr(Empty);
4320 break;
4321
4323 S = new (Context) CXXNullPtrLiteralExpr(Empty);
4324 break;
4325
4327 S = new (Context) CXXTypeidExpr(Empty, true);
4328 break;
4329
4331 S = new (Context) CXXTypeidExpr(Empty, false);
4332 break;
4333
4335 S = new (Context) CXXUuidofExpr(Empty, true);
4336 break;
4337
4339 S = new (Context) MSPropertyRefExpr(Empty);
4340 break;
4341
4343 S = new (Context) MSPropertySubscriptExpr(Empty);
4344 break;
4345
4347 S = new (Context) CXXUuidofExpr(Empty, false);
4348 break;
4349
4350 case EXPR_CXX_THIS:
4351 S = CXXThisExpr::CreateEmpty(Context);
4352 break;
4353
4354 case EXPR_CXX_THROW:
4355 S = new (Context) CXXThrowExpr(Empty);
4356 break;
4357
4360 Context, /*HasRewrittenInit=*/Record[ASTStmtReader::NumExprFields]);
4361 break;
4362
4365 Context, /*HasRewrittenInit=*/Record[ASTStmtReader::NumExprFields]);
4366 break;
4367
4369 S = new (Context) CXXBindTemporaryExpr(Empty);
4370 break;
4371
4373 S = new (Context) CXXScalarValueInitExpr(Empty);
4374 break;
4375
4376 case EXPR_CXX_NEW:
4378 Context,
4380 /*HasInit=*/Record[ASTStmtReader::NumExprFields + 1],
4381 /*NumPlacementArgs=*/Record[ASTStmtReader::NumExprFields + 2],
4382 /*IsParenTypeId=*/Record[ASTStmtReader::NumExprFields + 3]);
4383 break;
4384
4385 case EXPR_CXX_DELETE:
4386 S = new (Context) CXXDeleteExpr(Empty);
4387 break;
4388
4390 S = new (Context) CXXPseudoDestructorExpr(Empty);
4391 break;
4392
4394 S = ExprWithCleanups::Create(Context, Empty,
4396 break;
4397
4399 unsigned NumTemplateArgs = Record[ASTStmtReader::NumExprFields];
4400 BitsUnpacker DependentScopeMemberBits(
4402 bool HasTemplateKWAndArgsInfo = DependentScopeMemberBits.getNextBit();
4403
4404 bool HasFirstQualifierFoundInScope =
4405 DependentScopeMemberBits.getNextBit();
4407 Context, HasTemplateKWAndArgsInfo, NumTemplateArgs,
4408 HasFirstQualifierFoundInScope);
4409 break;
4410 }
4411
4413 BitsUnpacker DependentScopeDeclRefBits(
4415 DependentScopeDeclRefBits.advance(ASTStmtReader::NumExprBits);
4416 bool HasTemplateKWAndArgsInfo = DependentScopeDeclRefBits.getNextBit();
4417 unsigned NumTemplateArgs =
4418 HasTemplateKWAndArgsInfo
4419 ? DependentScopeDeclRefBits.getNextBits(/*Width=*/16)
4420 : 0;
4422 Context, HasTemplateKWAndArgsInfo, NumTemplateArgs);
4423 break;
4424 }
4425
4429 break;
4430
4432 auto NumResults = Record[ASTStmtReader::NumExprFields];
4433 BitsUnpacker OverloadExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4434 auto HasTemplateKWAndArgsInfo = OverloadExprBits.getNextBit();
4435 auto NumTemplateArgs = HasTemplateKWAndArgsInfo
4437 : 0;
4439 Context, NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
4440 break;
4441 }
4442
4444 auto NumResults = Record[ASTStmtReader::NumExprFields];
4445 BitsUnpacker OverloadExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4446 auto HasTemplateKWAndArgsInfo = OverloadExprBits.getNextBit();
4447 auto NumTemplateArgs = HasTemplateKWAndArgsInfo
4449 : 0;
4451 Context, NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
4452 break;
4453 }
4454
4455 case EXPR_TYPE_TRAIT:
4459 break;
4460
4462 S = new (Context) ArrayTypeTraitExpr(Empty);
4463 break;
4464
4466 S = new (Context) ExpressionTraitExpr(Empty);
4467 break;
4468
4469 case EXPR_CXX_NOEXCEPT:
4470 S = new (Context) CXXNoexceptExpr(Empty);
4471 break;
4472
4474 S = new (Context) PackExpansionExpr(Empty);
4475 break;
4476
4477 case EXPR_SIZEOF_PACK:
4479 Context,
4480 /*NumPartialArgs=*/Record[ASTStmtReader::NumExprFields]);
4481 break;
4482
4483 case EXPR_PACK_INDEXING:
4485 Context,
4486 /*TransformedExprs=*/Record[ASTStmtReader::NumExprFields]);
4487 break;
4488
4490 S = new (Context) SubstNonTypeTemplateParmExpr(Empty);
4491 break;
4492
4494 S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);
4495 break;
4496
4500 break;
4501
4503 S = new (Context) MaterializeTemporaryExpr(Empty);
4504 break;
4505
4506 case EXPR_CXX_FOLD:
4507 S = new (Context) CXXFoldExpr(Empty);
4508 break;
4509
4512 Context, /*numExprs=*/Record[ASTStmtReader::NumExprFields], Empty);
4513 break;
4514
4515 case EXPR_OPAQUE_VALUE:
4516 S = new (Context) OpaqueValueExpr(Empty);
4517 break;
4518
4519 case EXPR_CUDA_KERNEL_CALL: {
4520 auto NumArgs = Record[ASTStmtReader::NumExprFields];
4521 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4522 CallExprBits.advance(1);
4523 auto HasFPFeatures = CallExprBits.getNextBit();
4524 S = CUDAKernelCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
4525 Empty);
4526 break;
4527 }
4528
4529 case EXPR_ASTYPE:
4530 S = new (Context) AsTypeExpr(Empty);
4531 break;
4532
4533 case EXPR_PSEUDO_OBJECT: {
4534 unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields];
4535 S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs);
4536 break;
4537 }
4538
4539 case EXPR_ATOMIC:
4540 S = new (Context) AtomicExpr(Empty);
4541 break;
4542
4543 case EXPR_LAMBDA: {
4544 unsigned NumCaptures = Record[ASTStmtReader::NumExprFields];
4545 S = LambdaExpr::CreateDeserialized(Context, NumCaptures);
4546 break;
4547 }
4548
4549 case STMT_COROUTINE_BODY: {
4550 unsigned NumParams = Record[ASTStmtReader::NumStmtFields];
4551 S = CoroutineBodyStmt::Create(Context, Empty, NumParams);
4552 break;
4553 }
4554
4555 case STMT_CORETURN:
4556 S = new (Context) CoreturnStmt(Empty);
4557 break;
4558
4559 case EXPR_COAWAIT:
4560 S = new (Context) CoawaitExpr(Empty);
4561 break;
4562
4563 case EXPR_COYIELD:
4564 S = new (Context) CoyieldExpr(Empty);
4565 break;
4566
4568 S = new (Context) DependentCoawaitExpr(Empty);
4569 break;
4570
4572 S = new (Context) ConceptSpecializationExpr(Empty);
4573 break;
4574 }
4575
4577 S = new (Context) CXXExpansionSelectExpr(Empty);
4578 break;
4579
4581 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4582 S = OpenACCComputeConstruct::CreateEmpty(Context, NumClauses);
4583 break;
4584 }
4586 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4587 S = OpenACCLoopConstruct::CreateEmpty(Context, NumClauses);
4588 break;
4589 }
4591 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4592 S = OpenACCCombinedConstruct::CreateEmpty(Context, NumClauses);
4593 break;
4594 }
4596 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4597 S = OpenACCDataConstruct::CreateEmpty(Context, NumClauses);
4598 break;
4599 }
4601 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4602 S = OpenACCEnterDataConstruct::CreateEmpty(Context, NumClauses);
4603 break;
4604 }
4606 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4607 S = OpenACCExitDataConstruct::CreateEmpty(Context, NumClauses);
4608 break;
4609 }
4611 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4612 S = OpenACCHostDataConstruct::CreateEmpty(Context, NumClauses);
4613 break;
4614 }
4616 unsigned NumExprs = Record[ASTStmtReader::NumStmtFields];
4617 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4618 S = OpenACCWaitConstruct::CreateEmpty(Context, NumExprs, NumClauses);
4619 break;
4620 }
4622 unsigned NumVars = Record[ASTStmtReader::NumStmtFields];
4623 S = OpenACCCacheConstruct::CreateEmpty(Context, NumVars);
4624 break;
4625 }
4627 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4628 S = OpenACCInitConstruct::CreateEmpty(Context, NumClauses);
4629 break;
4630 }
4632 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4633 S = OpenACCShutdownConstruct::CreateEmpty(Context, NumClauses);
4634 break;
4635 }
4637 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4638 S = OpenACCSetConstruct::CreateEmpty(Context, NumClauses);
4639 break;
4640 }
4642 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4643 S = OpenACCUpdateConstruct::CreateEmpty(Context, NumClauses);
4644 break;
4645 }
4647 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4648 S = OpenACCAtomicConstruct::CreateEmpty(Context, NumClauses);
4649 break;
4650 }
4651 case EXPR_REQUIRES: {
4652 unsigned numLocalParameters = Record[ASTStmtReader::NumExprFields];
4653 unsigned numRequirement = Record[ASTStmtReader::NumExprFields + 1];
4654 S = RequiresExpr::Create(Context, Empty, numLocalParameters,
4655 numRequirement);
4656 break;
4657 }
4658 case EXPR_HLSL_OUT_ARG:
4659 S = HLSLOutArgExpr::CreateEmpty(Context);
4660 break;
4661 case EXPR_REFLECT: {
4662 S = CXXReflectExpr::CreateEmpty(Context);
4663 break;
4664 }
4665 }
4666
4667 // We hit a STMT_STOP, so we're done with this expression.
4668 if (Finished)
4669 break;
4670
4671 ++NumStatementsRead;
4672
4673 if (S && !IsStmtReference) {
4674 Reader.Visit(S);
4675 StmtEntries[Cursor.GetCurrentBitNo()] = S;
4676 }
4677
4678 assert(Record.getIdx() == Record.size() &&
4679 "Invalid deserialization of statement");
4680 StmtStack.push_back(S);
4681 }
4682Done:
4683 assert(StmtStack.size() > PrevNumStmts && "Read too many sub-stmts!");
4684 assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
4685 return StmtStack.pop_back_val();
4686}
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
static concepts::Requirement::SubstitutionDiagnostic * readSubstitutionDiagnostic(ASTRecordReader &Record)
static ConstraintSatisfaction readConstraintSatisfaction(ASTRecordReader &Record)
Defines enumerations for traits support.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
Definition MachO.h:31
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
Defines the Objective-C statement AST node classes.
This file defines OpenMP AST classes for executable directives and clauses.
This file defines SYCL AST classes used to represent calls to SYCL kernels.
C Language Family Type Representation.
static OMPAssumeDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
static OMPCancelDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive.
static OMPCancellationPointDirective * CreateEmpty(const ASTContext &C, EmptyShell)
Creates an empty directive.
static OMPDispatchDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPDistributeDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPDistributeParallelForDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPDistributeParallelForSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPDistributeSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPErrorDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive.
static OMPFuseDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses)
Build an empty 'pragma omp fuse' AST node for deserialization.
static OMPGenericLoopDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with a place for NumClauses clauses.
static OMPInterchangeDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned NumLoops)
Build an empty 'pragma omp interchange' AST node for deserialization.
static OMPInteropDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive.
static OMPMaskedDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive.
static OMPMaskedTaskLoopDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPMaskedTaskLoopSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPMasterTaskLoopDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPMasterTaskLoopSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPMetaDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
static OMPParallelGenericLoopDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPParallelMaskedTaskLoopDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPParallelMaskedTaskLoopSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPParallelMasterTaskLoopDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPParallelMasterTaskLoopSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPReverseDirective * CreateEmpty(const ASTContext &C, unsigned NumLoops)
Build an empty 'pragma omp reverse' AST node for deserialization.
static OMPScanDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPSplitDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned NumLoops)
Build an empty 'pragma omp split' AST node for deserialization.
static OMPStripeDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned NumLoops)
Build an empty 'pragma omp stripe' AST node for deserialization.
static OMPTargetDataDirective * CreateEmpty(const ASTContext &C, unsigned N, EmptyShell)
Creates an empty directive with the place for N clauses.
static OMPTargetDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetEnterDataDirective * CreateEmpty(const ASTContext &C, unsigned N, EmptyShell)
Creates an empty directive with the place for N clauses.
static OMPTargetExitDataDirective * CreateEmpty(const ASTContext &C, unsigned N, EmptyShell)
Creates an empty directive with the place for N clauses.
static OMPTargetParallelDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetParallelForDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetParallelForSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetParallelGenericLoopDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetTeamsDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetTeamsDistributeDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetTeamsDistributeParallelForDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetTeamsDistributeParallelForSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetTeamsDistributeSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetTeamsGenericLoopDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTargetUpdateDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTaskLoopDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTaskLoopSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTeamsDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTeamsDistributeDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTeamsDistributeParallelForDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTeamsDistributeParallelForSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTeamsDistributeSimdDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTeamsGenericLoopDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum, EmptyShell)
Creates an empty directive with the place for NumClauses clauses.
static OMPTileDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses, unsigned NumLoops)
Build an empty 'pragma omp tile' AST node for deserialization.
static OMPUnrollDirective * CreateEmpty(const ASTContext &C, unsigned NumClauses)
Build an empty 'pragma omp unroll' AST node for deserialization.
static OpenACCAtomicConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
ArrayRef< Expr * > getVarList() const
static OpenACCCacheConstruct * CreateEmpty(const ASTContext &C, unsigned NumVars)
static OpenACCCombinedConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCEnterDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCExitDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCHostDataConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCInitConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCLoopConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCSetConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCShutdownConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCUpdateConstruct * CreateEmpty(const ASTContext &C, unsigned NumClauses)
static OpenACCWaitConstruct * CreateEmpty(const ASTContext &C, unsigned NumExprs, unsigned NumClauses)
void setValue(const ASTContext &C, const llvm::APInt &Val)
bool needsCleanup() const
Returns whether the object performed allocations.
Definition APValue.cpp:436
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:223
CanQualType IntTy
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
ASTContext & getContext()
Retrieve the AST context that this AST reader supplements.
Definition ASTReader.h:2593
Stmt * ReadSubStmt()
Reads a sub-statement operand during statement reading.
Definition ASTReader.h:2548
Expr * ReadSubExpr()
Reads a sub-expression operand during statement reading.
Expr * ReadExpr(ModuleFile &F)
Reads an expression.
Stmt * ReadStmt(ModuleFile &F)
Reads a statement.
serialization::ModuleFile ModuleFile
Definition ASTReader.h:473
An object for streaming information from a record.
static const unsigned NumExprFields
The number of record fields required for the Expr class itself.
static const unsigned NumObjCObjectLiteralFields
The number of record fields required for the ObjCObjectLiteral class itself (Expr fields + isExpressi...
static const unsigned NumStmtFields
The number of record fields required for the Stmt class itself.
static const unsigned NumExprBits
The number of bits required for the packing bits for the Expr class.
void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, TemplateArgumentLoc *ArgsLocArray, unsigned NumTemplateArgs)
Read and initialize a ExplicitTemplateArgumentList structure.
ASTStmtReader(ASTRecordReader &Record, llvm::BitstreamCursor &Cursor)
AddrLabelExpr - The GNU address of label extension, representing &&label.
Definition Expr.h:4561
void setLabel(LabelDecl *L)
Definition Expr.h:4585
void setLabelLoc(SourceLocation L)
Definition Expr.h:4579
void setAmpAmpLoc(SourceLocation L)
Definition Expr.h:4577
Represents the index of the current element of an array being initialized by an ArrayInitLoopExpr.
Definition Expr.h:6038
Represents a loop initializing the elements of an array.
Definition Expr.h:5985
This class represents BOTH the OpenMP Array Section and OpenACC 'subarray', with a boolean differenti...
Definition Expr.h:7236
bool isOMPArraySection() const
Definition Expr.h:7310
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Definition Expr.h:2732
void setRHS(Expr *E)
Definition Expr.h:2767
void setRBracketLoc(SourceLocation L)
Definition Expr.h:2783
void setLHS(Expr *E)
Definition Expr.h:2763
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
Definition ExprCXX.h:2999
AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2] This AST node provides support ...
Definition Expr.h:6750
AsmStmt is the base class for GCCAsmStmt and MSAsmStmt.
Definition Stmt.h:3286
void setSimple(bool V)
Definition Stmt.h:3320
void setAsmLoc(SourceLocation L)
Definition Stmt.h:3317
void setVolatile(bool V)
Definition Stmt.h:3323
unsigned NumInputs
Definition Stmt.h:3301
unsigned getNumClobbers() const
Definition Stmt.h:3377
unsigned getNumOutputs() const
Definition Stmt.h:3345
unsigned NumOutputs
Definition Stmt.h:3300
unsigned NumClobbers
Definition Stmt.h:3302
unsigned getNumInputs() const
Definition Stmt.h:3367
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Definition Expr.h:6945
unsigned getNumSubExprs() const
Definition Expr.h:7018
Represents an attribute applied to a statement.
Definition Stmt.h:2212
static AttributedStmt * CreateEmpty(const ASTContext &C, unsigned NumAttrs)
Definition Stmt.cpp:450
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
Definition Expr.h:4464
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:4049
void setLHS(Expr *E)
Definition Expr.h:4100
void setHasStoredFPFeatures(bool B)
Set and fetch the bit that shows whether FPFeatures needs to be allocated in Trailing Storage.
Definition Expr.h:4233
void setOperatorLoc(SourceLocation L)
Definition Expr.h:4092
void setRHS(Expr *E)
Definition Expr.h:4102
void setExcludedOverflowPattern(bool B)
Set and get the bit that informs arithmetic overflow sanitizers whether or not they should exclude ce...
Definition Expr.h:4238
static BinaryOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
Definition Expr.cpp:5100
void setStoredFPFeatures(FPOptionsOverride F)
Set FPFeatures in trailing storage, used only by Serialization.
Definition Expr.h:4251
void setOpcode(Opcode Opc)
Definition Expr.h:4097
BinaryOperatorKind Opcode
Definition Expr.h:4054
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition Expr.h:6689
void setBlockDecl(BlockDecl *BD)
Definition Expr.h:6703
BreakStmt - This represents a break.
Definition Stmt.h:3144
Represents a C++2a __builtin_bit_cast(T, v) expression.
Definition ExprCXX.h:5475
CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style cast in C++ (C++ [expr....
Definition Expr.h:3980
static CStyleCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
Definition Expr.cpp:2131
void setRParenLoc(SourceLocation L)
Definition Expr.h:4016
void setLParenLoc(SourceLocation L)
Definition Expr.h:4013
Represents a call to a CUDA kernel function.
Definition ExprCXX.h:237
static CUDAKernelCallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
Definition ExprCXX.cpp:1982
A C++ addrspace_cast expression (currently only enabled for OpenCL).
Definition ExprCXX.h:607
static CXXAddrspaceCastExpr * CreateEmpty(const ASTContext &Context)
Definition ExprCXX.cpp:921
Represents binding an expression to a temporary.
Definition ExprCXX.h:1496
void setTemporary(CXXTemporary *T)
Definition ExprCXX.h:1516
A boolean literal, per ([C++ lex.bool] Boolean literals).
Definition ExprCXX.h:726
void setValue(bool V)
Definition ExprCXX.h:744
void setLocation(SourceLocation L)
Definition ExprCXX.h:750
CXXCatchStmt - This represents a C++ catch block.
Definition StmtCXX.h:29
A C++ const_cast expression (C++ [expr.const.cast]).
Definition ExprCXX.h:569
static CXXConstCastExpr * CreateEmpty(const ASTContext &Context)
Definition ExprCXX.cpp:908
Represents a call to a C++ constructor.
Definition ExprCXX.h:1551
void setArg(unsigned Arg, Expr *ArgExpr)
Set the specified argument.
Definition ExprCXX.h:1704
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
Definition ExprCXX.h:1691
static CXXConstructExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs)
Create an empty C++ construction expression.
Definition ExprCXX.cpp:1202
A default argument (C++ [dcl.fct.default]).
Definition ExprCXX.h:1273
static CXXDefaultArgExpr * CreateEmpty(const ASTContext &C, bool HasRewrittenInit)
Definition ExprCXX.cpp:1039
A use of a default initializer in a constructor or in aggregate initialization.
Definition ExprCXX.h:1380
static CXXDefaultInitExpr * CreateEmpty(const ASTContext &C, bool HasRewrittenInit)
Definition ExprCXX.cpp:1093
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2629
Represents a C++ member access expression where the actual member referenced could not be resolved be...
Definition ExprCXX.h:3869
unsigned getNumTemplateArgs() const
Retrieve the number of template arguments provided as part of this template-id.
Definition ExprCXX.h:4063
static CXXDependentScopeMemberExpr * CreateEmpty(const ASTContext &Ctx, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs, bool HasFirstQualifierFoundInScope)
Definition ExprCXX.cpp:1578
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Definition ExprCXX.h:484
static CXXDynamicCastExpr * CreateEmpty(const ASTContext &Context, unsigned pathSize)
Definition ExprCXX.cpp:831
Helper that selects an expression from an InitListExpr depending on the current expansion index.
Definition ExprCXX.h:5557
void setRangeExpr(InitListExpr *E)
Definition ExprCXX.h:5573
Represents the code generated for an expanded expansion statement.
Definition StmtCXX.h:1028
ArrayRef< Stmt * > getAllSubStmts() const
Definition StmtCXX.h:1057
static CXXExpansionStmtInstantiation * CreateEmpty(ASTContext &C, EmptyShell Empty, unsigned NumInstantiations, unsigned NumPreambleStmts)
Definition StmtCXX.cpp:274
void setShouldApplyLifetimeExtensionToPreamble(bool Apply)
Definition StmtCXX.h:1081
CXXExpansionStmtPattern - Represents an unexpanded C++ expansion statement.
Definition StmtCXX.h:675
static CXXExpansionStmtPattern * CreateEmpty(ASTContext &Context, EmptyShell Empty, ExpansionStmtKind Kind)
Definition StmtCXX.cpp:180
Represents a folding of a pack over an operator.
Definition ExprCXX.h:5031
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
Definition StmtCXX.h:136
void setLoopVarStmt(Stmt *S)
Definition StmtCXX.h:200
void setRangeStmt(Stmt *S)
Definition StmtCXX.h:195
void setEndStmt(Stmt *S)
Definition StmtCXX.h:197
void setInc(Expr *E)
Definition StmtCXX.h:199
void setBeginStmt(Stmt *S)
Definition StmtCXX.h:196
void setInit(Stmt *S)
Definition StmtCXX.h:193
void setBody(Stmt *S)
Definition StmtCXX.h:201
void setCond(Expr *E)
Definition StmtCXX.h:198
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Definition ExprCXX.h:1834
void setLParenLoc(SourceLocation L)
Definition ExprCXX.h:1872
static CXXFunctionalCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
Definition ExprCXX.cpp:941
void setRParenLoc(SourceLocation L)
Definition ExprCXX.h:1874
Represents a call to an inherited base class constructor from an inheriting constructor.
Definition ExprCXX.h:1754
Represents a call to a member function that may be written either with member call syntax (e....
Definition ExprCXX.h:182
static CXXMemberCallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
Definition ExprCXX.cpp:716
Abstract class common to all of the C++ "named"/"keyword" casts.
Definition ExprCXX.h:378
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition ExprCXX.h:2358
static CXXNewExpr * CreateEmpty(const ASTContext &Ctx, bool IsArray, bool HasInit, unsigned NumPlacementArgs, bool IsParenTypeId)
Create an empty c++ new expression.
Definition ExprCXX.cpp:320
bool isArray() const
Definition ExprCXX.h:2467
bool hasInitializer() const
Whether this new-expression has any initializer at all.
Definition ExprCXX.h:2527
Stmt ** raw_arg_iterator
Definition ExprCXX.h:2596
void setOperatorDelete(FunctionDecl *D)
Definition ExprCXX.h:2465
unsigned getNumPlacementArgs() const
Definition ExprCXX.h:2497
bool isParenTypeId() const
Definition ExprCXX.h:2518
raw_arg_iterator raw_arg_end()
Definition ExprCXX.h:2599
raw_arg_iterator raw_arg_begin()
Definition ExprCXX.h:2598
void setOperatorNew(FunctionDecl *D)
Definition ExprCXX.h:2463
Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
Definition ExprCXX.h:4308
The null pointer literal (C++11 [lex.nullptr])
Definition ExprCXX.h:771
void setLocation(SourceLocation L)
Definition ExprCXX.h:786
A call to an overloaded operator written using operator syntax.
Definition ExprCXX.h:84
static CXXOperatorCallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
Definition ExprCXX.cpp:646
Represents a list-initialization with parenthesis.
Definition ExprCXX.h:5140
void setInitializedFieldInUnion(FieldDecl *FD)
Definition ExprCXX.h:5214
static CXXParenListInitExpr * CreateEmpty(ASTContext &C, unsigned numExprs, EmptyShell Empty)
Definition ExprCXX.cpp:2006
void setArrayFiller(Expr *E)
Definition ExprCXX.h:5204
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Definition ExprCXX.h:2748
void setDestroyedType(IdentifierInfo *II, SourceLocation Loc)
Set the name of destroyed type for a dependent pseudo-destructor expression.
Definition ExprCXX.h:2863
Represents a C++26 reflect expression [expr.reflect].
Definition ExprCXX.h:5507
static CXXReflectExpr * CreateEmpty(ASTContext &C)
Definition ExprCXX.cpp:1948
A C++ reinterpret_cast expression (C++ [expr.reinterpret.cast]).
Definition ExprCXX.h:529
static CXXReinterpretCastExpr * CreateEmpty(const ASTContext &Context, unsigned pathSize)
Definition ExprCXX.cpp:894
A rewritten comparison expression that was originally written using operator syntax.
Definition ExprCXX.h:289
An expression "T()" which creates an rvalue of a non-class type T.
Definition ExprCXX.h:2199
A C++ static_cast expression (C++ [expr.static.cast]).
Definition ExprCXX.h:439
static CXXStaticCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool hasFPFeatures)
Definition ExprCXX.cpp:804
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
Definition ExprCXX.h:803
Represents a C++ functional cast expression that builds a temporary object.
Definition ExprCXX.h:1902
static CXXTemporaryObjectExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs)
Definition ExprCXX.cpp:1168
Represents the this expression in C++.
Definition ExprCXX.h:1157
void setCapturedByCopyInLambdaWithExplicitObjectParameter(bool Set)
Definition ExprCXX.h:1187
void setLocation(SourceLocation L)
Definition ExprCXX.h:1175
static CXXThisExpr * CreateEmpty(const ASTContext &Ctx)
Definition ExprCXX.cpp:1598
void setImplicit(bool I)
Definition ExprCXX.h:1181
A C++ throw-expression (C++ [except.throw]).
Definition ExprCXX.h:1211
CXXTryStmt - A C++ try block, including all handlers.
Definition StmtCXX.h:70
unsigned getNumHandlers() const
Definition StmtCXX.h:108
static CXXTryStmt * Create(const ASTContext &C, SourceLocation tryLoc, CompoundStmt *tryBlock, ArrayRef< Stmt * > handlers)
Definition StmtCXX.cpp:26
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Definition ExprCXX.h:851
bool isTypeOperand() const
Definition ExprCXX.h:887
void setSourceRange(SourceRange R)
Definition ExprCXX.h:906
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
Definition ExprCXX.h:3743
void setRParenLoc(SourceLocation L)
Definition ExprCXX.h:3793
void setArg(unsigned I, Expr *E)
Definition ExprCXX.h:3829
void setLParenLoc(SourceLocation L)
Definition ExprCXX.h:3788
unsigned getNumArgs() const
Retrieve the number of arguments.
Definition ExprCXX.h:3801
static CXXUnresolvedConstructExpr * CreateEmpty(const ASTContext &Context, unsigned NumArgs)
Definition ExprCXX.cpp:1505
A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...
Definition ExprCXX.h:1071
bool isTypeOperand() const
Definition ExprCXX.h:1101
void setSourceRange(SourceRange R)
Definition ExprCXX.h:1122
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2954
void setRParenLoc(SourceLocation L)
Definition Expr.h:3286
void setCoroElideSafe(bool V=true)
Definition Expr.h:3129
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
Definition Expr.h:3171
void setADLCallKind(ADLCallKind V=UsesADL)
Definition Expr.h:3108
static CallExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPFeatures, EmptyShell Empty)
Create an empty call expression, for deserialization.
Definition Expr.cpp:1541
void setUsesMemberSyntax(bool V=true)
Definition Expr.h:3118
void setPreArg(unsigned I, Stmt *PreArg)
Definition Expr.h:3051
void setStoredFPFeatures(FPOptionsOverride F)
Set FPOptionsOverride in trailing storage. Used only by Serialization.
Definition Expr.h:3235
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
Definition Expr.h:3145
void setCallee(Expr *F)
Definition Expr.h:3103
void setBody(Stmt *B)
Definition Decl.cpp:5767
This captures a statement into a function.
Definition Stmt.h:3946
static CapturedStmt * CreateDeserialized(const ASTContext &Context, unsigned NumCaptures)
Definition Stmt.cpp:1471
Expr ** capture_init_iterator
Iterator that walks over the capture initialization arguments.
Definition Stmt.h:4105
void setCapturedRegionKind(CapturedRegionKind Kind)
Set the captured region kind.
Definition Stmt.cpp:1513
CapturedDecl * getCapturedDecl()
Retrieve the outlined function declaration.
Definition Stmt.cpp:1493
Stmt * getCapturedStmt()
Retrieve the statement being captured.
Definition Stmt.h:4050
capture_init_iterator capture_init_begin()
Retrieve the first initialization argument.
Definition Stmt.h:4123
void setCapturedDecl(CapturedDecl *D)
Set the outlined function declaration.
Definition Stmt.cpp:1502
void setCapturedRecordDecl(RecordDecl *D)
Set the record declaration for captured variables.
Definition Stmt.h:4070
capture_init_iterator capture_init_end()
Retrieve the iterator pointing one past the last initialization argument.
Definition Stmt.h:4133
capture_range captures()
Definition Stmt.h:4084
VariableCaptureKind
The different capture forms: by 'this', by reference, capture for variable-length array type etc.
Definition Stmt.h:3950
CaseStmt - Represent a case statement.
Definition Stmt.h:1929
void setEllipsisLoc(SourceLocation L)
Set the location of the ... in a case statement of the form LHS ... RHS.
Definition Stmt.h:2005
static CaseStmt * CreateEmpty(const ASTContext &Ctx, bool CaseStmtIsGNURange)
Build an empty case statement.
Definition Stmt.cpp:1317
void setLHS(Expr *Val)
Definition Stmt.h:2020
void setSubStmt(Stmt *S)
Definition Stmt.h:2047
void setRHS(Expr *Val)
Definition Stmt.h:2036
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3687
FPOptionsOverride * getTrailingFPFeatures()
Return a pointer to the trailing FPOptions.
Definition Expr.cpp:2061
path_iterator path_begin()
Definition Expr.h:3757
unsigned path_size() const
Definition Expr.h:3756
void setCastKind(CastKind K)
Definition Expr.h:3732
bool hasStoredFPFeatures() const
Definition Expr.h:3786
CXXBaseSpecifier ** path_iterator
Definition Expr.h:3753
void setSubExpr(Expr *E)
Definition Expr.h:3739
void setValue(unsigned Val)
Definition Expr.h:1646
void setLocation(SourceLocation Location)
Definition Expr.h:1642
void setKind(CharacterLiteralKind kind)
Definition Expr.h:1643
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Definition Expr.h:4859
void setRParenLoc(SourceLocation L)
Definition Expr.h:4910
void setIsConditionTrue(bool isTrue)
Definition Expr.h:4887
void setBuiltinLoc(SourceLocation L)
Definition Expr.h:4907
void setRHS(Expr *E)
Definition Expr.h:4904
void setCond(Expr *E)
Definition Expr.h:4900
void setLHS(Expr *E)
Definition Expr.h:4902
Represents a 'co_await' expression.
Definition ExprCXX.h:5368
void setIsImplicit(bool value=true)
Definition ExprCXX.h:5391
CompoundAssignOperator - For compound assignments (e.g.
Definition Expr.h:4311
void setComputationResultType(QualType T)
Definition Expr.h:4349
static CompoundAssignOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
Definition Expr.cpp:5122
void setComputationLHSType(QualType T)
Definition Expr.h:4346
CompoundLiteralExpr - [C99 6.5.2.5].
Definition Expr.h:3616
void setFileScope(bool FS)
Definition Expr.h:3649
void setTypeSourceInfo(TypeSourceInfo *tinfo)
Definition Expr.h:3657
void setLParenLoc(SourceLocation L)
Definition Expr.h:3652
void setInitializer(Expr *E)
Definition Expr.h:3646
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition Stmt.h:1749
static CompoundStmt * CreateEmpty(const ASTContext &C, unsigned NumStmts, bool HasFPFeatures)
Definition Stmt.cpp:409
bool hasStoredFPFeatures() const
Definition Stmt.h:1796
Represents the specialization of a concept - evaluates to a prvalue of type bool.
ConditionalOperator - The ?
Definition Expr.h:4402
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Definition Expr.h:1093
ConstantResultStorageKind getResultStorageKind() const
Definition Expr.h:1162
static ConstantExpr * CreateEmpty(const ASTContext &Context, ConstantResultStorageKind StorageKind)
Definition Expr.cpp:373
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition ASTConcept.h:47
llvm::SmallVector< UnsatisfiedConstraintRecord, 4 > Details
The substituted constraint expr, if the template arguments could be substituted into them,...
Definition ASTConcept.h:67
ContinueStmt - This represents a continue.
Definition Stmt.h:3128
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
Definition Expr.h:4730
static ConvertVectorExpr * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
Definition Expr.cpp:5688
void setStoredFPFeatures(FPOptionsOverride F)
Set FPFeatures in trailing storage, used by Serialization & ASTImporter.
Definition Expr.h:4803
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
Definition Expr.h:4788
Represents a 'co_return' statement in the C++ Coroutines TS.
Definition StmtCXX.h:474
Represents the body of a coroutine.
Definition StmtCXX.h:321
static CoroutineBodyStmt * Create(const ASTContext &C, CtorArgs const &Args)
Definition StmtCXX.cpp:88
Represents a 'co_yield' expression.
Definition ExprCXX.h:5449
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
static DeclGroup * Create(ASTContext &C, Decl **Decls, unsigned NumDecls)
Definition DeclGroup.cpp:20
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1281
bool hasTemplateKWAndArgsInfo() const
Definition Expr.h:1402
static DeclRefExpr * CreateEmpty(const ASTContext &Context, bool HasQualifier, bool HasFoundDecl, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
Construct an empty declaration reference expression.
Definition Expr.cpp:535
void setLocation(SourceLocation L)
Definition Expr.h:1358
bool hasQualifier() const
Determine whether this declaration reference was preceded by a C++ nested-name-specifier,...
Definition Expr.h:1370
ValueDecl * getDecl()
Definition Expr.h:1349
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Definition Stmt.h:1640
void setStartLoc(SourceLocation L)
Definition Stmt.h:1662
void setEndLoc(SourceLocation L)
Definition Stmt.h:1664
void setDeclGroup(DeclGroupRef DGR)
Definition Stmt.h:1660
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
void setSubStmt(Stmt *S)
Definition Stmt.h:2092
DeferStmt - This represents a deferred statement.
Definition Stmt.h:3245
void setBody(Stmt *S)
Definition Stmt.h:3266
void setDeferLoc(SourceLocation DeferLoc)
Definition Stmt.h:3260
static DeferStmt * CreateEmpty(ASTContext &Context, EmptyShell Empty)
Definition Stmt.cpp:1548
Represents a 'co_await' expression while the type of the promise is dependent.
Definition ExprCXX.h:5400
A qualified reference to a name whose declaration cannot yet be resolved.
Definition ExprCXX.h:3509
static DependentScopeDeclRefExpr * CreateEmpty(const ASTContext &Context, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
Definition ExprCXX.cpp:564
Represents a C99 designated initializer expression.
Definition Expr.h:5568
static DesignatedInitExpr * CreateEmpty(const ASTContext &C, unsigned NumIndexExprs)
Definition Expr.cpp:4853
void setSubExpr(unsigned Idx, Expr *E)
Definition Expr.h:5854
void setGNUSyntax(bool GNU)
Definition Expr.h:5833
void setEqualOrColonLoc(SourceLocation L)
Definition Expr.h:5824
void setDesignators(const ASTContext &C, const Designator *Desigs, unsigned NumDesigs)
Definition Expr.cpp:4860
unsigned getNumSubExprs() const
Retrieve the total number of subexpressions in this designated initializer expression,...
Definition Expr.h:5848
void setBase(Expr *Base)
Definition Expr.h:5951
void setUpdater(Expr *Updater)
Definition Expr.h:5956
static Designator CreateArrayRangeDesignator(Expr *Start, Expr *End, SourceLocation LBracketLoc, SourceLocation EllipsisLoc)
Creates a GNU array-range designator.
Definition Designator.h:185
static Designator CreateArrayDesignator(Expr *Index, SourceLocation LBracketLoc)
Creates an array designator.
Definition Designator.h:155
static Designator CreateFieldDesignator(const IdentifierInfo *FieldName, SourceLocation DotLoc, SourceLocation FieldLoc)
Creates a field designator.
Definition Designator.h:115
DoStmt - This represents a 'do/while' stmt.
Definition Stmt.h:2841
void setWhileLoc(SourceLocation L)
Definition Stmt.h:2873
void setDoLoc(SourceLocation L)
Definition Stmt.h:2871
void setRParenLoc(SourceLocation L)
Definition Stmt.h:2875
void setBody(Stmt *Body)
Definition Stmt.h:2868
void setCond(Expr *Cond)
Definition Stmt.h:2864
void setAccessorLoc(SourceLocation L)
Definition Expr.h:6606
void setAccessor(IdentifierInfo *II)
Definition Expr.h:6603
void setBase(Expr *E)
Definition Expr.h:6600
Represents a reference to emded data.
Definition Expr.h:5146
ExplicitCastExpr - An explicit cast written in the source code.
Definition Expr.h:3939
void setTypeInfoAsWritten(TypeSourceInfo *writtenTy)
Definition Expr.h:3962
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
Definition ExprCXX.h:3660
unsigned getNumObjects() const
Definition ExprCXX.h:3688
llvm::PointerUnion< BlockDecl *, CompoundLiteralExpr * > CleanupObject
The type of objects that are kept in the cleanup.
Definition ExprCXX.h:3666
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
Definition ExprCXX.cpp:1471
This represents one expression.
Definition Expr.h:112
void setType(QualType t)
Definition Expr.h:145
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition Expr.h:177
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Definition Expr.h:223
void setValueKind(ExprValueKind Cat)
setValueKind - Set the value kind produced by this expression.
Definition Expr.h:464
void setObjectKind(ExprObjectKind Cat)
setObjectKind - Set the object kind produced by this expression.
Definition Expr.h:467
QualType getType() const
Definition Expr.h:144
void setDependence(ExprDependence Deps)
Each concrete expr subclass is expected to compute its dependence and call this in the constructor.
Definition Expr.h:137
An expression trait intrinsic.
Definition ExprCXX.h:3072
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
Definition Expr.h:6627
static FPOptionsOverride getFromOpaqueInt(storage_type I)
static FixedPointLiteral * Create(const ASTContext &C, EmptyShell Empty)
Returns an empty fixed-point literal.
Definition Expr.cpp:1011
void setLocation(SourceLocation Location)
Definition Expr.h:1594
void setScale(unsigned S)
Definition Expr.h:1597
static FloatingLiteral * Create(const ASTContext &C, const llvm::APFloat &V, bool isexact, QualType Type, SourceLocation L)
Definition Expr.cpp:1082
const llvm::fltSemantics & getSemantics() const
Return the APFloat semantics this literal uses.
Definition Expr.h:1699
void setValue(const ASTContext &C, const llvm::APFloat &Val)
Definition Expr.h:1680
void setRawSemantics(llvm::APFloatBase::Semantics Sem)
Set the raw enumeration value representing the floating-point semantics of this literal (32-bit IEEE,...
Definition Expr.h:1694
void setExact(bool E)
Definition Expr.h:1711
void setLocation(SourceLocation L)
Definition Expr.h:1719
ForStmt - This represents a 'for (init;cond;inc)' stmt.
Definition Stmt.h:2897
void setBody(Stmt *S)
Definition Stmt.h:2951
void setCond(Expr *E)
Definition Stmt.h:2949
void setForLoc(SourceLocation L)
Definition Stmt.h:2954
void setInc(Expr *E)
Definition Stmt.h:2950
void setLParenLoc(SourceLocation L)
Definition Stmt.h:2956
void setInit(Stmt *S)
Definition Stmt.h:2948
void setConditionVariableDeclStmt(DeclStmt *CondVar)
Definition Stmt.h:2935
void setRParenLoc(SourceLocation L)
Definition Stmt.h:2958
void setSubExpr(Expr *E)
As with any mutator of the AST, be very careful when modifying an existing AST to preserve its invari...
Definition Expr.h:1078
Stmt * SubExpr
Definition Expr.h:1062
Represents a reference to a function parameter pack, init-capture pack, or binding pack that has been...
Definition ExprCXX.h:4840
static FunctionParmPackExpr * CreateEmpty(const ASTContext &Context, unsigned NumParams)
Definition ExprCXX.cpp:1816
This represents a GCC inline-assembly statement extension.
Definition Stmt.h:3455
unsigned getNumLabels() const
Definition Stmt.h:3605
void setAsmStringExpr(Expr *E)
Definition Stmt.h:3484
void setRParenLoc(SourceLocation L)
Definition Stmt.h:3478
GNUNullExpr - Implements the GNU __null extension, which is a name for a null pointer constant that h...
Definition Expr.h:4934
void setTokenLocation(SourceLocation L)
Definition Expr.h:4949
Represents a C11 generic selection.
Definition Expr.h:6199
unsigned getNumAssocs() const
The number of association expressions.
Definition Expr.h:6441
static GenericSelectionExpr * CreateEmpty(const ASTContext &Context, unsigned NumAssocs)
Create an empty generic selection expression for deserialization.
Definition Expr.cpp:4787
GotoStmt - This represents a direct goto.
Definition Stmt.h:2978
void setLabel(LabelDecl *D)
Definition Stmt.h:2992
void setLabelLoc(SourceLocation L)
Definition Stmt.h:2997
void setGotoLoc(SourceLocation L)
Definition Stmt.h:2995
This class represents temporary values used to represent inout and out arguments in HLSL.
Definition Expr.h:7414
static HLSLOutArgExpr * CreateEmpty(const ASTContext &Ctx)
Definition Expr.cpp:5674
IfStmt - This represents an if/then/else.
Definition Stmt.h:2268
void setThen(Stmt *Then)
Definition Stmt.h:2362
void setConditionVariableDeclStmt(DeclStmt *CondVar)
Definition Stmt.h:2413
void setCond(Expr *Cond)
Definition Stmt.h:2353
void setLParenLoc(SourceLocation Loc)
Definition Stmt.h:2487
void setElse(Stmt *Else)
Definition Stmt.h:2376
void setElseLoc(SourceLocation ElseLoc)
Definition Stmt.h:2442
static IfStmt * CreateEmpty(const ASTContext &Ctx, bool HasElse, bool HasVar, bool HasInit)
Create an empty IfStmt optionally with storage for an else statement, condition variable and init exp...
Definition Stmt.cpp:1059
void setStatementKind(IfStatementKind Kind)
Definition Stmt.h:2465
void setRParenLoc(SourceLocation Loc)
Definition Stmt.h:2489
void setIfLoc(SourceLocation IfLoc)
Definition Stmt.h:2435
void setInit(Stmt *Init)
Definition Stmt.h:2428
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
Definition Expr.h:1742
void setSubExpr(Expr *E)
Definition Expr.h:1756
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition Expr.h:3864
static ImplicitCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
Definition Expr.cpp:2104
void setIsPartOfExplicitCast(bool PartOfExplicitCast)
Definition Expr.h:3896
Represents an implicitly-generated value initialization of an object of a given type.
Definition Expr.h:6074
IndirectGotoStmt - This represents an indirect goto.
Definition Stmt.h:3017
void setTarget(Expr *E)
Definition Stmt.h:3041
void setGotoLoc(SourceLocation L)
Definition Stmt.h:3032
void setStarLoc(SourceLocation L)
Definition Stmt.h:3034
Describes an C or C++ initializer list.
Definition Expr.h:5319
void setSyntacticForm(InitListExpr *Init)
Definition Expr.h:5493
Expr * updateInit(const ASTContext &C, unsigned Init, Expr *expr)
Updates the initializer at index Init with the new expression expr, and returns the old expression at...
Definition Expr.cpp:2437
void setLBraceLoc(SourceLocation Loc)
Definition Expr.h:5478
void setRBraceLoc(SourceLocation Loc)
Definition Expr.h:5480
void sawArrayRangeDesignator(bool ARD=true)
Definition Expr.h:5503
void reserveInits(const ASTContext &C, unsigned NumInits)
Reserve space for some number of initializers.
Definition Expr.cpp:2428
void setLocation(SourceLocation Location)
Definition Expr.h:1549
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Definition Expr.cpp:981
LabelStmt - Represents a label, which has a substatement.
Definition Stmt.h:2155
void setSubStmt(Stmt *SS)
Definition Stmt.h:2180
void setDecl(LabelDecl *D)
Definition Stmt.h:2174
void setIdentLoc(SourceLocation L)
Definition Stmt.h:2171
void setSideEntry(bool SE)
Definition Stmt.h:2203
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
Definition ExprCXX.h:1971
Expr ** capture_init_iterator
Iterator that walks over the capture initialization arguments.
Definition ExprCXX.h:2078
static LambdaExpr * CreateDeserialized(const ASTContext &C, unsigned NumCaptures)
Construct a new lambda expression that will be deserialized from an external source.
Definition ExprCXX.cpp:1339
capture_init_iterator capture_init_end()
Retrieve the iterator pointing one past the last initialization argument for this lambda expression.
Definition ExprCXX.h:2109
capture_init_iterator capture_init_begin()
Retrieve the first initialization argument for this lambda expression (which initializes the first ca...
Definition ExprCXX.h:2097
Base class for BreakStmt and ContinueStmt.
Definition Stmt.h:3066
void setLabelDecl(LabelDecl *S)
Definition Stmt.h:3106
void setLabelLoc(SourceLocation L)
Definition Stmt.h:3102
void setKwLoc(SourceLocation L)
Definition Stmt.h:3092
This represents a Microsoft inline-assembly statement extension.
Definition Stmt.h:3674
Representation of a Microsoft __if_exists or __if_not_exists statement with a dependent name.
Definition StmtCXX.h:254
A member reference to an MSPropertyDecl.
Definition ExprCXX.h:939
MS property subscript expression.
Definition ExprCXX.h:1009
void setRBracketLoc(SourceLocation L)
Definition ExprCXX.h:1047
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition ExprCXX.h:4919
MatrixSingleSubscriptExpr - Matrix single subscript expression for the MatrixType extension when you ...
Definition Expr.h:2806
void setRBracketLoc(SourceLocation L)
Definition Expr.h:2853
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
Definition Expr.h:2876
void setColumnIdx(Expr *E)
Definition Expr.h:2916
void setBase(Expr *E)
Definition Expr.h:2904
void setRowIdx(Expr *E)
Definition Expr.h:2908
void setRBracketLoc(SourceLocation L)
Definition Expr.h:2931
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3375
static MemberExpr * CreateEmpty(const ASTContext &Context, bool HasQualifier, bool HasFoundDecl, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
Definition Expr.cpp:1780
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
Represents a place-holder for an object not to be initialized by anything.
Definition Expr.h:5894
NullStmt - This is the null statement ";": C99 6.8.3p3.
Definition Stmt.h:1712
void setSemiLoc(SourceLocation L)
Definition Stmt.h:1724
An explicit cast in C or a C-style cast in C++, which uses the syntax ([s1][s2]......
Definition ExprOpenMP.h:24
void setLParenLoc(SourceLocation L)
Definition ExprOpenMP.h:69
static OMPArrayShapingExpr * CreateEmpty(const ASTContext &Context, unsigned NumDims)
Definition Expr.cpp:5528
void setRParenLoc(SourceLocation L)
Definition ExprOpenMP.h:72
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
Definition ExprOpenMP.h:151
void setLParenLoc(SourceLocation L)
Definition ExprOpenMP.h:243
static OMPIteratorExpr * CreateEmpty(const ASTContext &Context, unsigned NumIterators)
Definition Expr.cpp:5657
void setRParenLoc(SourceLocation L)
Definition ExprOpenMP.h:246
void setIteratorKwLoc(SourceLocation L)
Definition ExprOpenMP.h:249
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
Definition ExprObjC.h:220
static ObjCArrayLiteral * CreateEmpty(const ASTContext &C, unsigned NumElements)
Definition ExprObjC.cpp:51
Expr ** getElements()
Retrieve elements of array of literals.
Definition ExprObjC.h:251
unsigned getNumElements() const
getNumElements - Return number of elements of objective-c array literal.
Definition ExprObjC.h:257
Represents Objective-C's @catch statement.
Definition StmtObjC.h:77
void setCatchParamDecl(VarDecl *D)
Definition StmtObjC.h:103
void setCatchBody(Stmt *S)
Definition StmtObjC.h:95
void setRParenLoc(SourceLocation Loc)
Definition StmtObjC.h:108
void setAtCatchLoc(SourceLocation Loc)
Definition StmtObjC.h:106
Represents Objective-C's @finally statement.
Definition StmtObjC.h:127
void setFinallyBody(Stmt *S)
Definition StmtObjC.h:141
void setAtFinallyLoc(SourceLocation Loc)
Definition StmtObjC.h:149
Represents Objective-C's @synchronized statement.
Definition StmtObjC.h:303
void setAtSynchronizedLoc(SourceLocation Loc)
Definition StmtObjC.h:321
Represents Objective-C's @throw statement.
Definition StmtObjC.h:358
void setThrowLoc(SourceLocation Loc)
Definition StmtObjC.h:375
void setThrowExpr(Stmt *S)
Definition StmtObjC.h:372
Represents Objective-C's @try ... @catch ... @finally statement.
Definition StmtObjC.h:167
void setAtTryLoc(SourceLocation Loc)
Definition StmtObjC.h:211
void setFinallyStmt(Stmt *S)
Definition StmtObjC.h:253
static ObjCAtTryStmt * CreateEmpty(const ASTContext &Context, unsigned NumCatchStmts, bool HasFinally)
Definition StmtObjC.cpp:56
unsigned getNumCatchStmts() const
Retrieve the number of @catch statements in this try-catch-finally block.
Definition StmtObjC.h:220
void setCatchStmt(unsigned I, ObjCAtCatchStmt *S)
Set a particular catch statement.
Definition StmtObjC.h:235
void setTryBody(Stmt *S)
Definition StmtObjC.h:216
Represents Objective-C's @autoreleasepool Statement.
Definition StmtObjC.h:394
void setAtLoc(SourceLocation Loc)
Definition StmtObjC.h:415
A runtime availability query.
Definition ExprObjC.h:1736
ObjCBoolLiteralExpr - Objective-C Boolean Literal.
Definition ExprObjC.h:119
void setLocation(SourceLocation L)
Definition ExprObjC.h:139
ObjCBoxedExpr - used for generalized expression boxing.
Definition ExprObjC.h:159
An Objective-C "bridged" cast expression, which casts between Objective-C pointers and C pointers,...
Definition ExprObjC.h:1676
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
Definition ExprObjC.h:342
static ObjCDictionaryLiteral * CreateEmpty(const ASTContext &C, unsigned NumElements, bool HasPackExpansions)
Definition ExprObjC.cpp:96
unsigned getNumElements() const
getNumElements - Return number of elements of objective-c dictionary literal.
Definition ExprObjC.h:392
ObjCEncodeExpr, used for @encode in Objective-C.
Definition ExprObjC.h:441
void setEncodedTypeSourceInfo(TypeSourceInfo *EncType)
Definition ExprObjC.h:464
void setRParenLoc(SourceLocation L)
Definition ExprObjC.h:458
void setAtLoc(SourceLocation L)
Definition ExprObjC.h:456
Represents Objective-C's collection statement.
Definition StmtObjC.h:23
void setCollection(Expr *E)
Definition StmtObjC.h:47
void setForLoc(SourceLocation Loc)
Definition StmtObjC.h:53
void setRParenLoc(SourceLocation Loc)
Definition StmtObjC.h:55
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
Definition ExprObjC.h:1615
ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
Definition ExprObjC.h:1531
void setIsaMemberLoc(SourceLocation L)
Definition ExprObjC.h:1564
void setBase(Expr *E)
Definition ExprObjC.h:1555
void setArrow(bool A)
Definition ExprObjC.h:1559
void setOpLoc(SourceLocation L)
Definition ExprObjC.h:1567
ObjCIvarRefExpr - A reference to an ObjC instance variable.
Definition ExprObjC.h:582
void setIsArrow(bool A)
Definition ExprObjC.h:622
void setBase(Expr *base)
Definition ExprObjC.h:618
void setDecl(ObjCIvarDecl *d)
Definition ExprObjC.h:614
void setIsFreeIvar(bool A)
Definition ExprObjC.h:623
void setOpLoc(SourceLocation L)
Definition ExprObjC.h:634
void setLocation(SourceLocation L)
Definition ExprObjC.h:626
An expression that sends a message to the given Objective-C object or class.
Definition ExprObjC.h:973
static ObjCMessageExpr * CreateEmpty(const ASTContext &Context, unsigned NumArgs, unsigned NumStoredSelLocs)
Create an empty Objective-C message expression, to be filled in by subsequent calls.
Definition ExprObjC.cpp:240
void setMethodDecl(ObjCMethodDecl *MD)
Definition ExprObjC.h:1411
void setClassReceiver(TypeSourceInfo *TSInfo)
Definition ExprObjC.h:1335
void setInstanceReceiver(Expr *rec)
Turn this message send into an instance message that computes the receiver object with the given expr...
Definition ExprObjC.h:1313
void setSuper(SourceLocation Loc, QualType T, bool IsInstanceSuper)
Definition ExprObjC.h:1384
ReceiverKind
The kind of receiver this message is sending to.
Definition ExprObjC.h:976
@ SuperInstance
The receiver is the instance of the superclass object.
Definition ExprObjC.h:987
@ Instance
The receiver is an object instance.
Definition ExprObjC.h:981
@ SuperClass
The receiver is a superclass.
Definition ExprObjC.h:984
@ Class
The receiver is a class.
Definition ExprObjC.h:978
void setDelegateInitCall(bool isDelegate)
Definition ExprObjC.h:1455
ReceiverKind getReceiverKind() const
Determine the kind of receiver that this message is being sent to.
Definition ExprObjC.h:1262
unsigned getNumArgs() const
Return the number of actual arguments in this message, not counting the receiver.
Definition ExprObjC.h:1423
void setSelector(Selector S)
Definition ExprObjC.h:1392
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
Definition ExprObjC.h:1446
Base class for Objective-C object literals ("...", @42, @[],}).
Definition ExprObjC.h:51
void setExpressibleAsConstantInitializer(bool ExpressibleAsConstantInitializer)
Definition ExprObjC.h:72
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
Definition ExprObjC.h:650
ObjCProtocolExpr used for protocol expression in Objective-C.
Definition ExprObjC.h:538
void setProtocol(ObjCProtocolDecl *P)
Definition ExprObjC.h:556
void setRParenLoc(SourceLocation L)
Definition ExprObjC.h:562
void setAtLoc(SourceLocation L)
Definition ExprObjC.h:561
ObjCSelectorExpr used for @selector in Objective-C.
Definition ExprObjC.h:486
void setSelector(Selector S)
Definition ExprObjC.h:501
void setAtLoc(SourceLocation L)
Definition ExprObjC.h:506
void setSelectorNameLoc(SourceLocation L)
Definition ExprObjC.h:507
void setRParenLoc(SourceLocation L)
Definition ExprObjC.h:508
ObjCStringLiteral, used for Objective-C string literals i.e.
Definition ExprObjC.h:84
void setAtLoc(SourceLocation L)
Definition ExprObjC.h:101
void setString(StringLiteral *S)
Definition ExprObjC.h:98
ObjCSubscriptRefExpr - used for array and dictionary subscripting.
Definition ExprObjC.h:872
void setRBracket(SourceLocation RB)
Definition ExprObjC.h:903
void setBaseExpr(Stmt *S)
Definition ExprObjC.h:912
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
Definition Expr.h:2538
void setOperatorLoc(SourceLocation L)
Definition Expr.h:2572
static OffsetOfExpr * CreateEmpty(const ASTContext &C, unsigned NumComps, unsigned NumExprs)
Definition Expr.cpp:1674
void setIndexExpr(unsigned Idx, Expr *E)
Definition Expr.h:2605
void setTypeSourceInfo(TypeSourceInfo *tsi)
Definition Expr.h:2581
void setComponent(unsigned Idx, OffsetOfNode ON)
Definition Expr.h:2589
unsigned getNumExpressions() const
Definition Expr.h:2609
void setRParenLoc(SourceLocation R)
Definition Expr.h:2576
unsigned getNumComponents() const
Definition Expr.h:2593
Kind
The kind of offsetof node we have.
Definition Expr.h:2435
@ Array
An index into an array.
Definition Expr.h:2437
@ Identifier
A field in a dependent type, known only by its name.
Definition Expr.h:2441
@ Field
A field.
Definition Expr.h:2439
@ Base
An implicit indirection through a C++ base class, when the field found is in a base class.
Definition Expr.h:2444
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Definition Expr.h:1189
void setIsUnique(bool V)
Definition Expr.h:1241
This is a base class for any OpenACC statement-level constructs that have an associated statement.
Definition StmtOpenACC.h:81
This expression type represents an asterisk in an OpenACC Size-Expr, used in the 'tile' and 'gang' cl...
Definition Expr.h:2101
static OpenACCAsteriskSizeExpr * CreateEmpty(const ASTContext &C)
Definition Expr.cpp:5684
This is the base class for an OpenACC statement-level construct, other construct types are expected t...
Definition StmtOpenACC.h:26
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
Definition ExprCXX.h:3131
ASTTemplateKWAndArgsInfo * getTrailingASTTemplateKWAndArgsInfo()
Return the optional template keyword and arguments info.
Definition ExprCXX.h:4281
unsigned getNumDecls() const
Gets the number of declarations in the unresolved set.
Definition ExprCXX.h:3235
TemplateArgumentLoc * getTrailingTemplateArgumentLoc()
Return the optional template arguments.
Definition ExprCXX.h:4291
DeclAccessPair * getTrailingResults()
Return the results. Defined after UnresolvedMemberExpr.
Definition ExprCXX.h:4275
bool hasTemplateKWAndArgsInfo() const
Definition ExprCXX.h:3175
unsigned getNumTemplateArgs() const
Definition ExprCXX.h:3329
Represents a C++11 pack expansion that produces a sequence of expressions.
Definition ExprCXX.h:4362
static PackIndexingExpr * CreateDeserialized(ASTContext &Context, unsigned NumTransformedExprs)
Definition ExprCXX.cpp:1765
ParenExpr - This represents a parenthesized expression, e.g.
Definition Expr.h:2193
void setLParen(SourceLocation Loc)
Definition Expr.h:2219
void setIsProducedByFoldExpansion(bool ProducedByFoldExpansion=true)
Definition Expr.h:2238
void setRParen(SourceLocation Loc)
Definition Expr.h:2223
void setSubExpr(Expr *E)
Definition Expr.h:2212
static ParenListExpr * CreateEmpty(const ASTContext &Ctx, unsigned NumExprs)
Create an empty paren list.
Definition Expr.cpp:4989
unsigned getNumExprs() const
Return the number of expressions in this paren list.
Definition Expr.h:6127
[C99 6.4.2.2] - A predefined identifier such as func.
Definition Expr.h:2016
void setLocation(SourceLocation L)
Definition Expr.h:2058
static PredefinedExpr * CreateEmpty(const ASTContext &Ctx, bool HasFunctionName)
Create an empty PredefinedExpr.
Definition Expr.cpp:648
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Definition Expr.h:6821
static PseudoObjectExpr * Create(const ASTContext &Context, Expr *syntactic, ArrayRef< Expr * > semantic, unsigned resultIndex)
Definition Expr.cpp:5202
Frontend produces RecoveryExprs on semantic errors that prevent creating other well-formed expression...
Definition Expr.h:7520
child_range children()
Definition Expr.h:7533
static RecoveryExpr * CreateEmpty(ASTContext &Ctx, unsigned NumSubExprs)
Definition Expr.cpp:5483
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
static RequiresExpr * Create(ASTContext &C, SourceLocation RequiresKWLoc, RequiresExprBodyDecl *Body, SourceLocation LParenLoc, ArrayRef< ParmVarDecl * > LocalParameters, SourceLocation RParenLoc, ArrayRef< concepts::Requirement * > Requirements, SourceLocation RBraceLoc)
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Definition Stmt.h:3169
void setRetValue(Expr *E)
Definition Stmt.h:3198
void setReturnLoc(SourceLocation L)
Definition Stmt.h:3219
void setNRVOCandidate(const VarDecl *Var)
Set the variable that might be used for the named return value optimization.
Definition Stmt.h:3212
static ReturnStmt * CreateEmpty(const ASTContext &Ctx, bool HasNRVOCandidate)
Create an empty return statement, optionally with storage for an NRVO candidate.
Definition Stmt.cpp:1298
Represents a __leave statement.
Definition Stmt.h:3907
void setLeaveLoc(SourceLocation L)
Definition Stmt.h:3918
SYCLKernelCallStmt represents the transformation that is applied to the body of a function declared w...
Definition StmtSYCL.h:36
void setOriginalStmt(CompoundStmt *CS)
Definition StmtSYCL.h:59
void setKernelLaunchStmt(Stmt *S)
Definition StmtSYCL.h:64
void setOutlinedFunctionDecl(OutlinedFunctionDecl *OFD)
Definition StmtSYCL.h:69
static SYCLUniqueStableNameExpr * CreateEmpty(const ASTContext &Ctx)
Definition Expr.cpp:588
ShuffleVectorExpr - clang-specific builtin-in function __builtin_shufflevector.
Definition Expr.h:4654
void setExprs(const ASTContext &C, ArrayRef< Expr * > Exprs)
Definition Expr.cpp:4617
void setRParenLoc(SourceLocation L)
Definition Expr.h:4675
void setBuiltinLoc(SourceLocation L)
Definition Expr.h:4672
Represents an expression that computes the length of a parameter pack.
Definition ExprCXX.h:4440
static SizeOfPackExpr * CreateDeserialized(ASTContext &Context, unsigned NumPartialArgs)
Definition ExprCXX.cpp:1727
bool isPartiallySubstituted() const
Determine whether this represents a partially-substituted sizeof... expression, such as is produced f...
Definition ExprCXX.h:4525
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
Definition Expr.h:5037
Encodes a location in the source.
A trivial tuple used to represent a source range.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
Definition Expr.h:4606
void setRParenLoc(SourceLocation L)
Definition Expr.h:4633
void setLParenLoc(SourceLocation L)
Definition Expr.h:4631
void setSubStmt(CompoundStmt *S)
Definition Expr.h:4625
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
Stmt - This represents one statement.
Definition Stmt.h:85
ExpressionTraitExprBitfields ExpressionTraitExprBits
Definition Stmt.h:1404
GenericSelectionExprBitfields GenericSelectionExprBits
Definition Stmt.h:1368
InitListExprBitfields InitListExprBits
Definition Stmt.h:1366
LambdaExprBitfields LambdaExprBits
Definition Stmt.h:1401
AttributedStmtBitfields AttributedStmtBits
Definition Stmt.h:1339
UnresolvedLookupExprBitfields UnresolvedLookupExprBits
Definition Stmt.h:1397
SubstNonTypeTemplateParmExprBitfields SubstNonTypeTemplateParmExprBits
Definition Stmt.h:1400
CXXNoexceptExprBitfields CXXNoexceptExprBits
Definition Stmt.h:1399
CXXRewrittenBinaryOperatorBitfields CXXRewrittenBinaryOperatorBits
Definition Stmt.h:1380
ExprWithCleanupsBitfields ExprWithCleanupsBits
Definition Stmt.h:1393
StmtClass getStmtClass() const
Definition Stmt.h:1502
CXXScalarValueInitExprBitfields CXXScalarValueInitExprBits
Definition Stmt.h:1387
CXXConstructExprBitfields CXXConstructExprBits
Definition Stmt.h:1392
CXXDependentScopeMemberExprBitfields CXXDependentScopeMemberExprBits
Definition Stmt.h:1395
TypeTraitExprBitfields TypeTraitExprBits
Definition Stmt.h:1390
CXXNewExprBitfields CXXNewExprBits
Definition Stmt.h:1388
SourceLocExprBitfields SourceLocExprBits
Definition Stmt.h:1370
ConstantExprBitfields ConstantExprBits
Definition Stmt.h:1353
RequiresExprBitfields RequiresExprBits
Definition Stmt.h:1402
CXXFoldExprBitfields CXXFoldExprBits
Definition Stmt.h:1405
StmtExprBitfields StmtExprBits
Definition Stmt.h:1375
StringLiteralBitfields StringLiteralBits
Definition Stmt.h:1357
OpaqueValueExprBitfields OpaqueValueExprBits
Definition Stmt.h:1416
CXXThrowExprBitfields CXXThrowExprBits
Definition Stmt.h:1384
MemberExprBitfields MemberExprBits
Definition Stmt.h:1363
PackIndexingExprBitfields PackIndexingExprBits
Definition Stmt.h:1406
DeclRefExprBitfields DeclRefExprBits
Definition Stmt.h:1355
CXXOperatorCallExprBitfields CXXOperatorCallExprBits
Definition Stmt.h:1379
CXXDefaultInitExprBitfields CXXDefaultInitExprBits
Definition Stmt.h:1386
NullStmtBitfields NullStmtBits
Definition Stmt.h:1336
ArrayTypeTraitExprBitfields ArrayTypeTraitExprBits
Definition Stmt.h:1403
PredefinedExprBitfields PredefinedExprBits
Definition Stmt.h:1354
UnresolvedMemberExprBitfields UnresolvedMemberExprBits
Definition Stmt.h:1398
PseudoObjectExprBitfields PseudoObjectExprBits
Definition Stmt.h:1369
CXXDeleteExprBitfields CXXDeleteExprBits
Definition Stmt.h:1389
CXXDefaultArgExprBitfields CXXDefaultArgExprBits
Definition Stmt.h:1385
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1810
unsigned getLength() const
Definition Expr.h:1920
StringLiteralKind getKind() const
Definition Expr.h:1923
static StringLiteral * CreateEmpty(const ASTContext &Ctx, unsigned NumConcatenated, unsigned Length, unsigned CharByteWidth)
Construct an empty string literal.
Definition Expr.cpp:1204
unsigned getNumConcatenated() const
getNumConcatenated - Get the number of string literal tokens that were concatenated in translation ph...
Definition Expr.h:1951
unsigned getCharByteWidth() const
Definition Expr.h:1921
Represents a reference to a non-type template parameter that has been substituted with a template arg...
Definition ExprCXX.h:4663
Represents a reference to a non-type template parameter pack that has been substituted with a non-tem...
Definition ExprCXX.h:4753
void setColonLoc(SourceLocation L)
Definition Stmt.h:1909
void setKeywordLoc(SourceLocation L)
Definition Stmt.h:1907
void setNextSwitchCase(SwitchCase *SC)
Definition Stmt.h:1904
SwitchStmt - This represents a 'switch' stmt.
Definition Stmt.h:2518
void setCond(Expr *Cond)
Definition Stmt.h:2589
void setSwitchLoc(SourceLocation L)
Definition Stmt.h:2654
void setConditionVariableDeclStmt(DeclStmt *CondVar)
Definition Stmt.h:2644
void setBody(Stmt *Body)
Definition Stmt.h:2596
void setRParenLoc(SourceLocation Loc)
Definition Stmt.h:2658
void setInit(Stmt *Init)
Definition Stmt.h:2606
void setLParenLoc(SourceLocation Loc)
Definition Stmt.h:2656
static SwitchStmt * CreateEmpty(const ASTContext &Ctx, bool HasInit, bool HasVar)
Create an empty switch statement optionally with storage for an init expression and a condition varia...
Definition Stmt.cpp:1178
void setAllEnumCasesCovered()
Set a flag in the SwitchStmt indicating that if the 'switch (X)' is a switch over an enum value then ...
Definition Stmt.h:2674
void setSwitchCaseList(SwitchCase *SC)
Definition Stmt.h:2651
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
void addArgument(const TemplateArgumentLoc &Loc)
Location wrapper for a TemplateArgument.
pack_iterator pack_begin() const
Iterator referencing the first argument of a template argument pack.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
@ Pack
The template argument is actually a parameter pack.
ArgKind getKind() const
Return the kind of stored template argument.
A container of type source information.
Definition TypeBase.h:8475
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
Definition ExprCXX.h:2899
unsigned getNumArgs() const
Determine the number of arguments to this type trait.
Definition ExprCXX.h:2961
static TypeTraitExpr * CreateDeserialized(const ASTContext &C, bool IsStoredAsBool, unsigned NumArgs)
Definition ExprCXX.cpp:1926
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
Definition Expr.h:2636
void setKind(UnaryExprOrTypeTrait K)
Definition Expr.h:2671
void setOperatorLoc(SourceLocation L)
Definition Expr.h:2710
void setRParenLoc(SourceLocation L)
Definition Expr.h:2713
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2255
void setSubExpr(Expr *E)
Definition Expr.h:2297
void setOperatorLoc(SourceLocation L)
Definition Expr.h:2301
void setCanOverflow(bool C)
Definition Expr.h:2310
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
Definition Expr.h:2392
void setOpcode(Opcode Opc)
Definition Expr.h:2294
void setStoredFPFeatures(FPOptionsOverride F)
Set FPFeatures in trailing storage, used by Serialization & ASTImporter.
Definition Expr.h:2406
UnaryOperatorKind Opcode
Definition Expr.h:2269
static UnaryOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
Definition Expr.cpp:5144
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition ExprCXX.h:3389
static UnresolvedLookupExpr * CreateEmpty(const ASTContext &Context, unsigned NumResults, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
Definition ExprCXX.cpp:472
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
Definition ExprCXX.h:4125
static UnresolvedMemberExpr * CreateEmpty(const ASTContext &Context, unsigned NumResults, bool HasTemplateKWAndArgsInfo, unsigned NumTemplateArgs)
Definition ExprCXX.cpp:1677
static UnresolvedSYCLKernelCallStmt * CreateEmpty(const ASTContext &C)
Definition StmtSYCL.h:125
void addDecl(NamedDecl *D)
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
Definition ExprCXX.h:643
static UserDefinedLiteral * CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, bool HasFPOptions, EmptyShell Empty)
Definition ExprCXX.cpp:991
Represents a call to the builtin function __builtin_va_arg.
Definition Expr.h:4968
void setVarargABI(VarArgKind Kind)
Definition Expr.h:4993
void setRParenLoc(SourceLocation L)
Definition Expr.h:5008
void setSubExpr(Expr *E)
Definition Expr.h:4990
void setBuiltinLoc(SourceLocation L)
Definition Expr.h:5005
void setWrittenTypeInfo(TypeSourceInfo *TI)
Definition Expr.h:5002
WhileStmt - This represents a 'while' stmt.
Definition Stmt.h:2706
void setCond(Expr *Cond)
Definition Stmt.h:2766
void setBody(Stmt *Body)
Definition Stmt.h:2773
void setLParenLoc(SourceLocation L)
Definition Stmt.h:2815
void setRParenLoc(SourceLocation L)
Definition Stmt.h:2817
void setWhileLoc(SourceLocation L)
Definition Stmt.h:2812
static WhileStmt * CreateEmpty(const ASTContext &Ctx, bool HasVar)
Create an empty while statement optionally with storage for a condition variable.
Definition Stmt.cpp:1240
void setConditionVariableDeclStmt(DeclStmt *CondVar)
Definition Stmt.h:2806
Information about a module that has been loaded by the ASTReader.
Definition ModuleFile.h:158
llvm::BitstreamCursor DeclsCursor
DeclsCursor - This is a cursor to the start of the DECLTYPES_BLOCK block.
Definition ModuleFile.h:503
StmtCode
Record codes for each kind of statement or expression.
DesignatorTypes
The kinds of designators that can occur in a DesignatedInitExpr.
@ EXPR_DESIGNATED_INIT
A DesignatedInitExpr record.
@ EXPR_COMPOUND_LITERAL
A CompoundLiteralExpr record.
@ STMT_OMP_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE
@ EXPR_OBJC_IVAR_REF_EXPR
An ObjCIvarRefExpr record.
@ EXPR_MEMBER
A MemberExpr record.
@ EXPR_CXX_TEMPORARY_OBJECT
A CXXTemporaryObjectExpr record.
@ STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE
@ EXPR_COMPOUND_ASSIGN_OPERATOR
A CompoundAssignOperator record.
@ EXPR_CXX_STATIC_CAST
A CXXStaticCastExpr record.
@ EXPR_OBJC_STRING_LITERAL
An ObjCStringLiteral record.
@ EXPR_VA_ARG
A VAArgExpr record.
@ EXPR_OBJC_ISA
An ObjCIsa Expr record.
@ EXPR_CXX_OPERATOR_CALL
A CXXOperatorCallExpr record.
@ STMT_OBJC_AT_TRY
An ObjCAtTryStmt record.
@ STMT_DO
A DoStmt record.
@ STMT_OBJC_CATCH
An ObjCAtCatchStmt record.
@ STMT_IF
An IfStmt record.
@ EXPR_STRING_LITERAL
A StringLiteral record.
@ EXPR_OBJC_AVAILABILITY_CHECK
An ObjCAvailabilityCheckExpr record.
@ STMT_OMP_PARALLEL_MASKED_TASKLOOP_DIRECTIVE
@ EXPR_MATRIX_SUBSCRIPT
An MatrixSubscriptExpr record.
@ EXPR_PSEUDO_OBJECT
A PseudoObjectExpr record.
@ STMT_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE
@ EXPR_IMPLICIT_CAST
An ImplicitCastExpr record.
@ STMT_CAPTURED
A CapturedStmt record.
@ STMT_OMP_TARGET_PARALLEL_FOR_SIMD_DIRECTIVE
@ STMT_GCCASM
A GCC-style AsmStmt record.
@ EXPR_IMAGINARY_LITERAL
An ImaginaryLiteral record.
@ STMT_WHILE
A WhileStmt record.
@ EXPR_CONVERT_VECTOR
A ConvertVectorExpr record.
@ EXPR_OBJC_SUBSCRIPT_REF_EXPR
An ObjCSubscriptRefExpr record.
@ EXPR_STMT
A StmtExpr record.
@ EXPR_CXX_REINTERPRET_CAST
A CXXReinterpretCastExpr record.
@ EXPR_DESIGNATED_INIT_UPDATE
A DesignatedInitUpdateExpr record.
@ STMT_OBJC_AT_SYNCHRONIZED
An ObjCAtSynchronizedStmt record.
@ STMT_OMP_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE
@ EXPR_BUILTIN_BIT_CAST
A BuiltinBitCastExpr record.
@ STMT_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE
@ STMT_SYCLKERNELCALL
A SYCLKernelCallStmt record.
@ EXPR_CHARACTER_LITERAL
A CharacterLiteral record.
@ EXPR_OBJC_ENCODE
An ObjCEncodeExpr record.
@ EXPR_CSTYLE_CAST
A CStyleCastExpr record.
@ EXPR_OBJC_BOOL_LITERAL
An ObjCBoolLiteralExpr record.
@ EXPR_EXT_VECTOR_ELEMENT
An ExtVectorElementExpr record.
@ EXPR_ATOMIC
An AtomicExpr record.
@ EXPR_OFFSETOF
An OffsetOfExpr record.
@ STMT_RETURN
A ReturnStmt record.
@ STMT_OBJC_FOR_COLLECTION
An ObjCForCollectionStmt record.
@ STMT_OMP_TARGET_TEAMS_DISTRIBUTE_DIRECTIVE
@ EXPR_ARRAY_INIT_LOOP
An ArrayInitLoopExpr record.
@ STMT_OMP_PARALLEL_MASTER_TASKLOOP_DIRECTIVE
@ STMT_OMP_PARALLEL_MASKED_TASKLOOP_SIMD_DIRECTIVE
@ STMT_CONTINUE
A ContinueStmt record.
@ EXPR_PREDEFINED
A PredefinedExpr record.
@ EXPR_CXX_BOOL_LITERAL
A CXXBoolLiteralExpr record.
@ EXPR_PAREN_LIST
A ParenListExpr record.
@ EXPR_CXX_PAREN_LIST_INIT
A CXXParenListInitExpr record.
@ STMT_COMPOUND
A CompoundStmt record.
@ STMT_FOR
A ForStmt record.
@ STMT_ATTRIBUTED
An AttributedStmt record.
@ STMT_UNRESOLVED_SYCL_KERNEL_CALL
An UnresolvedSYCLKernelCallStmt record.
@ STMT_OMP_TARGET_TEAMS_GENERIC_LOOP_DIRECTIVE
@ EXPR_CXX_REWRITTEN_BINARY_OPERATOR
A CXXRewrittenBinaryOperator record.
@ STMT_GOTO
A GotoStmt record.
@ EXPR_NO_INIT
An NoInitExpr record.
@ EXPR_OBJC_PROTOCOL_EXPR
An ObjCProtocolExpr record.
@ EXPR_ARRAY_INIT_INDEX
An ArrayInitIndexExpr record.
@ EXPR_CXX_CONSTRUCT
A CXXConstructExpr record.
@ STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_DIRECTIVE
@ STMT_OMP_PARALLEL_MASTER_TASKLOOP_SIMD_DIRECTIVE
@ STMT_OMP_TEAMS_DISTRIBUTE_PARALLEL_FOR_SIMD_DIRECTIVE
@ EXPR_CXX_DYNAMIC_CAST
A CXXDynamicCastExpr record.
@ STMT_CXX_TRY
A CXXTryStmt record.
@ EXPR_GENERIC_SELECTION
A GenericSelectionExpr record.
@ EXPR_OBJC_INDIRECT_COPY_RESTORE
An ObjCIndirectCopyRestoreExpr record.
@ EXPR_CXX_INHERITED_CTOR_INIT
A CXXInheritedCtorInitExpr record.
@ EXPR_CALL
A CallExpr record.
@ EXPR_GNU_NULL
A GNUNullExpr record.
@ EXPR_OBJC_PROPERTY_REF_EXPR
An ObjCPropertyRefExpr record.
@ EXPR_CXX_CONST_CAST
A CXXConstCastExpr record.
@ STMT_REF_PTR
A reference to a previously [de]serialized Stmt record.
@ EXPR_OBJC_MESSAGE_EXPR
An ObjCMessageExpr record.
@ STMT_CXX_EXPANSION_INSTANTIATION
A CXXExpansionInstantiationStmt.
@ STMT_CASE
A CaseStmt record.
@ EXPR_CONSTANT
A constant expression context.
@ STMT_STOP
A marker record that indicates that we are at the end of an expression.
@ STMT_CXX_EXPANSION_PATTERN
A CXXExpansionPatternStmt.
@ STMT_MSASM
A MS-style AsmStmt record.
@ EXPR_CONDITIONAL_OPERATOR
A ConditionOperator record.
@ EXPR_BINARY_OPERATOR
A BinaryOperator record.
@ EXPR_CXX_STD_INITIALIZER_LIST
A CXXStdInitializerListExpr record.
@ EXPR_SHUFFLE_VECTOR
A ShuffleVectorExpr record.
@ STMT_OBJC_FINALLY
An ObjCAtFinallyStmt record.
@ EXPR_OBJC_SELECTOR_EXPR
An ObjCSelectorExpr record.
@ EXPR_FLOATING_LITERAL
A FloatingLiteral record.
@ STMT_NULL_PTR
A NULL expression.
@ STMT_DEFAULT
A DefaultStmt record.
@ EXPR_CHOOSE
A ChooseExpr record.
@ STMT_NULL
A NullStmt record.
@ EXPR_DECL_REF
A DeclRefExpr record.
@ EXPR_INIT_LIST
An InitListExpr record.
@ EXPR_IMPLICIT_VALUE_INIT
An ImplicitValueInitExpr record.
@ STMT_OBJC_AUTORELEASE_POOL
An ObjCAutoreleasePoolStmt record.
@ EXPR_RECOVERY
A RecoveryExpr record.
@ EXPR_PAREN
A ParenExpr record.
@ STMT_OMP_TARGET_PARALLEL_GENERIC_LOOP_DIRECTIVE
@ STMT_LABEL
A LabelStmt record.
@ EXPR_CXX_FUNCTIONAL_CAST
A CXXFunctionalCastExpr record.
@ EXPR_USER_DEFINED_LITERAL
A UserDefinedLiteral record.
@ EXPR_INTEGER_LITERAL
An IntegerLiteral record.
@ EXPR_SOURCE_LOC
A SourceLocExpr record.
@ EXPR_CXX_MEMBER_CALL
A CXXMemberCallExpr record.
@ STMT_SWITCH
A SwitchStmt record.
@ STMT_DECL
A DeclStmt record.
@ EXPR_OBJC_KVC_REF_EXPR
UNUSED.
@ EXPR_SIZEOF_ALIGN_OF
A SizefAlignOfExpr record.
@ STMT_BREAK
A BreakStmt record.
@ STMT_OBJC_AT_THROW
An ObjCAtThrowStmt record.
@ EXPR_ADDR_LABEL
An AddrLabelExpr record.
@ EXPR_MATRIX_ELEMENT
A MatrixElementExpr record.
@ STMT_CXX_FOR_RANGE
A CXXForRangeStmt record.
@ EXPR_CXX_ADDRSPACE_CAST
A CXXAddrspaceCastExpr record.
@ EXPR_ARRAY_SUBSCRIPT
An ArraySubscriptExpr record.
@ EXPR_UNARY_OPERATOR
A UnaryOperator record.
@ STMT_CXX_CATCH
A CXXCatchStmt record.
@ EXPR_BUILTIN_PP_EMBED
A EmbedExpr record.
@ STMT_INDIRECT_GOTO
An IndirectGotoStmt record.
@ DESIG_ARRAY_RANGE
GNU array range designator.
@ DESIG_FIELD_NAME
Field designator where only the field name is known.
@ DESIG_FIELD_DECL
Field designator where the field has been resolved to a declaration.
@ DESIG_ARRAY
Array designator.
Top level wrappers for InstallAPI frontend operations.
ConstantResultStorageKind
Describes the kind of result that can be tail-allocated.
Definition Expr.h:1087
OpenACCDirectiveKind
OpenACCAtomicKind
ExprDependenceScope::ExprDependence ExprDependence
IfStatementKind
In an if statement, this denotes whether the statement is a constexpr or consteval if statement.
Definition Specifiers.h:40
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
Definition Specifiers.h:150
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition Specifiers.h:124
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
CapturedRegionKind
The different kinds of captured statement.
OpenACCComputeConstruct(OpenACCDirectiveKind K, SourceLocation Start, SourceLocation DirectiveLoc, SourceLocation End, ArrayRef< const OpenACCClause * > Clauses, Stmt *StructuredBlock)
const FunctionProtoType * T
std::pair< SourceLocation, StringRef > ConstraintSubstitutionDiagnostic
Unsatisfied constraint expressions if the template arguments could be substituted into them,...
Definition ASTConcept.h:40
CastKind
CastKind - The kind of operation required for a conversion.
llvm::omp::Directive OpenMPDirectiveKind
OpenMP directives.
Definition OpenMPKinds.h:25
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition Specifiers.h:133
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Implicit
An implicit conversion.
Definition Sema.h:435
CharacterLiteralKind
Definition Expr.h:1614
unsigned long uint64_t
static ASTConstraintSatisfaction * Create(const ASTContext &C, const ConstraintSatisfaction &Satisfaction)
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
void initializeFrom(SourceLocation TemplateKWLoc, const TemplateArgumentListInfo &List, TemplateArgumentLoc *OutArgArray)
Expr * CounterUpdate
Updater for the internal counter: ++CounterVD;.
Definition ExprOpenMP.h:121
Expr * Upper
Normalized upper bound.
Definition ExprOpenMP.h:116
Expr * Update
Update expression for the originally specified iteration variable, calculated as VD = Begin + Counter...
Definition ExprOpenMP.h:119
VarDecl * CounterVD
Internal normalized counter.
Definition ExprOpenMP.h:113
A placeholder type used to construct an empty shell of a type, that will be filled in later (e....
Definition Stmt.h:1442