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::VisitOMPOrderedDirective(OMPOrderedDirective *D) {
2702 VisitStmt(D);
2703 VisitOMPExecutableDirective(D);
2704}
2705
2706void ASTStmtReader::VisitOMPAtomicDirective(OMPAtomicDirective *D) {
2707 VisitStmt(D);
2708 VisitOMPExecutableDirective(D);
2709 D->Flags.IsXLHSInRHSPart = Record.readBool() ? 1 : 0;
2710 D->Flags.IsPostfixUpdate = Record.readBool() ? 1 : 0;
2711 D->Flags.IsFailOnly = Record.readBool() ? 1 : 0;
2712}
2713
2714void ASTStmtReader::VisitOMPTargetDirective(OMPTargetDirective *D) {
2715 VisitStmt(D);
2716 VisitOMPExecutableDirective(D);
2717}
2718
2719void ASTStmtReader::VisitOMPTargetDataDirective(OMPTargetDataDirective *D) {
2720 VisitStmt(D);
2721 VisitOMPExecutableDirective(D);
2722}
2723
2724void ASTStmtReader::VisitOMPTargetEnterDataDirective(
2725 OMPTargetEnterDataDirective *D) {
2726 VisitStmt(D);
2727 VisitOMPExecutableDirective(D);
2728}
2729
2730void ASTStmtReader::VisitOMPTargetExitDataDirective(
2731 OMPTargetExitDataDirective *D) {
2732 VisitStmt(D);
2733 VisitOMPExecutableDirective(D);
2734}
2735
2736void ASTStmtReader::VisitOMPTargetParallelDirective(
2737 OMPTargetParallelDirective *D) {
2738 VisitStmt(D);
2739 VisitOMPExecutableDirective(D);
2740 D->setHasCancel(Record.readBool());
2741}
2742
2743void ASTStmtReader::VisitOMPTargetParallelForDirective(
2744 OMPTargetParallelForDirective *D) {
2745 VisitOMPLoopDirective(D);
2746 D->setHasCancel(Record.readBool());
2747}
2748
2749void ASTStmtReader::VisitOMPTeamsDirective(OMPTeamsDirective *D) {
2750 VisitStmt(D);
2751 VisitOMPExecutableDirective(D);
2752}
2753
2754void ASTStmtReader::VisitOMPCancellationPointDirective(
2755 OMPCancellationPointDirective *D) {
2756 VisitStmt(D);
2757 VisitOMPExecutableDirective(D);
2758 D->setCancelRegion(Record.readEnum<OpenMPDirectiveKind>());
2759}
2760
2761void ASTStmtReader::VisitOMPCancelDirective(OMPCancelDirective *D) {
2762 VisitStmt(D);
2763 VisitOMPExecutableDirective(D);
2764 D->setCancelRegion(Record.readEnum<OpenMPDirectiveKind>());
2765}
2766
2767void ASTStmtReader::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
2768 VisitOMPLoopDirective(D);
2769 D->setHasCancel(Record.readBool());
2770}
2771
2772void ASTStmtReader::VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective *D) {
2773 VisitOMPLoopDirective(D);
2774}
2775
2776void ASTStmtReader::VisitOMPMasterTaskLoopDirective(
2777 OMPMasterTaskLoopDirective *D) {
2778 VisitOMPLoopDirective(D);
2779 D->setHasCancel(Record.readBool());
2780}
2781
2782void ASTStmtReader::VisitOMPMaskedTaskLoopDirective(
2783 OMPMaskedTaskLoopDirective *D) {
2784 VisitOMPLoopDirective(D);
2785 D->setHasCancel(Record.readBool());
2786}
2787
2788void ASTStmtReader::VisitOMPMasterTaskLoopSimdDirective(
2789 OMPMasterTaskLoopSimdDirective *D) {
2790 VisitOMPLoopDirective(D);
2791}
2792
2793void ASTStmtReader::VisitOMPMaskedTaskLoopSimdDirective(
2794 OMPMaskedTaskLoopSimdDirective *D) {
2795 VisitOMPLoopDirective(D);
2796}
2797
2798void ASTStmtReader::VisitOMPParallelMasterTaskLoopDirective(
2799 OMPParallelMasterTaskLoopDirective *D) {
2800 VisitOMPLoopDirective(D);
2801 D->setHasCancel(Record.readBool());
2802}
2803
2804void ASTStmtReader::VisitOMPParallelMaskedTaskLoopDirective(
2805 OMPParallelMaskedTaskLoopDirective *D) {
2806 VisitOMPLoopDirective(D);
2807 D->setHasCancel(Record.readBool());
2808}
2809
2810void ASTStmtReader::VisitOMPParallelMasterTaskLoopSimdDirective(
2811 OMPParallelMasterTaskLoopSimdDirective *D) {
2812 VisitOMPLoopDirective(D);
2813}
2814
2815void ASTStmtReader::VisitOMPParallelMaskedTaskLoopSimdDirective(
2816 OMPParallelMaskedTaskLoopSimdDirective *D) {
2817 VisitOMPLoopDirective(D);
2818}
2819
2820void ASTStmtReader::VisitOMPDistributeDirective(OMPDistributeDirective *D) {
2821 VisitOMPLoopDirective(D);
2822}
2823
2824void ASTStmtReader::VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective *D) {
2825 VisitStmt(D);
2826 VisitOMPExecutableDirective(D);
2827}
2828
2829void ASTStmtReader::VisitOMPDistributeParallelForDirective(
2830 OMPDistributeParallelForDirective *D) {
2831 VisitOMPLoopDirective(D);
2832 D->setHasCancel(Record.readBool());
2833}
2834
2835void ASTStmtReader::VisitOMPDistributeParallelForSimdDirective(
2836 OMPDistributeParallelForSimdDirective *D) {
2837 VisitOMPLoopDirective(D);
2838}
2839
2840void ASTStmtReader::VisitOMPDistributeSimdDirective(
2841 OMPDistributeSimdDirective *D) {
2842 VisitOMPLoopDirective(D);
2843}
2844
2845void ASTStmtReader::VisitOMPTargetParallelForSimdDirective(
2846 OMPTargetParallelForSimdDirective *D) {
2847 VisitOMPLoopDirective(D);
2848}
2849
2850void ASTStmtReader::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *D) {
2851 VisitOMPLoopDirective(D);
2852}
2853
2854void ASTStmtReader::VisitOMPTeamsDistributeDirective(
2855 OMPTeamsDistributeDirective *D) {
2856 VisitOMPLoopDirective(D);
2857}
2858
2859void ASTStmtReader::VisitOMPTeamsDistributeSimdDirective(
2860 OMPTeamsDistributeSimdDirective *D) {
2861 VisitOMPLoopDirective(D);
2862}
2863
2864void ASTStmtReader::VisitOMPTeamsDistributeParallelForSimdDirective(
2865 OMPTeamsDistributeParallelForSimdDirective *D) {
2866 VisitOMPLoopDirective(D);
2867}
2868
2869void ASTStmtReader::VisitOMPTeamsDistributeParallelForDirective(
2870 OMPTeamsDistributeParallelForDirective *D) {
2871 VisitOMPLoopDirective(D);
2872 D->setHasCancel(Record.readBool());
2873}
2874
2875void ASTStmtReader::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *D) {
2876 VisitStmt(D);
2877 VisitOMPExecutableDirective(D);
2878}
2879
2880void ASTStmtReader::VisitOMPTargetTeamsDistributeDirective(
2881 OMPTargetTeamsDistributeDirective *D) {
2882 VisitOMPLoopDirective(D);
2883}
2884
2885void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForDirective(
2886 OMPTargetTeamsDistributeParallelForDirective *D) {
2887 VisitOMPLoopDirective(D);
2888 D->setHasCancel(Record.readBool());
2889}
2890
2891void ASTStmtReader::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
2892 OMPTargetTeamsDistributeParallelForSimdDirective *D) {
2893 VisitOMPLoopDirective(D);
2894}
2895
2896void ASTStmtReader::VisitOMPTargetTeamsDistributeSimdDirective(
2897 OMPTargetTeamsDistributeSimdDirective *D) {
2898 VisitOMPLoopDirective(D);
2899}
2900
2901void ASTStmtReader::VisitOMPInteropDirective(OMPInteropDirective *D) {
2902 VisitStmt(D);
2903 VisitOMPExecutableDirective(D);
2904}
2905
2906void ASTStmtReader::VisitOMPDispatchDirective(OMPDispatchDirective *D) {
2907 VisitStmt(D);
2908 VisitOMPExecutableDirective(D);
2909 D->setTargetCallLoc(Record.readSourceLocation());
2910}
2911
2912void ASTStmtReader::VisitOMPMaskedDirective(OMPMaskedDirective *D) {
2913 VisitStmt(D);
2914 VisitOMPExecutableDirective(D);
2915}
2916
2917void ASTStmtReader::VisitOMPGenericLoopDirective(OMPGenericLoopDirective *D) {
2918 VisitOMPLoopDirective(D);
2919}
2920
2921void ASTStmtReader::VisitOMPTeamsGenericLoopDirective(
2922 OMPTeamsGenericLoopDirective *D) {
2923 VisitOMPLoopDirective(D);
2924}
2925
2926void ASTStmtReader::VisitOMPTargetTeamsGenericLoopDirective(
2927 OMPTargetTeamsGenericLoopDirective *D) {
2928 VisitOMPLoopDirective(D);
2929 D->setCanBeParallelFor(Record.readBool());
2930}
2931
2932void ASTStmtReader::VisitOMPParallelGenericLoopDirective(
2933 OMPParallelGenericLoopDirective *D) {
2934 VisitOMPLoopDirective(D);
2935}
2936
2937void ASTStmtReader::VisitOMPTargetParallelGenericLoopDirective(
2938 OMPTargetParallelGenericLoopDirective *D) {
2939 VisitOMPLoopDirective(D);
2940}
2941
2942//===----------------------------------------------------------------------===//
2943// OpenACC Constructs/Directives.
2944//===----------------------------------------------------------------------===//
2945void ASTStmtReader::VisitOpenACCConstructStmt(OpenACCConstructStmt *S) {
2946 (void)Record.readInt();
2947 S->Kind = Record.readEnum<OpenACCDirectiveKind>();
2948 S->Range = Record.readSourceRange();
2949 S->DirectiveLoc = Record.readSourceLocation();
2950 Record.readOpenACCClauseList(S->Clauses);
2951}
2952
2953void ASTStmtReader::VisitOpenACCAssociatedStmtConstruct(
2955 VisitOpenACCConstructStmt(S);
2956 S->setAssociatedStmt(Record.readSubStmt());
2957}
2958
2959void ASTStmtReader::VisitOpenACCComputeConstruct(OpenACCComputeConstruct *S) {
2960 VisitStmt(S);
2961 VisitOpenACCAssociatedStmtConstruct(S);
2962}
2963
2964void ASTStmtReader::VisitOpenACCLoopConstruct(OpenACCLoopConstruct *S) {
2965 VisitStmt(S);
2966 VisitOpenACCAssociatedStmtConstruct(S);
2967 S->ParentComputeConstructKind = Record.readEnum<OpenACCDirectiveKind>();
2968}
2969
2970void ASTStmtReader::VisitOpenACCCombinedConstruct(OpenACCCombinedConstruct *S) {
2971 VisitStmt(S);
2972 VisitOpenACCAssociatedStmtConstruct(S);
2973}
2974
2975void ASTStmtReader::VisitOpenACCDataConstruct(OpenACCDataConstruct *S) {
2976 VisitStmt(S);
2977 VisitOpenACCAssociatedStmtConstruct(S);
2978}
2979
2980void ASTStmtReader::VisitOpenACCEnterDataConstruct(
2981 OpenACCEnterDataConstruct *S) {
2982 VisitStmt(S);
2983 VisitOpenACCConstructStmt(S);
2984}
2985
2986void ASTStmtReader::VisitOpenACCExitDataConstruct(OpenACCExitDataConstruct *S) {
2987 VisitStmt(S);
2988 VisitOpenACCConstructStmt(S);
2989}
2990
2991void ASTStmtReader::VisitOpenACCInitConstruct(OpenACCInitConstruct *S) {
2992 VisitStmt(S);
2993 VisitOpenACCConstructStmt(S);
2994}
2995
2996void ASTStmtReader::VisitOpenACCShutdownConstruct(OpenACCShutdownConstruct *S) {
2997 VisitStmt(S);
2998 VisitOpenACCConstructStmt(S);
2999}
3000
3001void ASTStmtReader::VisitOpenACCSetConstruct(OpenACCSetConstruct *S) {
3002 VisitStmt(S);
3003 VisitOpenACCConstructStmt(S);
3004}
3005
3006void ASTStmtReader::VisitOpenACCUpdateConstruct(OpenACCUpdateConstruct *S) {
3007 VisitStmt(S);
3008 VisitOpenACCConstructStmt(S);
3009}
3010
3011void ASTStmtReader::VisitOpenACCHostDataConstruct(OpenACCHostDataConstruct *S) {
3012 VisitStmt(S);
3013 VisitOpenACCAssociatedStmtConstruct(S);
3014}
3015
3016void ASTStmtReader::VisitOpenACCWaitConstruct(OpenACCWaitConstruct *S) {
3017 VisitStmt(S);
3018 // Consume the count of Expressions.
3019 (void)Record.readInt();
3020 VisitOpenACCConstructStmt(S);
3021 S->LParenLoc = Record.readSourceLocation();
3022 S->RParenLoc = Record.readSourceLocation();
3023 S->QueuesLoc = Record.readSourceLocation();
3024
3025 for (unsigned I = 0; I < S->NumExprs; ++I) {
3026 S->getExprPtr()[I] = cast_if_present<Expr>(Record.readSubStmt());
3027 assert((I == 0 || S->getExprPtr()[I] != nullptr) &&
3028 "Only first expression should be null");
3029 }
3030}
3031
3032void ASTStmtReader::VisitOpenACCCacheConstruct(OpenACCCacheConstruct *S) {
3033 VisitStmt(S);
3034 (void)Record.readInt();
3035 VisitOpenACCConstructStmt(S);
3036 S->ParensLoc = Record.readSourceRange();
3037 S->ReadOnlyLoc = Record.readSourceLocation();
3038 for (unsigned I = 0; I < S->NumVars; ++I)
3039 S->getVarList()[I] = cast<Expr>(Record.readSubStmt());
3040}
3041
3042void ASTStmtReader::VisitOpenACCAtomicConstruct(OpenACCAtomicConstruct *S) {
3043 VisitStmt(S);
3044 VisitOpenACCConstructStmt(S);
3045 S->AtomicKind = Record.readEnum<OpenACCAtomicKind>();
3046 S->setAssociatedStmt(Record.readSubStmt());
3047}
3048
3049//===----------------------------------------------------------------------===//
3050// HLSL Constructs/Directives.
3051//===----------------------------------------------------------------------===//
3052
3053void ASTStmtReader::VisitHLSLOutArgExpr(HLSLOutArgExpr *S) {
3054 VisitExpr(S);
3055 S->SubExprs[HLSLOutArgExpr::BaseLValue] = Record.readSubExpr();
3056 S->SubExprs[HLSLOutArgExpr::CastedTemporary] = Record.readSubExpr();
3057 S->SubExprs[HLSLOutArgExpr::WritebackCast] = Record.readSubExpr();
3058 S->IsInOut = Record.readBool();
3059}
3060
3061//===----------------------------------------------------------------------===//
3062// ASTReader Implementation
3063//===----------------------------------------------------------------------===//
3064
3066 switch (ReadingKind) {
3067 case Read_None:
3068 llvm_unreachable("should not call this when not reading anything");
3069 case Read_Decl:
3070 case Read_Type:
3071 return ReadStmtFromStream(F);
3072 case Read_Stmt:
3073 return ReadSubStmt();
3074 }
3075
3076 llvm_unreachable("ReadingKind not set ?");
3077}
3078
3080 return cast_or_null<Expr>(ReadStmt(F));
3081}
3082
3084 return cast_or_null<Expr>(ReadSubStmt());
3085}
3086
3087// Within the bitstream, expressions are stored in Reverse Polish
3088// Notation, with each of the subexpressions preceding the
3089// expression they are stored in. Subexpressions are stored from last to first.
3090// To evaluate expressions, we continue reading expressions and placing them on
3091// the stack, with expressions having operands removing those operands from the
3092// stack. Evaluation terminates when we see a STMT_STOP record, and
3093// the single remaining expression on the stack is our result.
3094Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
3095 ReadingKindTracker ReadingKind(Read_Stmt, *this);
3096 llvm::BitstreamCursor &Cursor = F.DeclsCursor;
3097
3098 // Map of offset to previously deserialized stmt. The offset points
3099 // just after the stmt record.
3100 llvm::DenseMap<uint64_t, Stmt *> StmtEntries;
3101
3102#ifndef NDEBUG
3103 unsigned PrevNumStmts = StmtStack.size();
3104#endif
3105
3106 ASTRecordReader Record(*this, F);
3107 ASTStmtReader Reader(Record, Cursor);
3109
3110 while (true) {
3112 Cursor.advanceSkippingSubblocks();
3113 if (!MaybeEntry) {
3114 Error(toString(MaybeEntry.takeError()));
3115 return nullptr;
3116 }
3117 llvm::BitstreamEntry Entry = MaybeEntry.get();
3118
3119 switch (Entry.Kind) {
3120 case llvm::BitstreamEntry::SubBlock: // Handled for us already.
3121 case llvm::BitstreamEntry::Error:
3122 Error("malformed block record in AST file");
3123 return nullptr;
3124 case llvm::BitstreamEntry::EndBlock:
3125 goto Done;
3126 case llvm::BitstreamEntry::Record:
3127 // The interesting case.
3128 break;
3129 }
3130
3131 ASTContext &Context = getContext();
3132 Stmt *S = nullptr;
3133 bool Finished = false;
3134 bool IsStmtReference = false;
3135 Expected<unsigned> MaybeStmtCode = Record.readRecord(Cursor, Entry.ID);
3136 if (!MaybeStmtCode) {
3137 Error(toString(MaybeStmtCode.takeError()));
3138 return nullptr;
3139 }
3140 switch ((StmtCode)MaybeStmtCode.get()) {
3141 case STMT_STOP:
3142 Finished = true;
3143 break;
3144
3145 case STMT_REF_PTR:
3146 IsStmtReference = true;
3147 assert(StmtEntries.contains(Record[0]) &&
3148 "No stmt was recorded for this offset reference!");
3149 S = StmtEntries[Record.readInt()];
3150 break;
3151
3152 case STMT_NULL_PTR:
3153 S = nullptr;
3154 break;
3155
3156 case STMT_NULL:
3157 S = new (Context) NullStmt(Empty);
3158 break;
3159
3160 case STMT_COMPOUND: {
3161 unsigned NumStmts = Record[ASTStmtReader::NumStmtFields];
3162 bool HasFPFeatures = Record[ASTStmtReader::NumStmtFields + 1];
3163 S = CompoundStmt::CreateEmpty(Context, NumStmts, HasFPFeatures);
3164 break;
3165 }
3166
3167 case STMT_CASE:
3169 Context,
3170 /*CaseStmtIsGNURange*/ Record[ASTStmtReader::NumStmtFields + 3]);
3171 break;
3172
3173 case STMT_DEFAULT:
3174 S = new (Context) DefaultStmt(Empty);
3175 break;
3176
3177 case STMT_LABEL:
3178 S = new (Context) LabelStmt(Empty);
3179 break;
3180
3181 case STMT_ATTRIBUTED:
3183 Context,
3185 break;
3186
3187 case STMT_IF: {
3188 BitsUnpacker IfStmtBits(Record[ASTStmtReader::NumStmtFields]);
3189 bool HasElse = IfStmtBits.getNextBit();
3190 bool HasVar = IfStmtBits.getNextBit();
3191 bool HasInit = IfStmtBits.getNextBit();
3192 S = IfStmt::CreateEmpty(Context, HasElse, HasVar, HasInit);
3193 break;
3194 }
3195
3196 case STMT_SWITCH:
3198 Context,
3200 /* HasVar=*/Record[ASTStmtReader::NumStmtFields + 1]);
3201 break;
3202
3203 case STMT_WHILE:
3205 Context,
3207 break;
3208
3209 case STMT_DO:
3210 S = new (Context) DoStmt(Empty);
3211 break;
3212
3213 case STMT_FOR:
3214 S = new (Context) ForStmt(Empty);
3215 break;
3216
3217 case STMT_GOTO:
3218 S = new (Context) GotoStmt(Empty);
3219 break;
3220
3221 case STMT_INDIRECT_GOTO:
3222 S = new (Context) IndirectGotoStmt(Empty);
3223 break;
3224
3225 case STMT_CONTINUE:
3226 S = new (Context) ContinueStmt(Empty);
3227 break;
3228
3229 case STMT_BREAK:
3230 S = new (Context) BreakStmt(Empty);
3231 break;
3232
3233 case STMT_DEFER:
3234 S = DeferStmt::CreateEmpty(Context, Empty);
3235 break;
3236
3237 case STMT_RETURN:
3239 Context, /* HasNRVOCandidate=*/Record[ASTStmtReader::NumStmtFields]);
3240 break;
3241
3242 case STMT_DECL:
3243 S = new (Context) DeclStmt(Empty);
3244 break;
3245
3246 case STMT_GCCASM:
3247 S = new (Context) GCCAsmStmt(Empty);
3248 break;
3249
3250 case STMT_MSASM:
3251 S = new (Context) MSAsmStmt(Empty);
3252 break;
3253
3254 case STMT_CAPTURED:
3257 break;
3258
3260 S = new (Context) SYCLKernelCallStmt(Empty);
3261 break;
3262
3263 case EXPR_CONSTANT:
3265 Context, static_cast<ConstantResultStorageKind>(
3266 /*StorageKind=*/Record[ASTStmtReader::NumExprFields]));
3267 break;
3268
3271 break;
3272
3275 break;
3276
3279 break;
3280
3281 case EXPR_PREDEFINED:
3283 Context,
3284 /*HasFunctionName*/ Record[ASTStmtReader::NumExprFields]);
3285 break;
3286
3287 case EXPR_DECL_REF: {
3288 BitsUnpacker DeclRefExprBits(Record[ASTStmtReader::NumExprFields]);
3289 DeclRefExprBits.advance(5);
3290 bool HasFoundDecl = DeclRefExprBits.getNextBit();
3291 bool HasQualifier = DeclRefExprBits.getNextBit();
3292 bool HasTemplateKWAndArgsInfo = DeclRefExprBits.getNextBit();
3293 unsigned NumTemplateArgs = HasTemplateKWAndArgsInfo
3295 : 0;
3296 S = DeclRefExpr::CreateEmpty(Context, HasQualifier, HasFoundDecl,
3297 HasTemplateKWAndArgsInfo, NumTemplateArgs);
3298 break;
3299 }
3300
3302 S = IntegerLiteral::Create(Context, Empty);
3303 break;
3304
3306 S = FixedPointLiteral::Create(Context, Empty);
3307 break;
3308
3310 S = FloatingLiteral::Create(Context, Empty);
3311 break;
3312
3314 S = new (Context) ImaginaryLiteral(Empty);
3315 break;
3316
3319 Context,
3320 /* NumConcatenated=*/Record[ASTStmtReader::NumExprFields],
3321 /* Length=*/Record[ASTStmtReader::NumExprFields + 1],
3322 /* CharByteWidth=*/Record[ASTStmtReader::NumExprFields + 2]);
3323 break;
3324
3326 S = new (Context) CharacterLiteral(Empty);
3327 break;
3328
3329 case EXPR_PAREN:
3330 S = new (Context) ParenExpr(Empty);
3331 break;
3332
3333 case EXPR_PAREN_LIST:
3335 Context,
3336 /* NumExprs=*/Record[ASTStmtReader::NumExprFields]);
3337 break;
3338
3339 case EXPR_UNARY_OPERATOR: {
3340 BitsUnpacker UnaryOperatorBits(Record[ASTStmtReader::NumStmtFields]);
3341 UnaryOperatorBits.advance(ASTStmtReader::NumExprBits);
3342 bool HasFPFeatures = UnaryOperatorBits.getNextBit();
3343 S = UnaryOperator::CreateEmpty(Context, HasFPFeatures);
3344 break;
3345 }
3346
3347 case EXPR_OFFSETOF:
3348 S = OffsetOfExpr::CreateEmpty(Context,
3351 break;
3352
3354 S = new (Context) UnaryExprOrTypeTraitExpr(Empty);
3355 break;
3356
3358 S = new (Context) ArraySubscriptExpr(Empty);
3359 break;
3360
3362 S = new (Context) MatrixSubscriptExpr(Empty);
3363 break;
3364
3365 case EXPR_ARRAY_SECTION:
3366 S = new (Context) ArraySectionExpr(Empty);
3367 break;
3368
3372 break;
3373
3374 case EXPR_OMP_ITERATOR:
3375 S = OMPIteratorExpr::CreateEmpty(Context,
3377 break;
3378
3379 case EXPR_CALL: {
3380 auto NumArgs = Record[ASTStmtReader::NumExprFields];
3381 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);
3382 CallExprBits.advance(1);
3383 auto HasFPFeatures = CallExprBits.getNextBit();
3384 S = CallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures, Empty);
3385 break;
3386 }
3387
3388 case EXPR_RECOVERY:
3390 Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
3391 break;
3392
3393 case EXPR_MEMBER: {
3394 BitsUnpacker ExprMemberBits(Record[ASTStmtReader::NumExprFields]);
3395 bool HasQualifier = ExprMemberBits.getNextBit();
3396 bool HasFoundDecl = ExprMemberBits.getNextBit();
3397 bool HasTemplateInfo = ExprMemberBits.getNextBit();
3398 unsigned NumTemplateArgs = Record[ASTStmtReader::NumExprFields + 1];
3399 S = MemberExpr::CreateEmpty(Context, HasQualifier, HasFoundDecl,
3400 HasTemplateInfo, NumTemplateArgs);
3401 break;
3402 }
3403
3404 case EXPR_BINARY_OPERATOR: {
3405 BitsUnpacker BinaryOperatorBits(Record[ASTStmtReader::NumExprFields]);
3406 BinaryOperatorBits.advance(/*Size of opcode*/ 6);
3407 bool HasFPFeatures = BinaryOperatorBits.getNextBit();
3408 S = BinaryOperator::CreateEmpty(Context, HasFPFeatures);
3409 break;
3410 }
3411
3413 BitsUnpacker BinaryOperatorBits(Record[ASTStmtReader::NumExprFields]);
3414 BinaryOperatorBits.advance(/*Size of opcode*/ 6);
3415 bool HasFPFeatures = BinaryOperatorBits.getNextBit();
3416 S = CompoundAssignOperator::CreateEmpty(Context, HasFPFeatures);
3417 break;
3418 }
3419
3421 S = new (Context) ConditionalOperator(Empty);
3422 break;
3423
3425 S = new (Context) BinaryConditionalOperator(Empty);
3426 break;
3427
3428 case EXPR_IMPLICIT_CAST: {
3429 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
3430 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);
3431 CastExprBits.advance(7);
3432 bool HasFPFeatures = CastExprBits.getNextBit();
3433 S = ImplicitCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);
3434 break;
3435 }
3436
3437 case EXPR_CSTYLE_CAST: {
3438 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
3439 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);
3440 CastExprBits.advance(7);
3441 bool HasFPFeatures = CastExprBits.getNextBit();
3442 S = CStyleCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);
3443 break;
3444 }
3445
3447 S = new (Context) CompoundLiteralExpr(Empty);
3448 break;
3449
3451 S = new (Context) ExtVectorElementExpr(Empty);
3452 break;
3453
3455 S = new (Context) MatrixElementExpr(Empty);
3456 break;
3457
3458 case EXPR_INIT_LIST:
3459 S = new (Context) InitListExpr(Empty);
3460 break;
3461
3465
3466 break;
3467
3469 S = new (Context) DesignatedInitUpdateExpr(Empty);
3470 break;
3471
3473 S = new (Context) ImplicitValueInitExpr(Empty);
3474 break;
3475
3476 case EXPR_NO_INIT:
3477 S = new (Context) NoInitExpr(Empty);
3478 break;
3479
3481 S = new (Context) ArrayInitLoopExpr(Empty);
3482 break;
3483
3485 S = new (Context) ArrayInitIndexExpr(Empty);
3486 break;
3487
3488 case EXPR_VA_ARG:
3489 S = new (Context) VAArgExpr(Empty);
3490 break;
3491
3492 case EXPR_SOURCE_LOC:
3493 S = new (Context) SourceLocExpr(Empty);
3494 break;
3495
3497 S = new (Context) EmbedExpr(Empty);
3498 break;
3499
3500 case EXPR_ADDR_LABEL:
3501 S = new (Context) AddrLabelExpr(Empty);
3502 break;
3503
3504 case EXPR_STMT:
3505 S = new (Context) StmtExpr(Empty);
3506 break;
3507
3508 case EXPR_CHOOSE:
3509 S = new (Context) ChooseExpr(Empty);
3510 break;
3511
3512 case EXPR_GNU_NULL:
3513 S = new (Context) GNUNullExpr(Empty);
3514 break;
3515
3517 S = new (Context) ShuffleVectorExpr(Empty);
3518 break;
3519
3520 case EXPR_CONVERT_VECTOR: {
3521 BitsUnpacker ConvertVectorExprBits(Record[ASTStmtReader::NumStmtFields]);
3522 ConvertVectorExprBits.advance(ASTStmtReader::NumExprBits);
3523 bool HasFPFeatures = ConvertVectorExprBits.getNextBit();
3524 S = ConvertVectorExpr::CreateEmpty(Context, HasFPFeatures);
3525 break;
3526 }
3527
3528 case EXPR_BLOCK:
3529 S = new (Context) BlockExpr(Empty);
3530 break;
3531
3534 Context,
3535 /*NumAssocs=*/Record[ASTStmtReader::NumExprFields]);
3536 break;
3537
3539 S = new (Context) ObjCStringLiteral(Empty);
3540 break;
3541
3543 S = new (Context) ObjCBoxedExpr(Empty);
3544 break;
3545
3549 break;
3550
3555 break;
3556
3557 case EXPR_OBJC_ENCODE:
3558 S = new (Context) ObjCEncodeExpr(Empty);
3559 break;
3560
3562 S = new (Context) ObjCSelectorExpr(Empty);
3563 break;
3564
3566 S = new (Context) ObjCProtocolExpr(Empty);
3567 break;
3568
3570 S = new (Context) ObjCIvarRefExpr(Empty);
3571 break;
3572
3574 S = new (Context) ObjCPropertyRefExpr(Empty);
3575 break;
3576
3578 S = new (Context) ObjCSubscriptRefExpr(Empty);
3579 break;
3580
3582 llvm_unreachable("mismatching AST file");
3583
3585 S = ObjCMessageExpr::CreateEmpty(Context,
3588 break;
3589
3590 case EXPR_OBJC_ISA:
3591 S = new (Context) ObjCIsaExpr(Empty);
3592 break;
3593
3595 S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);
3596 break;
3597
3599 S = new (Context) ObjCBridgedCastExpr(Empty);
3600 break;
3601
3603 S = new (Context) ObjCForCollectionStmt(Empty);
3604 break;
3605
3606 case STMT_OBJC_CATCH:
3607 S = new (Context) ObjCAtCatchStmt(Empty);
3608 break;
3609
3610 case STMT_OBJC_FINALLY:
3611 S = new (Context) ObjCAtFinallyStmt(Empty);
3612 break;
3613
3614 case STMT_OBJC_AT_TRY:
3615 S = ObjCAtTryStmt::CreateEmpty(Context,
3618 break;
3619
3621 S = new (Context) ObjCAtSynchronizedStmt(Empty);
3622 break;
3623
3624 case STMT_OBJC_AT_THROW:
3625 S = new (Context) ObjCAtThrowStmt(Empty);
3626 break;
3627
3629 S = new (Context) ObjCAutoreleasePoolStmt(Empty);
3630 break;
3631
3633 S = new (Context) ObjCBoolLiteralExpr(Empty);
3634 break;
3635
3637 S = new (Context) ObjCAvailabilityCheckExpr(Empty);
3638 break;
3639
3640 case STMT_SEH_LEAVE:
3641 S = new (Context) SEHLeaveStmt(Empty);
3642 break;
3643
3644 case STMT_SEH_EXCEPT:
3645 S = new (Context) SEHExceptStmt(Empty);
3646 break;
3647
3648 case STMT_SEH_FINALLY:
3649 S = new (Context) SEHFinallyStmt(Empty);
3650 break;
3651
3652 case STMT_SEH_TRY:
3653 S = new (Context) SEHTryStmt(Empty);
3654 break;
3655
3656 case STMT_CXX_CATCH:
3657 S = new (Context) CXXCatchStmt(Empty);
3658 break;
3659
3660 case STMT_CXX_TRY:
3661 S = CXXTryStmt::Create(Context, Empty,
3662 /*numHandlers=*/Record[ASTStmtReader::NumStmtFields]);
3663 break;
3664
3667 Context, Empty,
3670 break;
3671
3676 break;
3677
3678 case STMT_CXX_FOR_RANGE:
3679 S = new (Context) CXXForRangeStmt(Empty);
3680 break;
3681
3683 S = new (Context) MSDependentExistsStmt(SourceLocation(), true,
3684 NestedNameSpecifierLoc(),
3685 DeclarationNameInfo(),
3686 nullptr);
3687 break;
3688
3690 S = OMPCanonicalLoop::createEmpty(Context);
3691 break;
3692
3696 break;
3697
3699 S =
3700 OMPParallelDirective::CreateEmpty(Context,
3702 Empty);
3703 break;
3704
3706 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3707 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3708 S = OMPSimdDirective::CreateEmpty(Context, NumClauses,
3709 CollapsedNum, Empty);
3710 break;
3711 }
3712
3714 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];
3715 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3716 S = OMPTileDirective::CreateEmpty(Context, NumClauses, NumLoops);
3717 break;
3718 }
3719
3721 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];
3722 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3723 S = OMPStripeDirective::CreateEmpty(Context, NumClauses, NumLoops);
3724 break;
3725 }
3726
3728 assert(Record[ASTStmtReader::NumStmtFields] == 1 && "Unroll directive accepts only a single loop");
3729 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3730 S = OMPUnrollDirective::CreateEmpty(Context, NumClauses);
3731 break;
3732 }
3733
3735 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];
3736 assert(Record[ASTStmtReader::NumStmtFields + 1] == 0 &&
3737 "Reverse directive has no clauses");
3738 S = OMPReverseDirective::CreateEmpty(Context, NumLoops);
3739 break;
3740 }
3741
3743 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];
3744 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3745 S = OMPSplitDirective::CreateEmpty(Context, NumClauses, NumLoops);
3746 break;
3747 }
3748
3750 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3751 S = OMPFuseDirective::CreateEmpty(Context, NumClauses);
3752 break;
3753 }
3754
3756 unsigned NumLoops = Record[ASTStmtReader::NumStmtFields];
3757 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3758 S = OMPInterchangeDirective::CreateEmpty(Context, NumClauses, NumLoops);
3759 break;
3760 }
3761
3763 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3764 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3765 S = OMPForDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3766 Empty);
3767 break;
3768 }
3769
3771 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3772 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3773 S = OMPForSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3774 Empty);
3775 break;
3776 }
3777
3779 S = OMPSectionsDirective::CreateEmpty(
3781 break;
3782
3784 S = OMPSectionDirective::CreateEmpty(Context, Empty);
3785 break;
3786
3788 S = OMPScopeDirective::CreateEmpty(
3790 break;
3791
3793 S = OMPSingleDirective::CreateEmpty(
3795 break;
3796
3798 S = OMPMasterDirective::CreateEmpty(Context, Empty);
3799 break;
3800
3802 S = OMPCriticalDirective::CreateEmpty(
3804 break;
3805
3807 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3808 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3809 S = OMPParallelForDirective::CreateEmpty(Context, NumClauses,
3810 CollapsedNum, Empty);
3811 break;
3812 }
3813
3815 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3816 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3817 S = OMPParallelForSimdDirective::CreateEmpty(Context, NumClauses,
3818 CollapsedNum, Empty);
3819 break;
3820 }
3821
3823 S = OMPParallelMasterDirective::CreateEmpty(
3825 break;
3826
3828 S = OMPParallelMaskedDirective::CreateEmpty(
3830 break;
3831
3833 S = OMPParallelSectionsDirective::CreateEmpty(
3835 break;
3836
3838 S = OMPTaskDirective::CreateEmpty(
3840 break;
3841
3843 S = OMPTaskyieldDirective::CreateEmpty(Context, Empty);
3844 break;
3845
3847 S = OMPBarrierDirective::CreateEmpty(Context, Empty);
3848 break;
3849
3851 S = OMPTaskwaitDirective::CreateEmpty(
3853 break;
3854
3858 break;
3859
3861 S = OMPTaskgroupDirective::CreateEmpty(
3863 break;
3864
3866 S = OMPFlushDirective::CreateEmpty(
3868 break;
3869
3871 S = OMPDepobjDirective::CreateEmpty(
3873 break;
3874
3878 break;
3879
3881 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
3882 bool HasAssociatedStmt = Record[ASTStmtReader::NumStmtFields + 2];
3883 S = OMPOrderedDirective::CreateEmpty(Context, NumClauses,
3884 !HasAssociatedStmt, Empty);
3885 break;
3886 }
3887
3889 S = OMPAtomicDirective::CreateEmpty(
3891 break;
3892
3896 break;
3897
3901 break;
3902
3906 break;
3907
3911 break;
3912
3916 break;
3917
3919 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3920 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3921 S = OMPTargetParallelForDirective::CreateEmpty(Context, NumClauses,
3922 CollapsedNum, Empty);
3923 break;
3924 }
3925
3929 break;
3930
3934 break;
3935
3938 break;
3939
3943 break;
3944
3946 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3947 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3948 S = OMPTaskLoopDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
3949 Empty);
3950 break;
3951 }
3952
3954 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3955 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3956 S = OMPTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,
3957 CollapsedNum, Empty);
3958 break;
3959 }
3960
3962 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3963 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3964 S = OMPMasterTaskLoopDirective::CreateEmpty(Context, NumClauses,
3965 CollapsedNum, Empty);
3966 break;
3967 }
3968
3970 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3971 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3972 S = OMPMaskedTaskLoopDirective::CreateEmpty(Context, NumClauses,
3973 CollapsedNum, Empty);
3974 break;
3975 }
3976
3978 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3979 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3980 S = OMPMasterTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,
3981 CollapsedNum, Empty);
3982 break;
3983 }
3984
3986 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3987 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3988 S = OMPMaskedTaskLoopSimdDirective::CreateEmpty(Context, NumClauses,
3989 CollapsedNum, Empty);
3990 break;
3991 }
3992
3994 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
3995 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
3997 CollapsedNum, Empty);
3998 break;
3999 }
4000
4002 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4003 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4005 CollapsedNum, Empty);
4006 break;
4007 }
4008
4010 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4011 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4013 Context, NumClauses, CollapsedNum, Empty);
4014 break;
4015 }
4016
4018 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4019 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4021 Context, NumClauses, CollapsedNum, Empty);
4022 break;
4023 }
4024
4026 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4027 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4028 S = OMPDistributeDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
4029 Empty);
4030 break;
4031 }
4032
4034 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4035 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4036 S = OMPDistributeParallelForDirective::CreateEmpty(Context, NumClauses,
4037 CollapsedNum, Empty);
4038 break;
4039 }
4040
4042 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4043 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4045 CollapsedNum,
4046 Empty);
4047 break;
4048 }
4049
4051 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4052 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4053 S = OMPDistributeSimdDirective::CreateEmpty(Context, NumClauses,
4054 CollapsedNum, Empty);
4055 break;
4056 }
4057
4059 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4060 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4061 S = OMPTargetParallelForSimdDirective::CreateEmpty(Context, NumClauses,
4062 CollapsedNum, Empty);
4063 break;
4064 }
4065
4067 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4068 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4069 S = OMPTargetSimdDirective::CreateEmpty(Context, NumClauses, CollapsedNum,
4070 Empty);
4071 break;
4072 }
4073
4075 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4076 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4077 S = OMPTeamsDistributeDirective::CreateEmpty(Context, NumClauses,
4078 CollapsedNum, Empty);
4079 break;
4080 }
4081
4083 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4084 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4085 S = OMPTeamsDistributeSimdDirective::CreateEmpty(Context, NumClauses,
4086 CollapsedNum, Empty);
4087 break;
4088 }
4089
4091 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4092 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4094 Context, NumClauses, CollapsedNum, Empty);
4095 break;
4096 }
4097
4099 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4100 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4102 Context, NumClauses, CollapsedNum, Empty);
4103 break;
4104 }
4105
4109 break;
4110
4112 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4113 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4114 S = OMPTargetTeamsDistributeDirective::CreateEmpty(Context, NumClauses,
4115 CollapsedNum, Empty);
4116 break;
4117 }
4118
4120 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4121 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4123 Context, NumClauses, CollapsedNum, Empty);
4124 break;
4125 }
4126
4128 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4129 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4131 Context, NumClauses, CollapsedNum, Empty);
4132 break;
4133 }
4134
4136 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4137 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4139 Context, NumClauses, CollapsedNum, Empty);
4140 break;
4141 }
4142
4146 break;
4147
4151 break;
4152
4156 break;
4157
4159 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4160 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4161 S = OMPGenericLoopDirective::CreateEmpty(Context, NumClauses,
4162 CollapsedNum, Empty);
4163 break;
4164 }
4165
4167 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4168 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4169 S = OMPTeamsGenericLoopDirective::CreateEmpty(Context, NumClauses,
4170 CollapsedNum, Empty);
4171 break;
4172 }
4173
4175 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4176 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4178 CollapsedNum, Empty);
4179 break;
4180 }
4181
4183 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4184 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4185 S = OMPParallelGenericLoopDirective::CreateEmpty(Context, NumClauses,
4186 CollapsedNum, Empty);
4187 break;
4188 }
4189
4191 unsigned CollapsedNum = Record[ASTStmtReader::NumStmtFields];
4192 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4194 Context, NumClauses, CollapsedNum, Empty);
4195 break;
4196 }
4197
4199 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4200 S = OMPAssumeDirective::CreateEmpty(Context, NumClauses, Empty);
4201 break;
4202 }
4203
4205 auto NumArgs = Record[ASTStmtReader::NumExprFields];
4206 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4207 CallExprBits.advance(1);
4208 auto HasFPFeatures = CallExprBits.getNextBit();
4209 S = CXXOperatorCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
4210 Empty);
4211 break;
4212 }
4213
4214 case EXPR_CXX_MEMBER_CALL: {
4215 auto NumArgs = Record[ASTStmtReader::NumExprFields];
4216 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4217 CallExprBits.advance(1);
4218 auto HasFPFeatures = CallExprBits.getNextBit();
4219 S = CXXMemberCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
4220 Empty);
4221 break;
4222 }
4223
4225 S = new (Context) CXXRewrittenBinaryOperator(Empty);
4226 break;
4227
4228 case EXPR_CXX_CONSTRUCT:
4230 Context,
4231 /* NumArgs=*/Record[ASTStmtReader::NumExprFields]);
4232 break;
4233
4235 S = new (Context) CXXInheritedCtorInitExpr(Empty);
4236 break;
4237
4240 Context,
4241 /* NumArgs=*/Record[ASTStmtReader::NumExprFields]);
4242 break;
4243
4244 case EXPR_CXX_STATIC_CAST: {
4245 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
4246 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4247 CastExprBits.advance(7);
4248 bool HasFPFeatures = CastExprBits.getNextBit();
4249 S = CXXStaticCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);
4250 break;
4251 }
4252
4253 case EXPR_CXX_DYNAMIC_CAST: {
4254 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
4255 S = CXXDynamicCastExpr::CreateEmpty(Context, PathSize);
4256 break;
4257 }
4258
4260 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
4261 S = CXXReinterpretCastExpr::CreateEmpty(Context, PathSize);
4262 break;
4263 }
4264
4266 S = CXXConstCastExpr::CreateEmpty(Context);
4267 break;
4268
4271 break;
4272
4274 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
4275 BitsUnpacker CastExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4276 CastExprBits.advance(7);
4277 bool HasFPFeatures = CastExprBits.getNextBit();
4278 S = CXXFunctionalCastExpr::CreateEmpty(Context, PathSize, HasFPFeatures);
4279 break;
4280 }
4281
4282 case EXPR_BUILTIN_BIT_CAST: {
4283#ifndef NDEBUG
4284 unsigned PathSize = Record[ASTStmtReader::NumExprFields];
4285 assert(PathSize == 0 && "Wrong PathSize!");
4286#endif
4287 S = new (Context) BuiltinBitCastExpr(Empty);
4288 break;
4289 }
4290
4292 auto NumArgs = Record[ASTStmtReader::NumExprFields];
4293 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4294 CallExprBits.advance(1);
4295 auto HasFPFeatures = CallExprBits.getNextBit();
4296 S = UserDefinedLiteral::CreateEmpty(Context, NumArgs, HasFPFeatures,
4297 Empty);
4298 break;
4299 }
4300
4302 S = new (Context) CXXStdInitializerListExpr(Empty);
4303 break;
4304
4306 S = new (Context) CXXBoolLiteralExpr(Empty);
4307 break;
4308
4310 S = new (Context) CXXNullPtrLiteralExpr(Empty);
4311 break;
4312
4314 S = new (Context) CXXTypeidExpr(Empty, true);
4315 break;
4316
4318 S = new (Context) CXXTypeidExpr(Empty, false);
4319 break;
4320
4322 S = new (Context) CXXUuidofExpr(Empty, true);
4323 break;
4324
4326 S = new (Context) MSPropertyRefExpr(Empty);
4327 break;
4328
4330 S = new (Context) MSPropertySubscriptExpr(Empty);
4331 break;
4332
4334 S = new (Context) CXXUuidofExpr(Empty, false);
4335 break;
4336
4337 case EXPR_CXX_THIS:
4338 S = CXXThisExpr::CreateEmpty(Context);
4339 break;
4340
4341 case EXPR_CXX_THROW:
4342 S = new (Context) CXXThrowExpr(Empty);
4343 break;
4344
4347 Context, /*HasRewrittenInit=*/Record[ASTStmtReader::NumExprFields]);
4348 break;
4349
4352 Context, /*HasRewrittenInit=*/Record[ASTStmtReader::NumExprFields]);
4353 break;
4354
4356 S = new (Context) CXXBindTemporaryExpr(Empty);
4357 break;
4358
4360 S = new (Context) CXXScalarValueInitExpr(Empty);
4361 break;
4362
4363 case EXPR_CXX_NEW:
4365 Context,
4367 /*HasInit=*/Record[ASTStmtReader::NumExprFields + 1],
4368 /*NumPlacementArgs=*/Record[ASTStmtReader::NumExprFields + 2],
4369 /*IsParenTypeId=*/Record[ASTStmtReader::NumExprFields + 3]);
4370 break;
4371
4372 case EXPR_CXX_DELETE:
4373 S = new (Context) CXXDeleteExpr(Empty);
4374 break;
4375
4377 S = new (Context) CXXPseudoDestructorExpr(Empty);
4378 break;
4379
4381 S = ExprWithCleanups::Create(Context, Empty,
4383 break;
4384
4386 unsigned NumTemplateArgs = Record[ASTStmtReader::NumExprFields];
4387 BitsUnpacker DependentScopeMemberBits(
4389 bool HasTemplateKWAndArgsInfo = DependentScopeMemberBits.getNextBit();
4390
4391 bool HasFirstQualifierFoundInScope =
4392 DependentScopeMemberBits.getNextBit();
4394 Context, HasTemplateKWAndArgsInfo, NumTemplateArgs,
4395 HasFirstQualifierFoundInScope);
4396 break;
4397 }
4398
4400 BitsUnpacker DependentScopeDeclRefBits(
4402 DependentScopeDeclRefBits.advance(ASTStmtReader::NumExprBits);
4403 bool HasTemplateKWAndArgsInfo = DependentScopeDeclRefBits.getNextBit();
4404 unsigned NumTemplateArgs =
4405 HasTemplateKWAndArgsInfo
4406 ? DependentScopeDeclRefBits.getNextBits(/*Width=*/16)
4407 : 0;
4409 Context, HasTemplateKWAndArgsInfo, NumTemplateArgs);
4410 break;
4411 }
4412
4416 break;
4417
4419 auto NumResults = Record[ASTStmtReader::NumExprFields];
4420 BitsUnpacker OverloadExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4421 auto HasTemplateKWAndArgsInfo = OverloadExprBits.getNextBit();
4422 auto NumTemplateArgs = HasTemplateKWAndArgsInfo
4424 : 0;
4426 Context, NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
4427 break;
4428 }
4429
4431 auto NumResults = Record[ASTStmtReader::NumExprFields];
4432 BitsUnpacker OverloadExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4433 auto HasTemplateKWAndArgsInfo = OverloadExprBits.getNextBit();
4434 auto NumTemplateArgs = HasTemplateKWAndArgsInfo
4436 : 0;
4438 Context, NumResults, HasTemplateKWAndArgsInfo, NumTemplateArgs);
4439 break;
4440 }
4441
4442 case EXPR_TYPE_TRAIT:
4446 break;
4447
4449 S = new (Context) ArrayTypeTraitExpr(Empty);
4450 break;
4451
4453 S = new (Context) ExpressionTraitExpr(Empty);
4454 break;
4455
4456 case EXPR_CXX_NOEXCEPT:
4457 S = new (Context) CXXNoexceptExpr(Empty);
4458 break;
4459
4461 S = new (Context) PackExpansionExpr(Empty);
4462 break;
4463
4464 case EXPR_SIZEOF_PACK:
4466 Context,
4467 /*NumPartialArgs=*/Record[ASTStmtReader::NumExprFields]);
4468 break;
4469
4470 case EXPR_PACK_INDEXING:
4472 Context,
4473 /*TransformedExprs=*/Record[ASTStmtReader::NumExprFields]);
4474 break;
4475
4477 S = new (Context) SubstNonTypeTemplateParmExpr(Empty);
4478 break;
4479
4481 S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);
4482 break;
4483
4487 break;
4488
4490 S = new (Context) MaterializeTemporaryExpr(Empty);
4491 break;
4492
4493 case EXPR_CXX_FOLD:
4494 S = new (Context) CXXFoldExpr(Empty);
4495 break;
4496
4499 Context, /*numExprs=*/Record[ASTStmtReader::NumExprFields], Empty);
4500 break;
4501
4502 case EXPR_OPAQUE_VALUE:
4503 S = new (Context) OpaqueValueExpr(Empty);
4504 break;
4505
4506 case EXPR_CUDA_KERNEL_CALL: {
4507 auto NumArgs = Record[ASTStmtReader::NumExprFields];
4508 BitsUnpacker CallExprBits(Record[ASTStmtReader::NumExprFields + 1]);
4509 CallExprBits.advance(1);
4510 auto HasFPFeatures = CallExprBits.getNextBit();
4511 S = CUDAKernelCallExpr::CreateEmpty(Context, NumArgs, HasFPFeatures,
4512 Empty);
4513 break;
4514 }
4515
4516 case EXPR_ASTYPE:
4517 S = new (Context) AsTypeExpr(Empty);
4518 break;
4519
4520 case EXPR_PSEUDO_OBJECT: {
4521 unsigned numSemanticExprs = Record[ASTStmtReader::NumExprFields];
4522 S = PseudoObjectExpr::Create(Context, Empty, numSemanticExprs);
4523 break;
4524 }
4525
4526 case EXPR_ATOMIC:
4527 S = new (Context) AtomicExpr(Empty);
4528 break;
4529
4530 case EXPR_LAMBDA: {
4531 unsigned NumCaptures = Record[ASTStmtReader::NumExprFields];
4532 S = LambdaExpr::CreateDeserialized(Context, NumCaptures);
4533 break;
4534 }
4535
4536 case STMT_COROUTINE_BODY: {
4537 unsigned NumParams = Record[ASTStmtReader::NumStmtFields];
4538 S = CoroutineBodyStmt::Create(Context, Empty, NumParams);
4539 break;
4540 }
4541
4542 case STMT_CORETURN:
4543 S = new (Context) CoreturnStmt(Empty);
4544 break;
4545
4546 case EXPR_COAWAIT:
4547 S = new (Context) CoawaitExpr(Empty);
4548 break;
4549
4550 case EXPR_COYIELD:
4551 S = new (Context) CoyieldExpr(Empty);
4552 break;
4553
4555 S = new (Context) DependentCoawaitExpr(Empty);
4556 break;
4557
4559 S = new (Context) ConceptSpecializationExpr(Empty);
4560 break;
4561 }
4562
4564 S = new (Context) CXXExpansionSelectExpr(Empty);
4565 break;
4566
4568 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4569 S = OpenACCComputeConstruct::CreateEmpty(Context, NumClauses);
4570 break;
4571 }
4573 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4574 S = OpenACCLoopConstruct::CreateEmpty(Context, NumClauses);
4575 break;
4576 }
4578 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4579 S = OpenACCCombinedConstruct::CreateEmpty(Context, NumClauses);
4580 break;
4581 }
4583 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4584 S = OpenACCDataConstruct::CreateEmpty(Context, NumClauses);
4585 break;
4586 }
4588 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4589 S = OpenACCEnterDataConstruct::CreateEmpty(Context, NumClauses);
4590 break;
4591 }
4593 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4594 S = OpenACCExitDataConstruct::CreateEmpty(Context, NumClauses);
4595 break;
4596 }
4598 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4599 S = OpenACCHostDataConstruct::CreateEmpty(Context, NumClauses);
4600 break;
4601 }
4603 unsigned NumExprs = Record[ASTStmtReader::NumStmtFields];
4604 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields + 1];
4605 S = OpenACCWaitConstruct::CreateEmpty(Context, NumExprs, NumClauses);
4606 break;
4607 }
4609 unsigned NumVars = Record[ASTStmtReader::NumStmtFields];
4610 S = OpenACCCacheConstruct::CreateEmpty(Context, NumVars);
4611 break;
4612 }
4614 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4615 S = OpenACCInitConstruct::CreateEmpty(Context, NumClauses);
4616 break;
4617 }
4619 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4620 S = OpenACCShutdownConstruct::CreateEmpty(Context, NumClauses);
4621 break;
4622 }
4624 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4625 S = OpenACCSetConstruct::CreateEmpty(Context, NumClauses);
4626 break;
4627 }
4629 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4630 S = OpenACCUpdateConstruct::CreateEmpty(Context, NumClauses);
4631 break;
4632 }
4634 unsigned NumClauses = Record[ASTStmtReader::NumStmtFields];
4635 S = OpenACCAtomicConstruct::CreateEmpty(Context, NumClauses);
4636 break;
4637 }
4638 case EXPR_REQUIRES: {
4639 unsigned numLocalParameters = Record[ASTStmtReader::NumExprFields];
4640 unsigned numRequirement = Record[ASTStmtReader::NumExprFields + 1];
4641 S = RequiresExpr::Create(Context, Empty, numLocalParameters,
4642 numRequirement);
4643 break;
4644 }
4645 case EXPR_HLSL_OUT_ARG:
4646 S = HLSLOutArgExpr::CreateEmpty(Context);
4647 break;
4648 case EXPR_REFLECT: {
4649 S = CXXReflectExpr::CreateEmpty(Context);
4650 break;
4651 }
4652 }
4653
4654 // We hit a STMT_STOP, so we're done with this expression.
4655 if (Finished)
4656 break;
4657
4658 ++NumStatementsRead;
4659
4660 if (S && !IsStmtReference) {
4661 Reader.Visit(S);
4662 StmtEntries[Cursor.GetCurrentBitNo()] = S;
4663 }
4664
4665 assert(Record.getIdx() == Record.size() &&
4666 "Invalid deserialization of statement");
4667 StmtStack.push_back(S);
4668 }
4669Done:
4670 assert(StmtStack.size() > PrevNumStmts && "Read too many sub-stmts!");
4671 assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
4672 return StmtStack.pop_back_val();
4673}
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:2599
Stmt * ReadSubStmt()
Reads a sub-statement operand during statement reading.
Definition ASTReader.h:2554
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:4556
void setLabel(LabelDecl *L)
Definition Expr.h:4580
void setLabelLoc(SourceLocation L)
Definition Expr.h:4574
void setAmpAmpLoc(SourceLocation L)
Definition Expr.h:4572
Represents the index of the current element of an array being initialized by an ArrayInitLoopExpr.
Definition Expr.h:6033
Represents a loop initializing the elements of an array.
Definition Expr.h:5980
This class represents BOTH the OpenMP Array Section and OpenACC 'subarray', with a boolean differenti...
Definition Expr.h:7231
bool isOMPArraySection() const
Definition Expr.h:7305
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Definition Expr.h:2727
void setRHS(Expr *E)
Definition Expr.h:2762
void setRBracketLoc(SourceLocation L)
Definition Expr.h:2778
void setLHS(Expr *E)
Definition Expr.h:2758
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:6745
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:6940
unsigned getNumSubExprs() const
Definition Expr.h:7013
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:4459
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:4044
void setLHS(Expr *E)
Definition Expr.h:4095
void setHasStoredFPFeatures(bool B)
Set and fetch the bit that shows whether FPFeatures needs to be allocated in Trailing Storage.
Definition Expr.h:4228
void setOperatorLoc(SourceLocation L)
Definition Expr.h:4087
void setRHS(Expr *E)
Definition Expr.h:4097
void setExcludedOverflowPattern(bool B)
Set and get the bit that informs arithmetic overflow sanitizers whether or not they should exclude ce...
Definition Expr.h:4233
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:4246
void setOpcode(Opcode Opc)
Definition Expr.h:4092
BinaryOperatorKind Opcode
Definition Expr.h:4049
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition Expr.h:6684
void setBlockDecl(BlockDecl *BD)
Definition Expr.h:6698
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:3975
static CStyleCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
Definition Expr.cpp:2131
void setRParenLoc(SourceLocation L)
Definition Expr.h:4011
void setLParenLoc(SourceLocation L)
Definition Expr.h:4008
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:2949
void setRParenLoc(SourceLocation L)
Definition Expr.h:3281
void setCoroElideSafe(bool V=true)
Definition Expr.h:3124
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
Definition Expr.h:3166
void setADLCallKind(ADLCallKind V=UsesADL)
Definition Expr.h:3103
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:3113
void setPreArg(unsigned I, Stmt *PreArg)
Definition Expr.h:3046
void setStoredFPFeatures(FPOptionsOverride F)
Set FPOptionsOverride in trailing storage. Used only by Serialization.
Definition Expr.h:3230
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
Definition Expr.h:3140
void setCallee(Expr *F)
Definition Expr.h:3098
void setBody(Stmt *B)
Definition Decl.cpp:5704
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:3682
FPOptionsOverride * getTrailingFPFeatures()
Return a pointer to the trailing FPOptions.
Definition Expr.cpp:2061
path_iterator path_begin()
Definition Expr.h:3752
unsigned path_size() const
Definition Expr.h:3751
void setCastKind(CastKind K)
Definition Expr.h:3727
bool hasStoredFPFeatures() const
Definition Expr.h:3781
CXXBaseSpecifier ** path_iterator
Definition Expr.h:3748
void setSubExpr(Expr *E)
Definition Expr.h:3734
void setValue(unsigned Val)
Definition Expr.h:1641
void setLocation(SourceLocation Location)
Definition Expr.h:1637
void setKind(CharacterLiteralKind kind)
Definition Expr.h:1638
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Definition Expr.h:4854
void setRParenLoc(SourceLocation L)
Definition Expr.h:4905
void setIsConditionTrue(bool isTrue)
Definition Expr.h:4882
void setBuiltinLoc(SourceLocation L)
Definition Expr.h:4902
void setRHS(Expr *E)
Definition Expr.h:4899
void setCond(Expr *E)
Definition Expr.h:4895
void setLHS(Expr *E)
Definition Expr.h:4897
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:4306
void setComputationResultType(QualType T)
Definition Expr.h:4344
static CompoundAssignOperator * CreateEmpty(const ASTContext &C, bool hasFPFeatures)
Definition Expr.cpp:5122
void setComputationLHSType(QualType T)
Definition Expr.h:4341
CompoundLiteralExpr - [C99 6.5.2.5].
Definition Expr.h:3611
void setFileScope(bool FS)
Definition Expr.h:3644
void setTypeSourceInfo(TypeSourceInfo *tinfo)
Definition Expr.h:3652
void setLParenLoc(SourceLocation L)
Definition Expr.h:3647
void setInitializer(Expr *E)
Definition Expr.h:3641
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:4397
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Definition Expr.h:1088
ConstantResultStorageKind getResultStorageKind() const
Definition Expr.h:1157
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:4725
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:4798
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
Definition Expr.h:4783
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:1276
bool hasTemplateKWAndArgsInfo() const
Definition Expr.h:1397
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:1353
bool hasQualifier() const
Determine whether this declaration reference was preceded by a C++ nested-name-specifier,...
Definition Expr.h:1365
ValueDecl * getDecl()
Definition Expr.h:1344
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:5563
static DesignatedInitExpr * CreateEmpty(const ASTContext &C, unsigned NumIndexExprs)
Definition Expr.cpp:4853
void setSubExpr(unsigned Idx, Expr *E)
Definition Expr.h:5849
void setGNUSyntax(bool GNU)
Definition Expr.h:5828
void setEqualOrColonLoc(SourceLocation L)
Definition Expr.h:5819
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:5843
void setBase(Expr *Base)
Definition Expr.h:5946
void setUpdater(Expr *Updater)
Definition Expr.h:5951
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:6601
void setAccessor(IdentifierInfo *II)
Definition Expr.h:6598
void setBase(Expr *E)
Definition Expr.h:6595
Represents a reference to emded data.
Definition Expr.h:5141
ExplicitCastExpr - An explicit cast written in the source code.
Definition Expr.h:3934
void setTypeInfoAsWritten(TypeSourceInfo *writtenTy)
Definition Expr.h:3957
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:6622
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:1589
void setScale(unsigned S)
Definition Expr.h:1592
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:1694
void setValue(const ASTContext &C, const llvm::APFloat &Val)
Definition Expr.h:1675
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:1689
void setExact(bool E)
Definition Expr.h:1706
void setLocation(SourceLocation L)
Definition Expr.h:1714
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:1073
Stmt * SubExpr
Definition Expr.h:1057
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:4929
void setTokenLocation(SourceLocation L)
Definition Expr.h:4944
Represents a C11 generic selection.
Definition Expr.h:6194
unsigned getNumAssocs() const
The number of association expressions.
Definition Expr.h:6436
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:7409
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:1737
void setSubExpr(Expr *E)
Definition Expr.h:1751
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition Expr.h:3859
static ImplicitCastExpr * CreateEmpty(const ASTContext &Context, unsigned PathSize, bool HasFPFeatures)
Definition Expr.cpp:2104
void setIsPartOfExplicitCast(bool PartOfExplicitCast)
Definition Expr.h:3891
Represents an implicitly-generated value initialization of an object of a given type.
Definition Expr.h:6069
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:5314
void setSyntacticForm(InitListExpr *Init)
Definition Expr.h:5488
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:5473
void setRBraceLoc(SourceLocation Loc)
Definition Expr.h:5475
void sawArrayRangeDesignator(bool ARD=true)
Definition Expr.h:5498
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:1544
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:2801
void setRBracketLoc(SourceLocation L)
Definition Expr.h:2848
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
Definition Expr.h:2871
void setColumnIdx(Expr *E)
Definition Expr.h:2911
void setBase(Expr *E)
Definition Expr.h:2899
void setRowIdx(Expr *E)
Definition Expr.h:2903
void setRBracketLoc(SourceLocation L)
Definition Expr.h:2926
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3370
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:5889
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:2533
void setOperatorLoc(SourceLocation L)
Definition Expr.h:2567
static OffsetOfExpr * CreateEmpty(const ASTContext &C, unsigned NumComps, unsigned NumExprs)
Definition Expr.cpp:1674
void setIndexExpr(unsigned Idx, Expr *E)
Definition Expr.h:2600
void setTypeSourceInfo(TypeSourceInfo *tsi)
Definition Expr.h:2576
void setComponent(unsigned Idx, OffsetOfNode ON)
Definition Expr.h:2584
unsigned getNumExpressions() const
Definition Expr.h:2604
void setRParenLoc(SourceLocation R)
Definition Expr.h:2571
unsigned getNumComponents() const
Definition Expr.h:2588
Kind
The kind of offsetof node we have.
Definition Expr.h:2430
@ Array
An index into an array.
Definition Expr.h:2432
@ Identifier
A field in a dependent type, known only by its name.
Definition Expr.h:2436
@ Field
A field.
Definition Expr.h:2434
@ Base
An implicit indirection through a C++ base class, when the field found is in a base class.
Definition Expr.h:2439
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Definition Expr.h:1184
void setIsUnique(bool V)
Definition Expr.h:1236
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:2096
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:2188
void setLParen(SourceLocation Loc)
Definition Expr.h:2214
void setIsProducedByFoldExpansion(bool ProducedByFoldExpansion=true)
Definition Expr.h:2233
void setRParen(SourceLocation Loc)
Definition Expr.h:2218
void setSubExpr(Expr *E)
Definition Expr.h:2207
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:6122
[C99 6.4.2.2] - A predefined identifier such as func.
Definition Expr.h:2011
void setLocation(SourceLocation L)
Definition Expr.h:2053
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:6816
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:7515
child_range children()
Definition Expr.h:7528
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:4649
void setExprs(const ASTContext &C, ArrayRef< Expr * > Exprs)
Definition Expr.cpp:4617
void setRParenLoc(SourceLocation L)
Definition Expr.h:4670
void setBuiltinLoc(SourceLocation L)
Definition Expr.h:4667
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:5032
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:4601
void setRParenLoc(SourceLocation L)
Definition Expr.h:4628
void setLParenLoc(SourceLocation L)
Definition Expr.h:4626
void setSubStmt(CompoundStmt *S)
Definition Expr.h:4620
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:1805
unsigned getLength() const
Definition Expr.h:1915
StringLiteralKind getKind() const
Definition Expr.h:1918
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:1946
unsigned getCharByteWidth() const
Definition Expr.h:1916
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:8460
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:2631
void setKind(UnaryExprOrTypeTrait K)
Definition Expr.h:2666
void setOperatorLoc(SourceLocation L)
Definition Expr.h:2705
void setRParenLoc(SourceLocation L)
Definition Expr.h:2708
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2250
void setSubExpr(Expr *E)
Definition Expr.h:2292
void setOperatorLoc(SourceLocation L)
Definition Expr.h:2296
void setCanOverflow(bool C)
Definition Expr.h:2305
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
Definition Expr.h:2387
void setOpcode(Opcode Opc)
Definition Expr.h:2289
void setStoredFPFeatures(FPOptionsOverride F)
Set FPFeatures in trailing storage, used by Serialization & ASTImporter.
Definition Expr.h:2401
UnaryOperatorKind Opcode
Definition Expr.h:2264
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:4963
void setVarargABI(VarArgKind Kind)
Definition Expr.h:4988
void setRParenLoc(SourceLocation L)
Definition Expr.h:5003
void setSubExpr(Expr *E)
Definition Expr.h:4985
void setBuiltinLoc(SourceLocation L)
Definition Expr.h:5000
void setWrittenTypeInfo(TypeSourceInfo *TI)
Definition Expr.h:4997
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.
The JSON file list parser is used to communicate input to InstallAPI.
ConstantResultStorageKind
Describes the kind of result that can be tail-allocated.
Definition Expr.h:1082
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:440
CharacterLiteralKind
Definition Expr.h:1609
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