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