clang 23.0.0git
TextNodeDumper.cpp
Go to the documentation of this file.
1//===--- TextNodeDumper.cpp - Printing of AST nodes -----------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements AST dumping of components of individual AST nodes.
10//
11//===----------------------------------------------------------------------===//
12
14#include "clang/AST/APValue.h"
20#include "clang/AST/Type.h"
22#include "clang/Basic/Module.h"
26#include "llvm/ADT/StringExtras.h"
27#include "llvm/Frontend/HLSL/HLSLRootSignature.h"
28
29#include <algorithm>
30#include <utility>
31
32using namespace clang;
33
34static void dumpPreviousDeclImpl(raw_ostream &OS, ...) {}
35
36template <typename T>
37static void dumpPreviousDeclImpl(raw_ostream &OS, const Mergeable<T> *D) {
38 const T *First = D->getFirstDecl();
39 if (First != D)
40 OS << " first " << First;
41}
42
43template <typename T>
44static void dumpPreviousDeclImpl(raw_ostream &OS, const Redeclarable<T> *D) {
45 const T *Prev = D->getPreviousDecl();
46 if (Prev)
47 OS << " prev " << Prev;
48}
49
50/// Dump the previous declaration in the redeclaration chain for a declaration,
51/// if any.
52static void dumpPreviousDecl(raw_ostream &OS, const Decl *D) {
53 switch (D->getKind()) {
54#define DECL(DERIVED, BASE) \
55 case Decl::DERIVED: \
56 return dumpPreviousDeclImpl(OS, cast<DERIVED##Decl>(D));
57#define ABSTRACT_DECL(DECL)
58#include "clang/AST/DeclNodes.inc"
59 }
60 llvm_unreachable("Decl that isn't part of DeclNodes.inc!");
61}
62
63TextNodeDumper::TextNodeDumper(raw_ostream &OS, const ASTContext &Context,
64 bool ShowColors)
65 : TextTreeStructure(OS, ShowColors), OS(OS), ShowColors(ShowColors),
66 Context(&Context), SM(&Context.getSourceManager()),
67 PrintPolicy(Context.getPrintingPolicy()),
68 Traits(&Context.getCommentCommandTraits()) {}
69
70TextNodeDumper::TextNodeDumper(raw_ostream &OS, bool ShowColors)
71 : TextTreeStructure(OS, ShowColors), OS(OS), ShowColors(ShowColors) {}
72
74 const comments::FullComment *FC) {
75 if (!C) {
76 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
77 OS << "<<<NULL>>>";
78 return;
79 }
80
81 {
82 ColorScope Color(OS, ShowColors, ASTDumpColor::Comment);
83 OS << C->getCommentKindName();
84 }
86 dumpSourceRange(C->getSourceRange());
87
88 ConstCommentVisitor<TextNodeDumper, void,
89 const comments::FullComment *>::visit(C, FC);
90}
91
93 {
94 ColorScope Color(OS, ShowColors, ASTDumpColor::Attr);
95
96 switch (A->getKind()) {
97#define ATTR(X) \
98 case attr::X: \
99 OS << #X; \
100 break;
101#include "clang/Basic/AttrList.inc"
102 }
103 OS << "Attr";
104 }
105 dumpPointer(A);
107 if (A->isInherited())
108 OS << " Inherited";
109 if (A->isImplicit())
110 OS << " Implicit";
111
113}
114
116 const Decl *From, StringRef Label) {
117 OS << "TemplateArgument";
118 if (R.isValid())
120
121 if (From)
122 dumpDeclRef(From, Label);
123
125}
126
127void TextNodeDumper::Visit(const Stmt *Node) {
128 if (!Node) {
129 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
130 OS << "<<<NULL>>>";
131 return;
132 }
133 {
134 ColorScope Color(OS, ShowColors, ASTDumpColor::Stmt);
135 OS << Node->getStmtClassName();
136 }
137 dumpPointer(Node);
139
140 if (const auto *E = dyn_cast<Expr>(Node)) {
141 dumpType(E->getType());
142
143 if (E->containsErrors()) {
144 ColorScope Color(OS, ShowColors, ASTDumpColor::Errors);
145 OS << " contains-errors";
146 }
147
148 {
149 ColorScope Color(OS, ShowColors, ASTDumpColor::ValueKind);
150 switch (E->getValueKind()) {
151 case VK_PRValue:
152 break;
153 case VK_LValue:
154 OS << " lvalue";
155 break;
156 case VK_XValue:
157 OS << " xvalue";
158 break;
159 }
160 }
161
162 {
163 ColorScope Color(OS, ShowColors, ASTDumpColor::ObjectKind);
164 switch (E->getObjectKind()) {
165 case OK_Ordinary:
166 break;
167 case OK_BitField:
168 OS << " bitfield";
169 break;
170 case OK_ObjCProperty:
171 OS << " objcproperty";
172 break;
173 case OK_ObjCSubscript:
174 OS << " objcsubscript";
175 break;
177 OS << " vectorcomponent";
178 break;
180 OS << " matrixcomponent";
181 break;
182 }
183 }
184 }
185
187}
188
190 if (!T) {
191 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
192 OS << "<<<NULL>>>";
193 return;
194 }
195 if (isa<LocInfoType>(T)) {
196 {
197 ColorScope Color(OS, ShowColors, ASTDumpColor::Type);
198 OS << "LocInfo Type";
199 }
200 dumpPointer(T);
201 return;
202 }
203
204 {
205 ColorScope Color(OS, ShowColors, ASTDumpColor::Type);
206 OS << T->getTypeClassName() << "Type";
207 }
208 dumpPointer(T);
209 OS << " ";
210 dumpBareType(QualType(T, 0), false);
211
212 QualType SingleStepDesugar =
214 if (SingleStepDesugar != QualType(T, 0))
215 OS << " sugar";
216
217 if (T->containsErrors()) {
218 ColorScope Color(OS, ShowColors, ASTDumpColor::Errors);
219 OS << " contains-errors";
220 }
221
222 if (T->isDependentType())
223 OS << " dependent";
224 else if (T->isInstantiationDependentType())
225 OS << " instantiation_dependent";
226
227 if (T->isVariablyModifiedType())
228 OS << " variably_modified";
229 if (T->containsUnexpandedParameterPack())
230 OS << " contains_unexpanded_pack";
231 if (T->isFromAST())
232 OS << " imported";
233
235}
236
238 OS << "QualType";
239 dumpPointer(T.getAsOpaquePtr());
240 OS << " ";
241 dumpBareType(T, false);
242 OS << " " << T.split().Quals.getAsString();
243}
244
246 if (!TL) {
247 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
248 OS << "<<<NULL>>>";
249 return;
250 }
251
252 {
253 ColorScope Color(OS, ShowColors, ASTDumpColor::Type);
255 ? "Qualified"
256 : TL.getType()->getTypeClassName())
257 << "TypeLoc";
258 }
260 OS << ' ';
261 dumpBareType(TL.getType(), /*Desugar=*/false);
262
264}
265
267 if (!D) {
268 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
269 OS << "<<<NULL>>>";
270 return;
271 }
272
273 {
274 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
275 OS << D->getDeclKindName() << "Decl";
276 }
277 dumpPointer(D);
278 if (D->getLexicalDeclContext() != D->getDeclContext())
279 OS << " parent " << cast<Decl>(D->getDeclContext());
280 dumpPreviousDecl(OS, D);
282 OS << ' ';
284 if (D->isFromASTFile())
285 OS << " imported";
286 if (Module *M = D->getOwningModule())
287 OS << " in " << M->getFullModuleName();
288 if (auto *ND = dyn_cast<NamedDecl>(D))
290 const_cast<NamedDecl *>(ND)))
291 AddChild([=] { OS << "also in " << M->getFullModuleName(); });
292 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
293 if (!ND->isUnconditionallyVisible())
294 OS << " hidden";
295 if (D->isImplicit())
296 OS << " implicit";
297
298 if (D->isUsed())
299 OS << " used";
300 else if (D->isThisDeclarationReferenced())
301 OS << " referenced";
302
303 if (D->isInvalidDecl())
304 OS << " invalid";
305 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
306 if (FD->isConstexprSpecified())
307 OS << " constexpr";
308 if (FD->isConsteval())
309 OS << " consteval";
310 else if (FD->isImmediateFunction())
311 OS << " immediate";
312 if (FD->isMultiVersion())
313 OS << " multiversion";
314 }
315
316 if (!isa<FunctionDecl>(*D)) {
317 const auto *MD = dyn_cast<ObjCMethodDecl>(D);
318 if (!MD || !MD->isThisDeclarationADefinition()) {
319 const auto *DC = dyn_cast<DeclContext>(D);
320 if (DC && DC->hasExternalLexicalStorage()) {
321 ColorScope Color(OS, ShowColors, ASTDumpColor::Undeserialized);
322 OS << " <undeserialized declarations>";
323 }
324 }
325 }
326
327 switch (D->getFriendObjectKind()) {
328 case Decl::FOK_None:
329 break;
331 OS << " friend";
332 break;
334 OS << " friend_undeclared";
335 break;
336 }
337
339}
340
342 OS << "CXXCtorInitializer";
343 if (Init->isAnyMemberInitializer()) {
344 OS << ' ';
345 dumpBareDeclRef(Init->getAnyMember());
346 } else if (Init->isBaseInitializer()) {
347 dumpType(QualType(Init->getBaseClass(), 0));
348 } else if (Init->isDelegatingInitializer()) {
349 dumpType(Init->getTypeSourceInfo()->getType());
350 } else {
351 llvm_unreachable("Unknown initializer type");
352 }
353}
354
356 OS << "capture";
357 if (C.isByRef())
358 OS << " byref";
359 if (C.isNested())
360 OS << " nested";
361 if (C.getVariable()) {
362 OS << ' ';
363 dumpBareDeclRef(C.getVariable());
364 }
365}
366
368 if (!C) {
369 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
370 OS << "<<<NULL>>> OMPClause";
371 return;
372 }
373 {
374 ColorScope Color(OS, ShowColors, ASTDumpColor::Attr);
375 StringRef ClauseName(llvm::omp::getOpenMPClauseName(C->getClauseKind()));
376 OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
377 << ClauseName.drop_front() << "Clause";
378 }
379 dumpPointer(C);
380 dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
381 if (C->isImplicit())
382 OS << " <implicit>";
383}
384
386 const OpenACCAsteriskSizeExpr *E) {
387 // Nothing to do here, only location exists, and that is printed elsewhere.
388}
389
391 if (!C) {
392 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
393 OS << "<<<NULL>>> OpenACCClause";
394 return;
395 }
396 {
397 ColorScope Color(OS, ShowColors, ASTDumpColor::Attr);
398 OS << C->getClauseKind();
399
400 // Handle clauses with parens for types that have no children, likely
401 // because there is no sub expression.
402 switch (C->getClauseKind()) {
404 OS << '(' << cast<OpenACCDefaultClause>(C)->getDefaultClauseKind() << ')';
405 break;
438 // The condition expression will be printed as a part of the 'children',
439 // but print 'clause' here so it is clear what is happening from the dump.
440 OS << " clause";
441 break;
443 OS << " clause";
444 // print the list of all GangKinds, so that there is some sort of
445 // relationship to the expressions listed afterwards.
446 auto *GC = cast<OpenACCGangClause>(C);
447
448 for (unsigned I = 0; I < GC->getNumExprs(); ++I) {
449 OS << " " << GC->getExpr(I).first;
450 }
451 break;
452 }
454 OS << " clause";
455 if (cast<OpenACCCollapseClause>(C)->hasForce())
456 OS << ": force";
457 break;
458
462 OS << " clause";
463 if (cast<OpenACCCopyClause>(C)->getModifierList() !=
465 OS << " modifiers: " << cast<OpenACCCopyClause>(C)->getModifierList();
466 break;
470 OS << " clause";
471 if (cast<OpenACCCopyInClause>(C)->getModifierList() !=
473 OS << " modifiers: " << cast<OpenACCCopyInClause>(C)->getModifierList();
474 break;
478 OS << " clause";
479 if (cast<OpenACCCopyOutClause>(C)->getModifierList() !=
481 OS << " modifiers: "
482 << cast<OpenACCCopyOutClause>(C)->getModifierList();
483 break;
487 OS << " clause";
488 if (cast<OpenACCCreateClause>(C)->getModifierList() !=
490 OS << " modifiers: " << cast<OpenACCCreateClause>(C)->getModifierList();
491 break;
493 OS << " clause";
494 if (cast<OpenACCWaitClause>(C)->hasDevNumExpr())
495 OS << " has devnum";
496 if (cast<OpenACCWaitClause>(C)->hasQueuesTag())
497 OS << " has queues tag";
498 break;
501 OS << "(";
502 llvm::interleaveComma(
503 cast<OpenACCDeviceTypeClause>(C)->getArchitectures(), OS,
504 [&](const DeviceTypeArgument &Arch) {
505 if (Arch.getIdentifierInfo() == nullptr)
506 OS << "*";
507 else
508 OS << Arch.getIdentifierInfo()->getName();
509 });
510 OS << ")";
511 break;
513 OS << " clause Operator: "
514 << cast<OpenACCReductionClause>(C)->getReductionOp();
515 break;
517 OS << " clause";
518 if (cast<OpenACCBindClause>(C)->isIdentifierArgument())
519 OS << " identifier '"
520 << cast<OpenACCBindClause>(C)->getIdentifierArgument()->getName()
521 << "'";
522 else
523 AddChild(
524 [=] { Visit(cast<OpenACCBindClause>(C)->getStringArgument()); });
525 }
526 }
527 dumpPointer(C);
528 dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
529}
530
532 const TypeSourceInfo *TSI = A.getTypeSourceInfo();
533 if (TSI) {
534 OS << "case ";
535 dumpType(TSI->getType());
536 } else {
537 OS << "default";
538 }
539
540 if (A.isSelected())
541 OS << " selected";
542}
543
545 if (!R) {
546 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
547 OS << "<<<NULL>>> ConceptReference";
548 return;
549 }
550
551 OS << "ConceptReference";
552 dumpPointer(R);
554 OS << ' ';
556}
557
559 if (!R) {
560 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
561 OS << "<<<NULL>>> Requirement";
562 return;
563 }
564
565 {
566 ColorScope Color(OS, ShowColors, ASTDumpColor::Stmt);
567 switch (R->getKind()) {
569 OS << "TypeRequirement";
570 break;
572 OS << "SimpleRequirement";
573 break;
575 OS << "CompoundRequirement";
576 break;
578 OS << "NestedRequirement";
579 break;
580 }
581 }
582
583 dumpPointer(R);
584
585 if (auto *ER = dyn_cast<concepts::ExprRequirement>(R)) {
586 if (ER->hasNoexceptRequirement())
587 OS << " noexcept";
588 }
589
590 if (R->isDependent())
591 OS << " dependent";
592 else
593 OS << (R->isSatisfied() ? " satisfied" : " unsatisfied");
595 OS << " contains_unexpanded_pack";
596}
597
598static double GetApproxValue(const llvm::APFloat &F) {
599 llvm::APFloat V = F;
600 bool ignored;
601 V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
602 &ignored);
603 return V.convertToDouble();
604}
605
606/// True if the \p APValue \p Value can be folded onto the current line.
607static bool isSimpleAPValue(const APValue &Value) {
608 switch (Value.getKind()) {
609 case APValue::None:
611 case APValue::Int:
612 case APValue::Float:
616 case APValue::LValue:
619 return true;
620 case APValue::Vector:
621 case APValue::Array:
622 case APValue::Struct:
623 case APValue::Matrix:
624 return false;
625 case APValue::Union:
626 return isSimpleAPValue(Value.getUnionValue());
627 }
628 llvm_unreachable("unexpected APValue kind!");
629}
630
631/// Dump the children of the \p APValue \p Value.
632///
633/// \param[in] Value The \p APValue to visit
634/// \param[in] Ty The \p QualType passed to \p Visit
635///
636/// \param[in] IdxToChildFun A function mapping an \p APValue and an index
637/// to one of the child of the \p APValue
638///
639/// \param[in] NumChildren \p IdxToChildFun will be called on \p Value with
640/// the indices in the range \p [0,NumChildren(
641///
642/// \param[in] LabelSingular The label to use on a line with a single child
643/// \param[in] LabelPlurial The label to use on a line with multiple children
644void TextNodeDumper::dumpAPValueChildren(
645 const APValue &Value, QualType Ty,
646 const APValue &(*IdxToChildFun)(const APValue &, unsigned),
647 unsigned NumChildren, StringRef LabelSingular, StringRef LabelPlurial) {
648 // To save some vertical space we print up to MaxChildrenPerLine APValues
649 // considered to be simple (by isSimpleAPValue) on a single line.
650 constexpr unsigned MaxChildrenPerLine = 4;
651 unsigned I = 0;
652 while (I < NumChildren) {
653 unsigned J = I;
654 while (J < NumChildren) {
655 if (isSimpleAPValue(IdxToChildFun(Value, J)) &&
656 (J - I < MaxChildrenPerLine)) {
657 ++J;
658 continue;
659 }
660 break;
661 }
662
663 J = std::max(I + 1, J);
664
665 // Print [I,J) on a single line.
666 AddChild(J - I > 1 ? LabelPlurial : LabelSingular, [=]() {
667 for (unsigned X = I; X < J; ++X) {
668 Visit(IdxToChildFun(Value, X), Ty);
669 if (X + 1 != J)
670 OS << ", ";
671 }
672 });
673 I = J;
674 }
675}
676
678 ColorScope Color(OS, ShowColors, ASTDumpColor::ValueKind);
679 switch (Value.getKind()) {
680 case APValue::None:
681 OS << "None";
682 return;
684 OS << "Indeterminate";
685 return;
686 case APValue::Int:
687 OS << "Int ";
688 {
689 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
690 OS << Value.getInt();
691 }
692 return;
693 case APValue::Float:
694 OS << "Float ";
695 {
696 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
697 OS << GetApproxValue(Value.getFloat());
698 }
699 return;
701 OS << "FixedPoint ";
702 {
703 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
704 OS << Value.getFixedPoint();
705 }
706 return;
707 case APValue::Vector: {
708 unsigned VectorLength = Value.getVectorLength();
709 OS << "Vector length=" << VectorLength;
710
711 dumpAPValueChildren(
712 Value, Ty,
713 [](const APValue &Value, unsigned Index) -> const APValue & {
714 return Value.getVectorElt(Index);
715 },
716 VectorLength, "element", "elements");
717 return;
718 }
720 OS << "ComplexInt ";
721 {
722 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
723 OS << Value.getComplexIntReal() << " + " << Value.getComplexIntImag()
724 << 'i';
725 }
726 return;
728 OS << "ComplexFloat ";
729 {
730 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
731 OS << GetApproxValue(Value.getComplexFloatReal()) << " + "
732 << GetApproxValue(Value.getComplexFloatImag()) << 'i';
733 }
734 return;
735 case APValue::LValue: {
736 (void)Context;
737 OS << "LValue Base=";
738 APValue::LValueBase B = Value.getLValueBase();
739 if (B.isNull())
740 OS << "null";
741 else if (const auto *BE = B.dyn_cast<const Expr *>()) {
742 OS << BE->getStmtClassName() << ' ';
743 dumpPointer(BE);
744 } else if (const auto BTI = B.dyn_cast<TypeInfoLValue>()) {
745 OS << "TypeInfoLValue ";
746 ColorScope Color(OS, ShowColors, ASTDumpColor::Type);
747 BTI.print(OS, PrintPolicy);
748 } else if (B.is<DynamicAllocLValue>()) {
749 OS << "DynamicAllocLValue";
750 auto BDA = B.getDynamicAllocType();
751 dumpType(BDA);
752 } else {
753 const auto *VDB = B.get<const ValueDecl *>();
754 OS << VDB->getDeclKindName() << "Decl";
755 dumpPointer(VDB);
756 }
757 OS << ", Null=" << Value.isNullPointer()
758 << ", Offset=" << Value.getLValueOffset().getQuantity()
759 << ", HasPath=" << Value.hasLValuePath();
760 if (Value.hasLValuePath()) {
761 OS << ", PathLength=" << Value.getLValuePath().size();
762 OS << ", Path=(";
763 llvm::ListSeparator Sep;
764 for (const auto &PathEntry : Value.getLValuePath()) {
765 // We're printing all entries as array indices because don't have the
766 // type information here to do anything else.
767 OS << Sep << PathEntry.getAsArrayIndex();
768 }
769 OS << ")";
770 }
771 return;
772 }
773 case APValue::Array: {
774 unsigned ArraySize = Value.getArraySize();
775 unsigned NumInitializedElements = Value.getArrayInitializedElts();
776 OS << "Array size=" << ArraySize;
777
778 dumpAPValueChildren(
779 Value, Ty,
780 [](const APValue &Value, unsigned Index) -> const APValue & {
781 return Value.getArrayInitializedElt(Index);
782 },
783 NumInitializedElements, "element", "elements");
784
785 if (Value.hasArrayFiller()) {
786 AddChild("filler", [=] {
787 {
788 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
789 OS << ArraySize - NumInitializedElements << " x ";
790 }
791 Visit(Value.getArrayFiller(), Ty);
792 });
793 }
794
795 return;
796 }
797 case APValue::Struct: {
798 OS << "Struct";
799
800 dumpAPValueChildren(
801 Value, Ty,
802 [](const APValue &Value, unsigned Index) -> const APValue & {
803 return Value.getStructBase(Index);
804 },
805 Value.getStructNumBases(), "base", "bases");
806
807 dumpAPValueChildren(
808 Value, Ty,
809 [](const APValue &Value, unsigned Index) -> const APValue & {
810 return Value.getStructField(Index);
811 },
812 Value.getStructNumFields(), "field", "fields");
813
814 return;
815 }
816 case APValue::Matrix: {
817 unsigned NumRows = Value.getMatrixNumRows();
818 unsigned NumCols = Value.getMatrixNumColumns();
819 OS << "Matrix " << NumRows << "x" << NumCols;
820
821 dumpAPValueChildren(
822 Value, Ty,
823 [](const APValue &Value, unsigned Index) -> const APValue & {
824 return Value.getMatrixElt(Index);
825 },
826 Value.getMatrixNumElements(), "element", "elements");
827 return;
828 }
829 case APValue::Union: {
830 OS << "Union";
831 {
832 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
833 if (const FieldDecl *FD = Value.getUnionField())
834 OS << " ." << *cast<NamedDecl>(FD);
835 }
836 // If the union value is considered to be simple, fold it into the
837 // current line to save some vertical space.
838 const APValue &UnionValue = Value.getUnionValue();
839 if (isSimpleAPValue(UnionValue)) {
840 OS << ' ';
841 Visit(UnionValue, Ty);
842 } else {
843 AddChild([=] { Visit(UnionValue, Ty); });
844 }
845
846 return;
847 }
849 OS << "MemberPointer ";
850 auto Path = Value.getMemberPointerPath();
851 for (const CXXRecordDecl *D : Path) {
852 {
853 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclName);
854 OS << D->getDeclName();
855 }
856 OS << "::";
857 }
858
859 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclName);
860 if (const ValueDecl *MemDecl = Value.getMemberPointerDecl())
861 OS << MemDecl->getDeclName();
862 else
863 OS << "null";
864 return;
865 }
867 OS << "AddrLabelDiff ";
868 OS << "&&" << Value.getAddrLabelDiffLHS()->getLabel()->getName();
869 OS << " - ";
870 OS << "&&" << Value.getAddrLabelDiffRHS()->getLabel()->getName();
871 return;
872 }
873 llvm_unreachable("Unknown APValue kind!");
874}
875
876void TextNodeDumper::dumpPointer(const void *Ptr) {
877 ColorScope Color(OS, ShowColors, ASTDumpColor::Address);
878 OS << ' ' << Ptr;
879}
880
882 if (!SM)
883 return;
884
885 ColorScope Color(OS, ShowColors, ASTDumpColor::Location);
886 SourceLocation SpellingLoc = SM->getSpellingLoc(Loc);
887
888 // The general format we print out is filename:line:col, but we drop pieces
889 // that haven't changed since the last loc printed.
890 PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc);
891
892 if (PLoc.isInvalid()) {
893 OS << "<invalid sloc>";
894 return;
895 }
896
897 if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) {
898 OS << PLoc.getFilename() << ':' << PLoc.getLine() << ':'
899 << PLoc.getColumn();
900 LastLocFilename = PLoc.getFilename();
901 LastLocLine = PLoc.getLine();
902 } else if (PLoc.getLine() != LastLocLine) {
903 OS << "line" << ':' << PLoc.getLine() << ':' << PLoc.getColumn();
904 LastLocLine = PLoc.getLine();
905 } else {
906 OS << "col" << ':' << PLoc.getColumn();
907 }
908}
909
911 // Can't translate locations if a SourceManager isn't available.
912 if (!SM)
913 return;
914
915 OS << " <";
917 if (R.getBegin() != R.getEnd()) {
918 OS << ", ";
919 dumpLocation(R.getEnd());
920 }
921 OS << ">";
922
923 // <t2.c:123:421[blah], t2.c:412:321>
924}
925
927 ColorScope Color(OS, ShowColors, ASTDumpColor::Type);
928
929 SplitQualType T_split = T.split();
930 std::string T_str = QualType::getAsString(T_split, PrintPolicy);
931 OS << "'" << T_str << "'";
932
933 if (Desugar && !T.isNull()) {
934 // If the type is sugared, also dump a (shallow) desugared type when
935 // it is visibly different.
936 SplitQualType D_split = T.getSplitDesugaredType();
937 if (T_split != D_split) {
938 std::string D_str = QualType::getAsString(D_split, PrintPolicy);
939 if (T_str != D_str)
940 OS << ":'" << QualType::getAsString(D_split, PrintPolicy) << "'";
941 }
942 }
943}
944
946 OS << ' ';
947 dumpBareType(T);
948}
949
951 if (!D) {
952 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
953 OS << "<<<NULL>>>";
954 return;
955 }
956
957 {
958 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
959 OS << D->getDeclKindName();
960 }
961 dumpPointer(D);
962
963 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
964 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclName);
965 if (DeclarationName Name = ND->getDeclName())
966 OS << " '" << Name << '\'';
967 else
968 switch (ND->getKind()) {
969 case Decl::Decomposition: {
970 auto *DD = cast<DecompositionDecl>(ND);
971 OS << " first_binding '" << DD->bindings()[0]->getDeclName() << '\'';
972 break;
973 }
974 case Decl::Field: {
975 auto *FD = cast<FieldDecl>(ND);
976 OS << " field_index " << FD->getFieldIndex();
977 break;
978 }
979 case Decl::ParmVar: {
980 auto *PD = cast<ParmVarDecl>(ND);
981 OS << " depth " << PD->getFunctionScopeDepth() << " index "
982 << PD->getFunctionScopeIndex();
983 break;
984 }
985 case Decl::TemplateTypeParm: {
986 auto *TD = cast<TemplateTypeParmDecl>(ND);
987 OS << " depth " << TD->getDepth() << " index " << TD->getIndex();
988 break;
989 }
990 case Decl::NonTypeTemplateParm: {
991 auto *TD = cast<NonTypeTemplateParmDecl>(ND);
992 OS << " depth " << TD->getDepth() << " index " << TD->getIndex();
993 break;
994 }
995 default:
996 // Var, Namespace, (CXX)Record: Nothing else besides source location.
997 dumpSourceRange(ND->getSourceRange());
998 break;
999 }
1000 }
1001
1002 if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
1003 dumpType(VD->getType());
1004}
1005
1007 if (ND->getDeclName()) {
1008 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclName);
1009 OS << ' ' << ND->getDeclName();
1010 }
1011}
1012
1014 const auto AccessSpelling = getAccessSpelling(AS);
1015 if (AccessSpelling.empty())
1016 return;
1017 OS << AccessSpelling;
1018}
1019
1022 if (auto *BD = dyn_cast<BlockDecl *>(C))
1023 dumpDeclRef(BD, "cleanup");
1024 else if (auto *CLE = dyn_cast<CompoundLiteralExpr *>(C))
1025 AddChild([=] {
1026 OS << "cleanup ";
1027 {
1028 ColorScope Color(OS, ShowColors, ASTDumpColor::Stmt);
1029 OS << CLE->getStmtClassName();
1030 }
1031 dumpPointer(CLE);
1032 });
1033 else
1034 llvm_unreachable("unexpected cleanup type");
1035}
1036
1039 switch (TSK) {
1040 case TSK_Undeclared:
1041 break;
1043 OS << " implicit_instantiation";
1044 break;
1046 OS << " explicit_specialization";
1047 break;
1049 OS << " explicit_instantiation_declaration";
1050 break;
1052 OS << " explicit_instantiation_definition";
1053 break;
1054 }
1055}
1056
1058 if (!NNS)
1059 return;
1060
1061 AddChild([=] {
1062 OS << "NestedNameSpecifier";
1063
1064 switch (NNS.getKind()) {
1066 auto [Namespace, Prefix] = NNS.getAsNamespaceAndPrefix();
1067 OS << " "; // "Namespace" is printed as the decl kind.
1068 dumpBareDeclRef(Namespace);
1070 break;
1071 }
1073 OS << " TypeSpec";
1074 dumpType(QualType(NNS.getAsType(), 0));
1075 break;
1077 OS << " Global";
1078 break;
1080 OS << " Super";
1081 break;
1083 llvm_unreachable("unexpected null nested name specifier");
1084 }
1085 });
1086}
1087
1088void TextNodeDumper::dumpDeclRef(const Decl *D, StringRef Label) {
1089 if (!D)
1090 return;
1091
1092 AddChild([=] {
1093 if (!Label.empty())
1094 OS << Label << ' ';
1095 dumpBareDeclRef(D);
1096 });
1097}
1098
1101 {
1102 llvm::raw_svector_ostream SS(Str);
1103 TA.print(PrintPolicy, SS, /*IncludeType=*/true);
1104 }
1105 OS << " '" << Str << "'";
1106
1107 if (!Context)
1108 return;
1109
1110 if (TemplateArgument CanonTA = Context->getCanonicalTemplateArgument(TA);
1111 !CanonTA.structurallyEquals(TA)) {
1112 llvm::SmallString<128> CanonStr;
1113 {
1114 llvm::raw_svector_ostream SS(CanonStr);
1115 CanonTA.print(PrintPolicy, SS, /*IncludeType=*/true);
1116 }
1117 if (CanonStr != Str)
1118 OS << ":'" << CanonStr << "'";
1119 }
1120}
1121
1122const char *TextNodeDumper::getCommandName(unsigned CommandID) {
1123 if (Traits)
1124 return Traits->getCommandInfo(CommandID)->Name;
1125 const comments::CommandInfo *Info =
1127 if (Info)
1128 return Info->Name;
1129 return "<not a builtin command>";
1130}
1131
1132void TextNodeDumper::printFPOptions(FPOptionsOverride FPO) {
1133#define FP_OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
1134 if (FPO.has##NAME##Override()) \
1135 OS << " " #NAME "=" << FPO.get##NAME##Override();
1136#include "clang/Basic/FPOptions.def"
1137}
1138
1140 const comments::FullComment *) {
1141 OS << " Text=\"" << C->getText() << "\"";
1142}
1143
1146 OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
1147 switch (C->getRenderKind()) {
1149 OS << " RenderNormal";
1150 break;
1152 OS << " RenderBold";
1153 break;
1155 OS << " RenderMonospaced";
1156 break;
1158 OS << " RenderEmphasized";
1159 break;
1161 OS << " RenderAnchor";
1162 break;
1163 }
1164
1165 for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
1166 OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
1167}
1168
1171 OS << " Name=\"" << C->getTagName() << "\"";
1172 if (C->getNumAttrs() != 0) {
1173 OS << " Attrs: ";
1174 for (unsigned i = 0, e = C->getNumAttrs(); i != e; ++i) {
1175 const comments::HTMLStartTagComment::Attribute &Attr = C->getAttr(i);
1176 OS << " \"" << Attr.Name << "=\"" << Attr.Value << "\"";
1177 }
1178 }
1179 if (C->isSelfClosing())
1180 OS << " SelfClosing";
1181}
1182
1185 OS << " Name=\"" << C->getTagName() << "\"";
1186}
1187
1190 OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
1191 for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
1192 OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
1193}
1194
1197 OS << " "
1199
1200 if (C->isDirectionExplicit())
1201 OS << " explicitly";
1202 else
1203 OS << " implicitly";
1204
1205 if (C->hasParamName()) {
1206 if (C->isParamIndexValid())
1207 OS << " Param=\"" << C->getParamName(FC) << "\"";
1208 else
1209 OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
1210 }
1211
1212 if (C->isParamIndexValid() && !C->isVarArgParam())
1213 OS << " ParamIndex=" << C->getParamIndex();
1214}
1215
1218 if (C->hasParamName()) {
1219 if (C->isPositionValid())
1220 OS << " Param=\"" << C->getParamName(FC) << "\"";
1221 else
1222 OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
1223 }
1224
1225 if (C->isPositionValid()) {
1226 OS << " Position=<";
1227 for (unsigned i = 0, e = C->getDepth(); i != e; ++i) {
1228 OS << C->getIndex(i);
1229 if (i != e - 1)
1230 OS << ", ";
1231 }
1232 OS << ">";
1233 }
1234}
1235
1238 OS << " Name=\"" << getCommandName(C->getCommandID())
1239 << "\""
1240 " CloseName=\""
1241 << C->getCloseName() << "\"";
1242}
1243
1246 const comments::FullComment *) {
1247 OS << " Text=\"" << C->getText() << "\"";
1248}
1249
1252 OS << " Text=\"" << C->getText() << "\"";
1253}
1254
1256 OS << " null";
1257}
1258
1260 OS << " type";
1262}
1263
1265 const TemplateArgument &TA) {
1266 OS << " decl";
1268 dumpDeclRef(TA.getAsDecl());
1269}
1270
1272 OS << " nullptr";
1274}
1275
1277 OS << " integral";
1279}
1280
1282 const TemplateArgument &TA) {
1283 OS << " structural value";
1285}
1286
1288 AddChild(Label, [=] {
1289 {
1291 {
1292 llvm::raw_svector_ostream SS(Str);
1293 TN.print(SS, PrintPolicy);
1294 }
1295 OS << "'" << Str << "'";
1296
1297 if (Context) {
1298 if (TemplateName CanonTN = Context->getCanonicalTemplateName(TN);
1299 CanonTN != TN) {
1300 llvm::SmallString<128> CanonStr;
1301 {
1302 llvm::raw_svector_ostream SS(CanonStr);
1303 CanonTN.print(SS, PrintPolicy);
1304 }
1305 if (CanonStr != Str)
1306 OS << ":'" << CanonStr << "'";
1307 }
1308 }
1309 }
1311 });
1312}
1313
1315 switch (TN.getKind()) {
1317 AddChild([=] { Visit(TN.getAsTemplateDecl()); });
1318 return;
1320 const UsingShadowDecl *USD = TN.getAsUsingShadowDecl();
1321 AddChild([=] { Visit(USD); });
1322 AddChild("target", [=] { Visit(USD->getTargetDecl()); });
1323 return;
1324 }
1326 OS << " qualified";
1328 if (QTN->hasTemplateKeyword())
1329 OS << " keyword";
1332 return;
1333 }
1335 OS << " dependent";
1338 return;
1339 }
1341 OS << " subst";
1344 OS << " index " << STS->getIndex();
1345 if (UnsignedOrNone PackIndex = STS->getPackIndex())
1346 OS << " pack_index " << *PackIndex;
1347 if (STS->getFinal())
1348 OS << " final";
1349 if (const TemplateTemplateParmDecl *P = STS->getParameter())
1350 AddChild("parameter", [=] { Visit(P); });
1351 dumpDeclRef(STS->getAssociatedDecl(), "associated");
1352 dumpTemplateName(STS->getReplacement(), "replacement");
1353 return;
1354 }
1356 OS << " deduced";
1358 dumpTemplateName(DTS->getUnderlying(), "underlying");
1359 AddChild("defaults", [=] {
1360 auto [StartPos, Args] = DTS->getDefaultArguments();
1361 OS << " start " << StartPos;
1362 for (const TemplateArgument &Arg : Args)
1363 AddChild([=] { Visit(Arg, SourceRange()); });
1364 });
1365 return;
1366 }
1367 // FIXME: Implement these.
1369 OS << " overloaded";
1370 return;
1372 OS << " assumed";
1373 return;
1375 OS << " subst_pack";
1376 return;
1377 }
1378 llvm_unreachable("Unexpected TemplateName Kind");
1379}
1380
1386
1393
1395 const TemplateArgument &TA) {
1396 OS << " expr";
1397 if (TA.isCanonicalExpr())
1398 OS << " canonical";
1400}
1401
1403 OS << " pack";
1405}
1406
1407static void dumpBasePath(raw_ostream &OS, const CastExpr *Node) {
1408 if (Node->path_empty())
1409 return;
1410
1411 OS << " (";
1412 bool First = true;
1414 E = Node->path_end();
1415 I != E; ++I) {
1416 const CXXBaseSpecifier *Base = *I;
1417 if (!First)
1418 OS << " -> ";
1419
1420 const auto *RD = cast<CXXRecordDecl>(
1421 Base->getType()->castAsCanonical<RecordType>()->getDecl());
1422
1423 if (Base->isVirtual())
1424 OS << "virtual ";
1425 OS << RD->getName();
1426 First = false;
1427 }
1428
1429 OS << ')';
1430}
1431
1433 if (!Node->hasLabelTarget())
1434 return;
1435
1436 OS << " '" << Node->getLabelDecl()->getIdentifier()->getName() << "' (";
1437
1438 auto *Target = Node->getNamedLoopOrSwitch();
1439 if (!Target) {
1440 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
1441 OS << "<<<NULL>>>";
1442 } else {
1443 {
1444 ColorScope Color(OS, ShowColors, ASTDumpColor::Stmt);
1445 OS << Target->getStmtClassName();
1446 }
1448 }
1449 OS << ")";
1450}
1451
1453 if (Node->hasInitStorage())
1454 OS << " has_init";
1455 if (Node->hasVarStorage())
1456 OS << " has_var";
1457 if (Node->hasElseStorage())
1458 OS << " has_else";
1459 if (Node->isConstexpr())
1460 OS << " constexpr";
1461 if (Node->isConsteval()) {
1462 OS << " ";
1463 if (Node->isNegatedConsteval())
1464 OS << "!";
1465 OS << "consteval";
1466 }
1467}
1468
1470 if (Node->hasInitStorage())
1471 OS << " has_init";
1472 if (Node->hasVarStorage())
1473 OS << " has_var";
1474}
1475
1477 if (Node->hasVarStorage())
1478 OS << " has_var";
1479}
1480
1482 OS << " '" << Node->getName() << "'";
1483 if (Node->isSideEntry())
1484 OS << " side_entry";
1485}
1486
1488 OS << " '" << Node->getLabel()->getName() << "'";
1489 dumpPointer(Node->getLabel());
1490}
1491
1493 if (Node->caseStmtIsGNURange())
1494 OS << " gnu_range";
1495}
1496
1498 if (const VarDecl *Cand = Node->getNRVOCandidate()) {
1499 OS << " nrvo_candidate(";
1500 dumpBareDeclRef(Cand);
1501 OS << ")";
1502 }
1503}
1504
1506 if (Node->isImplicit())
1507 OS << " implicit";
1508}
1509
1511 if (Node->isImplicit())
1512 OS << " implicit";
1513}
1514
1516 if (Node->hasAPValueResult())
1517 AddChild("value",
1518 [=] { Visit(Node->getAPValueResult(), Node->getType()); });
1519}
1520
1522 if (Node->usesADL())
1523 OS << " adl";
1524 if (Node->hasStoredFPFeatures())
1525 printFPOptions(Node->getFPFeatures());
1526}
1527
1529 const char *OperatorSpelling = clang::getOperatorSpelling(Node->getOperator());
1530 if (OperatorSpelling)
1531 OS << " '" << OperatorSpelling << "'";
1532
1533 VisitCallExpr(Node);
1534}
1535
1537 OS << " <";
1538 {
1539 ColorScope Color(OS, ShowColors, ASTDumpColor::Cast);
1540 OS << Node->getCastKindName();
1541 }
1542 dumpBasePath(OS, Node);
1543 OS << ">";
1544 if (Node->hasStoredFPFeatures())
1545 printFPOptions(Node->getFPFeatures());
1546}
1547
1549 VisitCastExpr(Node);
1550 if (Node->isPartOfExplicitCast())
1551 OS << " part_of_explicit_cast";
1552}
1553
1555 OS << " ";
1556 dumpBareDeclRef(Node->getDecl());
1558 if (Node->getDecl() != Node->getFoundDecl()) {
1559 OS << " (";
1561 OS << ")";
1562 }
1563 switch (Node->isNonOdrUse()) {
1564 case NOUR_None: break;
1565 case NOUR_Unevaluated: OS << " non_odr_use_unevaluated"; break;
1566 case NOUR_Constant: OS << " non_odr_use_constant"; break;
1567 case NOUR_Discarded: OS << " non_odr_use_discarded"; break;
1568 }
1570 OS << " dependent_capture";
1571 else if (Node->refersToEnclosingVariableOrCapture())
1572 OS << " refers_to_enclosing_variable_or_capture";
1573
1574 if (Node->isImmediateEscalating())
1575 OS << " immediate-escalating";
1576}
1577
1583
1585 const UnresolvedLookupExpr *Node) {
1586 OS << " (";
1587 if (!Node->requiresADL())
1588 OS << "no ";
1589 OS << "ADL) = '" << Node->getName() << '\'';
1590
1592 E = Node->decls_end();
1593 if (I == E)
1594 OS << " empty";
1595 for (; I != E; ++I)
1596 dumpPointer(*I);
1597}
1598
1600 {
1601 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
1602 OS << " " << Node->getDecl()->getDeclKindName() << "Decl";
1603 }
1604 OS << "='" << *Node->getDecl() << "'";
1605 dumpPointer(Node->getDecl());
1606 if (Node->isFreeIvar())
1607 OS << " isFreeIvar";
1608}
1609
1614
1618
1620 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
1621 OS << " " << Node->getValue();
1622}
1623
1625 bool isSigned = Node->getType()->isSignedIntegerType();
1626 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
1627 OS << " " << toString(Node->getValue(), 10, isSigned);
1628}
1629
1631 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
1632 OS << " " << Node->getValueAsString(/*Radix=*/10);
1633}
1634
1636 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
1637 OS << " " << Node->getValueAsApproximateDouble();
1638}
1639
1641 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
1642 OS << " ";
1643 Str->outputString(OS);
1644}
1645
1647 if (auto *Field = ILE->getInitializedFieldInUnion()) {
1648 OS << " field ";
1649 dumpBareDeclRef(Field);
1650 }
1651}
1652
1654 if (E->isResultDependent())
1655 OS << " result_dependent";
1656}
1657
1659 OS << " " << (Node->isPostfix() ? "postfix" : "prefix") << " '"
1660 << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1661 if (!Node->canOverflow())
1662 OS << " cannot overflow";
1663 if (Node->hasStoredFPFeatures())
1664 printFPOptions(Node->getStoredFPFeatures());
1665}
1666
1668 const UnaryExprOrTypeTraitExpr *Node) {
1669 OS << " " << getTraitSpelling(Node->getKind());
1670
1671 if (Node->isArgumentType())
1672 dumpType(Node->getArgumentType());
1673}
1674
1676 OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl();
1677 dumpPointer(Node->getMemberDecl());
1679 switch (Node->isNonOdrUse()) {
1680 case NOUR_None: break;
1681 case NOUR_Unevaluated: OS << " non_odr_use_unevaluated"; break;
1682 case NOUR_Constant: OS << " non_odr_use_constant"; break;
1683 case NOUR_Discarded: OS << " non_odr_use_discarded"; break;
1684 }
1685}
1686
1688 const ExtVectorElementExpr *Node) {
1689 OS << " " << Node->getAccessor().getNameStart();
1690}
1691
1693 OS << " " << Node->getAccessor().getNameStart();
1694}
1695
1697 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1698 if (Node->hasStoredFPFeatures())
1699 printFPOptions(Node->getStoredFPFeatures());
1700}
1701
1703 const CompoundAssignOperator *Node) {
1704 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
1705 << "' ComputeLHSTy=";
1707 OS << " ComputeResultTy=";
1709 if (Node->hasStoredFPFeatures())
1710 printFPOptions(Node->getStoredFPFeatures());
1711}
1712
1714 OS << " " << Node->getLabel()->getName();
1715 dumpPointer(Node->getLabel());
1716}
1717
1719 OS << " " << Node->getCastName() << "<"
1720 << Node->getTypeAsWritten().getAsString() << ">"
1721 << " <" << Node->getCastKindName();
1722 dumpBasePath(OS, Node);
1723 OS << ">";
1724}
1725
1727 OS << " " << (Node->getValue() ? "true" : "false");
1728}
1729
1731 if (Node->isImplicit())
1732 OS << " implicit";
1734 OS << " dependent_capture";
1735 OS << " this";
1736}
1737
1739 const CXXFunctionalCastExpr *Node) {
1740 OS << " functional cast to " << Node->getTypeAsWritten().getAsString() << " <"
1741 << Node->getCastKindName() << ">";
1742 if (Node->hasStoredFPFeatures())
1743 printFPOptions(Node->getFPFeatures());
1744}
1745
1748 if (Node->hasStoredFPFeatures())
1749 printFPOptions(Node->getFPFeatures());
1750}
1751
1753 const CXXUnresolvedConstructExpr *Node) {
1754 dumpType(Node->getTypeAsWritten());
1755 if (Node->isListInitialization())
1756 OS << " list";
1757}
1758
1760 CXXConstructorDecl *Ctor = Node->getConstructor();
1761 dumpType(Ctor->getType());
1762 if (Node->isElidable())
1763 OS << " elidable";
1764 if (Node->isListInitialization())
1765 OS << " list";
1766 if (Node->isStdInitListInitialization())
1767 OS << " std::initializer_list";
1768 if (Node->requiresZeroInitialization())
1769 OS << " zeroing";
1770 if (Node->isImmediateEscalating())
1771 OS << " immediate-escalating";
1772}
1773
1775 const CXXBindTemporaryExpr *Node) {
1776 OS << " (CXXTemporary";
1777 dumpPointer(Node);
1778 OS << ")";
1779}
1780
1782 if (Node->isGlobalNew())
1783 OS << " global";
1784 if (Node->isArray())
1785 OS << " array";
1786 if (Node->getOperatorNew()) {
1787 OS << ' ';
1789 }
1790 // We could dump the deallocation function used in case of error, but it's
1791 // usually not that interesting.
1792}
1793
1795 if (Node->isGlobalDelete())
1796 OS << " global";
1797 if (Node->isArrayForm())
1798 OS << " array";
1799 if (Node->getOperatorDelete()) {
1800 OS << ' ';
1802 }
1803}
1804
1806 OS << " " << getTraitSpelling(Node->getTrait());
1807}
1808
1810 OS << " " << getTraitSpelling(Node->getTrait());
1811}
1812
1816
1818 if (Node->hasRewrittenInit())
1819 OS << " has rewritten init";
1820}
1821
1823 if (Node->hasRewrittenInit())
1824 OS << " has rewritten init";
1825}
1826
1828 const MaterializeTemporaryExpr *Node) {
1829 if (const ValueDecl *VD = Node->getExtendingDecl()) {
1830 OS << " extended by ";
1831 dumpBareDeclRef(VD);
1832 }
1833}
1834
1836 for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i)
1837 dumpCleanupObject(Node->getObject(i));
1838}
1839
1841 dumpPointer(Node->getPack());
1842 dumpName(Node->getPack());
1843}
1844
1846 const CXXDependentScopeMemberExpr *Node) {
1847 OS << " " << (Node->isArrow() ? "->" : ".") << Node->getMember();
1848}
1849
1851 OS << " selector=";
1852 Node->getSelector().print(OS);
1853 switch (Node->getReceiverKind()) {
1855 break;
1856
1858 OS << " class=";
1860 break;
1861
1863 OS << " super (instance)";
1864 break;
1865
1867 OS << " super (class)";
1868 break;
1869 }
1870}
1871
1873 if (auto *BoxingMethod = Node->getBoxingMethod()) {
1874 OS << " selector=";
1875 BoxingMethod->getSelector().print(OS);
1876 }
1877}
1878
1880 if (!Node->getCatchParamDecl())
1881 OS << " catch all";
1882}
1883
1887
1889 OS << " ";
1890 Node->getSelector().print(OS);
1891}
1892
1894 OS << ' ' << *Node->getProtocol();
1895}
1896
1898 if (Node->isImplicitProperty()) {
1899 OS << " Kind=MethodRef Getter=\"";
1900 if (Node->getImplicitPropertyGetter())
1902 else
1903 OS << "(null)";
1904
1905 OS << "\" Setter=\"";
1906 if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
1907 Setter->getSelector().print(OS);
1908 else
1909 OS << "(null)";
1910 OS << "\"";
1911 } else {
1912 OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty()
1913 << '"';
1914 }
1915
1916 if (Node->isSuperReceiver())
1917 OS << " super";
1918
1919 OS << " Messaging=";
1920 if (Node->isMessagingGetter() && Node->isMessagingSetter())
1921 OS << "Getter&Setter";
1922 else if (Node->isMessagingGetter())
1923 OS << "Getter";
1924 else if (Node->isMessagingSetter())
1925 OS << "Setter";
1926}
1927
1929 const ObjCSubscriptRefExpr *Node) {
1930 if (Node->isArraySubscriptRefExpr())
1931 OS << " Kind=ArraySubscript GetterForArray=\"";
1932 else
1933 OS << " Kind=DictionarySubscript GetterForDictionary=\"";
1934 if (Node->getAtIndexMethodDecl())
1935 Node->getAtIndexMethodDecl()->getSelector().print(OS);
1936 else
1937 OS << "(null)";
1938
1939 if (Node->isArraySubscriptRefExpr())
1940 OS << "\" SetterForArray=\"";
1941 else
1942 OS << "\" SetterForDictionary=\"";
1943 if (Node->setAtIndexMethodDecl())
1944 Node->setAtIndexMethodDecl()->getSelector().print(OS);
1945 else
1946 OS << "(null)";
1947}
1948
1950 OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
1951}
1952
1954 OS << " ";
1955 for (unsigned I = 0, E = Node->numOfIterators(); I < E; ++I) {
1956 Visit(Node->getIteratorDecl(I));
1957 OS << " = ";
1958 const OMPIteratorExpr::IteratorRange Range = Node->getIteratorRange(I);
1959 OS << " begin ";
1960 Visit(Range.Begin);
1961 OS << " end ";
1962 Visit(Range.End);
1963 if (Range.Step) {
1964 OS << " step ";
1965 Visit(Range.Step);
1966 }
1967 }
1968}
1969
1975
1977 const RequiresExpr *Node) {
1978 if (!Node->isValueDependent())
1979 OS << (Node->isSatisfied() ? " satisfied" : " unsatisfied");
1980}
1981
1983 if (T->isSpelledAsLValue())
1984 OS << " written as lvalue reference";
1985}
1986
1988 switch (T->getSizeModifier()) {
1990 break;
1992 OS << " static";
1993 break;
1995 OS << " *";
1996 break;
1997 }
1998 OS << " " << T->getIndexTypeQualifiers().getAsString();
1999}
2000
2002 OS << " " << T->getSize();
2003 VisitArrayType(T);
2004}
2005
2009
2014
2016 const DependentSizedExtVectorType *T) {
2017 OS << " ";
2018 dumpLocation(T->getAttributeLoc());
2019}
2020
2022 switch (T->getVectorKind()) {
2024 break;
2026 OS << " altivec";
2027 break;
2029 OS << " altivec pixel";
2030 break;
2032 OS << " altivec bool";
2033 break;
2034 case VectorKind::Neon:
2035 OS << " neon";
2036 break;
2038 OS << " neon poly";
2039 break;
2041 OS << " fixed-length sve data vector";
2042 break;
2044 OS << " fixed-length sve predicate vector";
2045 break;
2047 OS << " fixed-length rvv data vector";
2048 break;
2053 OS << " fixed-length rvv mask vector";
2054 break;
2055 }
2056 OS << " " << T->getNumElements();
2057}
2058
2060 auto EI = T->getExtInfo();
2061 if (EI.getNoReturn())
2062 OS << " noreturn";
2063 if (EI.getProducesResult())
2064 OS << " produces_result";
2065 if (EI.getHasRegParm())
2066 OS << " regparm " << EI.getRegParm();
2067 OS << " " << FunctionType::getNameForCallConv(EI.getCC());
2068}
2069
2071 auto EPI = T->getExtProtoInfo();
2072 if (EPI.HasTrailingReturn)
2073 OS << " trailing_return";
2074 if (T->isConst())
2075 OS << " const";
2076 if (T->isVolatile())
2077 OS << " volatile";
2078 if (T->isRestrict())
2079 OS << " restrict";
2080 if (T->getExtProtoInfo().Variadic)
2081 OS << " variadic";
2082 switch (EPI.RefQualifier) {
2083 case RQ_None:
2084 break;
2085 case RQ_LValue:
2086 OS << " &";
2087 break;
2088 case RQ_RValue:
2089 OS << " &&";
2090 break;
2091 }
2092
2093 switch (EPI.ExceptionSpec.Type) {
2094 case EST_None:
2095 break;
2096 case EST_DynamicNone:
2097 OS << " exceptionspec_dynamic_none";
2098 break;
2099 case EST_Dynamic:
2100 OS << " exceptionspec_dynamic";
2101 break;
2102 case EST_MSAny:
2103 OS << " exceptionspec_ms_any";
2104 break;
2105 case EST_NoThrow:
2106 OS << " exceptionspec_nothrow";
2107 break;
2108 case EST_BasicNoexcept:
2109 OS << " exceptionspec_basic_noexcept";
2110 break;
2112 OS << " exceptionspec_dependent_noexcept";
2113 break;
2114 case EST_NoexceptFalse:
2115 OS << " exceptionspec_noexcept_false";
2116 break;
2117 case EST_NoexceptTrue:
2118 OS << " exceptionspec_noexcept_true";
2119 break;
2120 case EST_Unevaluated:
2121 OS << " exceptionspec_unevaluated";
2122 break;
2123 case EST_Uninstantiated:
2124 OS << " exceptionspec_uninstantiated";
2125 break;
2126 case EST_Unparsed:
2127 OS << " exceptionspec_unparsed";
2128 break;
2129 }
2130 if (!EPI.ExceptionSpec.Exceptions.empty()) {
2131 AddChild([=] {
2132 OS << "Exceptions:";
2133 for (unsigned I = 0, N = EPI.ExceptionSpec.Exceptions.size(); I != N;
2134 ++I) {
2135 if (I)
2136 OS << ",";
2137 dumpType(EPI.ExceptionSpec.Exceptions[I]);
2138 }
2139 });
2140 }
2141 if (EPI.ExceptionSpec.NoexceptExpr) {
2142 AddChild([=] {
2143 OS << "NoexceptExpr: ";
2144 Visit(EPI.ExceptionSpec.NoexceptExpr);
2145 });
2146 }
2147 dumpDeclRef(EPI.ExceptionSpec.SourceDecl, "ExceptionSourceDecl");
2148 dumpDeclRef(EPI.ExceptionSpec.SourceTemplate, "ExceptionSourceTemplate");
2149
2150 // FIXME: Consumed parameters.
2152}
2153
2155 if (ElaboratedTypeKeyword K = T->getKeyword();
2157 OS << ' ' << TypeWithKeyword::getKeywordName(K);
2158 dumpNestedNameSpecifier(T->getQualifier());
2159 dumpDeclRef(T->getDecl());
2160}
2161
2163 if (ElaboratedTypeKeyword K = T->getKeyword();
2165 OS << ' ' << TypeWithKeyword::getKeywordName(K);
2166 dumpNestedNameSpecifier(T->getQualifier());
2167 dumpDeclRef(T->getDecl());
2168 dumpType(T->desugar());
2169}
2170
2172 if (ElaboratedTypeKeyword K = T->getKeyword();
2174 OS << ' ' << TypeWithKeyword::getKeywordName(K);
2175 dumpNestedNameSpecifier(T->getQualifier());
2176 dumpDeclRef(T->getDecl());
2177 if (!T->typeMatchesDecl()) {
2178 OS << " divergent";
2179 dumpType(T->desugar());
2180 }
2181}
2182
2183void TextNodeDumper::VisitUnaryTransformType(const UnaryTransformType *T) {
2184 switch (T->getUTTKind()) {
2185#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
2186 case UnaryTransformType::Enum: \
2187 OS << " " #Trait; \
2188 break;
2189#include "clang/Basic/TransformTypeTraits.def"
2190 }
2191}
2192
2193void TextNodeDumper::VisitTagType(const TagType *T) {
2194 if (T->isCanonicalUnqualified())
2195 OS << " canonical";
2196 if (T->isTagOwned())
2197 OS << " owns_tag";
2198 if (T->isInjected())
2199 OS << " injected";
2200 if (ElaboratedTypeKeyword K = T->getKeyword();
2202 OS << ' ' << TypeWithKeyword::getKeywordName(K);
2203 dumpNestedNameSpecifier(T->getQualifier());
2204 dumpDeclRef(T->getDecl());
2205}
2206
2207void TextNodeDumper::VisitTemplateTypeParmType(const TemplateTypeParmType *T) {
2208 OS << " depth " << T->getDepth() << " index " << T->getIndex();
2209 if (T->isParameterPack())
2210 OS << " pack";
2211 dumpDeclRef(T->getDecl());
2212}
2213
2215 const SubstTemplateTypeParmType *T) {
2216 dumpDeclRef(T->getAssociatedDecl());
2217 VisitTemplateTypeParmDecl(T->getReplacedParameter());
2218 if (auto PackIndex = T->getPackIndex())
2219 OS << " pack_index " << *PackIndex;
2220 if (T->getFinal())
2221 OS << " final";
2222}
2223
2225 const SubstTemplateTypeParmPackType *T) {
2226 dumpDeclRef(T->getAssociatedDecl());
2227 VisitTemplateTypeParmDecl(T->getReplacedParameter());
2228}
2229
2230void TextNodeDumper::VisitAutoType(const AutoType *T) {
2231 if (T->isDecltypeAuto())
2232 OS << " decltype(auto)";
2233 if (!T->isDeduced())
2234 OS << " undeduced";
2235 if (T->isConstrained())
2236 dumpDeclRef(T->getTypeConstraintConcept());
2237}
2238
2240 const DeducedTemplateSpecializationType *T) {
2241 dumpTemplateName(T->getTemplateName(), "name");
2242}
2243
2245 const TemplateSpecializationType *T) {
2246 if (T->isTypeAlias())
2247 OS << " alias";
2248 if (ElaboratedTypeKeyword K = T->getKeyword();
2250 OS << ' ' << TypeWithKeyword::getKeywordName(K);
2251 dumpTemplateName(T->getTemplateName(), "name");
2252}
2253
2255 const InjectedClassNameType *T) {
2256 dumpDeclRef(T->getDecl());
2257}
2258
2262
2263void TextNodeDumper::VisitPackExpansionType(const PackExpansionType *T) {
2264 if (auto N = T->getNumExpansions())
2265 OS << " expansions " << *N;
2266}
2267
2269 // By default, add extra Type details with no extra loc info.
2271}
2272// FIXME: override behavior for TypeLocs that have interesting location
2273// information, such as the qualifier in ElaboratedTypeLoc.
2274
2276
2278 dumpName(D);
2280 if (D->isModulePrivate())
2281 OS << " __module_private__";
2282}
2283
2285 if (D->isScoped()) {
2286 if (D->isScopedUsingClassTag())
2287 OS << " class";
2288 else
2289 OS << " struct";
2290 }
2291 dumpName(D);
2292 if (D->isModulePrivate())
2293 OS << " __module_private__";
2294 if (D->isFixed())
2296
2297 if (const auto *Instance = D->getTemplateInstantiationPattern()) {
2298 OS << " instantiated_from";
2299 dumpPointer(Instance);
2300 }
2301}
2302
2304 OS << ' ' << D->getKindName();
2305 dumpName(D);
2306 if (D->isModulePrivate())
2307 OS << " __module_private__";
2308 if (D->isCompleteDefinition())
2309 OS << " definition";
2310}
2311
2316
2318 dumpName(D);
2319 dumpType(D->getType());
2320
2321 for (const auto *Child : D->chain())
2322 dumpDeclRef(Child);
2323}
2324
2326 dumpName(D);
2327 dumpType(D->getType());
2329
2330 StorageClass SC = D->getStorageClass();
2331 if (SC != SC_None)
2333 if (D->isInlineSpecified())
2334 OS << " inline";
2335 if (D->isVirtualAsWritten())
2336 OS << " virtual";
2337 if (D->isModulePrivate())
2338 OS << " __module_private__";
2339
2340 if (D->isPureVirtual())
2341 OS << " pure";
2342 if (D->isDefaulted()) {
2343 OS << " default";
2344 if (D->isDeleted())
2345 OS << "_delete";
2346 }
2347 if (D->isDeletedAsWritten())
2348 OS << " delete";
2349 if (D->isTrivial())
2350 OS << " trivial";
2351
2352 if (const StringLiteral *M = D->getDeletedMessage())
2353 AddChild("delete message", [=] { Visit(M); });
2354
2356 OS << (isa<CXXDestructorDecl>(D) ? " not_selected" : " ineligible");
2357
2358 if (const auto *FPT = D->getType()->getAs<FunctionProtoType>()) {
2359 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
2360 switch (EPI.ExceptionSpec.Type) {
2361 default:
2362 break;
2363 case EST_Unevaluated:
2364 OS << " noexcept-unevaluated " << EPI.ExceptionSpec.SourceDecl;
2365 break;
2366 case EST_Uninstantiated:
2367 OS << " noexcept-uninstantiated " << EPI.ExceptionSpec.SourceTemplate;
2368 break;
2369 }
2370 }
2371
2372 if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
2373 if (MD->size_overridden_methods() != 0) {
2374 auto dumpOverride = [=](const CXXMethodDecl *D) {
2375 SplitQualType T_split = D->getType().split();
2376 OS << D << " " << D->getParent()->getName() << "::" << D->getDeclName()
2377 << " '" << QualType::getAsString(T_split, PrintPolicy) << "'";
2378 };
2379
2380 AddChild([=] {
2381 auto Overrides = MD->overridden_methods();
2382 OS << "Overrides: [ ";
2383 dumpOverride(*Overrides.begin());
2384 for (const auto *Override : llvm::drop_begin(Overrides)) {
2385 OS << ", ";
2386 dumpOverride(Override);
2387 }
2388 OS << " ]";
2389 });
2390 }
2391 }
2392
2393 if (!D->isInlineSpecified() && D->isInlined()) {
2394 OS << " implicit-inline";
2395 }
2396 // Since NumParams comes from the FunctionProtoType of the FunctionDecl and
2397 // the Params are set later, it is possible for a dump during debugging to
2398 // encounter a FunctionDecl that has been created but hasn't been assigned
2399 // ParmVarDecls yet.
2400 if (!D->param_empty() && !D->param_begin())
2401 OS << " <<<NULL params x " << D->getNumParams() << ">>>";
2402
2403 if (const auto *Instance = D->getTemplateInstantiationPattern()) {
2404 OS << " instantiated_from";
2405 dumpPointer(Instance);
2406 }
2407}
2408
2410 const CXXDeductionGuideDecl *D) {
2412 switch (D->getDeductionCandidateKind()) {
2415 return;
2417 OS << " aggregate ";
2418 break;
2419 }
2420}
2421
2424 OS << " extended by ";
2426 OS << " mangling ";
2427 {
2428 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
2429 OS << D->getManglingNumber();
2430 }
2431}
2432
2434 dumpName(D);
2435 dumpType(D->getType());
2436 if (D->isMutable())
2437 OS << " mutable";
2438 if (D->isModulePrivate())
2439 OS << " __module_private__";
2440}
2441
2444 dumpName(D);
2445 if (const auto *P = dyn_cast<ParmVarDecl>(D);
2446 P && P->isExplicitObjectParameter())
2447 OS << " this";
2448
2449 dumpType(D->getType());
2451 StorageClass SC = D->getStorageClass();
2452 if (SC != SC_None)
2454 switch (D->getTLSKind()) {
2455 case VarDecl::TLS_None:
2456 break;
2458 OS << " tls";
2459 break;
2461 OS << " tls_dynamic";
2462 break;
2463 }
2464 if (D->isModulePrivate())
2465 OS << " __module_private__";
2466 if (D->isNRVOVariable())
2467 OS << " nrvo";
2468 if (D->isInline())
2469 OS << " inline";
2470 if (D->isConstexpr())
2471 OS << " constexpr";
2472 if (D->hasInit()) {
2473 switch (D->getInitStyle()) {
2474 case VarDecl::CInit:
2475 OS << " cinit";
2476 break;
2477 case VarDecl::CallInit:
2478 OS << " callinit";
2479 break;
2480 case VarDecl::ListInit:
2481 OS << " listinit";
2482 break;
2484 OS << " parenlistinit";
2485 }
2486 }
2487 if (D->needsDestruction(D->getASTContext()))
2488 OS << " destroyed";
2489 if (D->isParameterPack())
2490 OS << " pack";
2491
2492 if (const auto *Instance = D->getTemplateInstantiationPattern()) {
2493 OS << " instantiated_from";
2494 dumpPointer(Instance);
2495 }
2496
2497 if (D->hasInit()) {
2498 const Expr *E = D->getInit();
2499 // Only dump the value of constexpr VarDecls for now.
2500 if (E && !E->isValueDependent() && D->isConstexpr() &&
2501 !D->getType()->isDependentType()) {
2502 const APValue *Value = D->evaluateValue();
2503 if (Value)
2504 AddChild("value", [=] { Visit(*Value, E->getType()); });
2505 }
2506 }
2507}
2508
2510 dumpName(D);
2511 dumpType(D->getType());
2512}
2513
2515 if (D->isNothrow())
2516 OS << " nothrow";
2517}
2518
2520 OS << ' ' << D->getImportedModule()->getFullModuleName();
2521
2522 for (Decl *InitD :
2524 dumpDeclRef(InitD, "initializer");
2525}
2526
2528 OS << ' ';
2529 switch (D->getCommentKind()) {
2530 case PCK_Unknown:
2531 llvm_unreachable("unexpected pragma comment kind");
2532 case PCK_Compiler:
2533 OS << "compiler";
2534 break;
2535 case PCK_ExeStr:
2536 OS << "exestr";
2537 break;
2538 case PCK_Lib:
2539 OS << "lib";
2540 break;
2541 case PCK_Linker:
2542 OS << "linker";
2543 break;
2544 case PCK_User:
2545 OS << "user";
2546 break;
2547 }
2548 StringRef Arg = D->getArg();
2549 if (!Arg.empty())
2550 OS << " \"" << Arg << "\"";
2551}
2552
2554 const PragmaDetectMismatchDecl *D) {
2555 OS << " \"" << D->getName() << "\" \"" << D->getValue() << "\"";
2556}
2557
2559 const OMPExecutableDirective *D) {
2560 if (D->isStandaloneDirective())
2561 OS << " openmp_standalone_directive";
2562}
2563
2565 const OMPDeclareReductionDecl *D) {
2566 dumpName(D);
2567 dumpType(D->getType());
2568 OS << " combiner";
2570 if (const auto *Initializer = D->getInitializer()) {
2571 OS << " initializer";
2573 switch (D->getInitializerKind()) {
2575 OS << " omp_priv = ";
2576 break;
2578 OS << " omp_priv ()";
2579 break;
2581 break;
2582 }
2583 }
2584}
2585
2587 for (const auto *C : D->clauselists()) {
2588 AddChild([=] {
2589 if (!C) {
2590 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
2591 OS << "<<<NULL>>> OMPClause";
2592 return;
2593 }
2594 {
2595 ColorScope Color(OS, ShowColors, ASTDumpColor::Attr);
2596 StringRef ClauseName(
2597 llvm::omp::getOpenMPClauseName(C->getClauseKind()));
2598 OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
2599 << ClauseName.drop_front() << "Clause";
2600 }
2601 dumpPointer(C);
2602 dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
2603 });
2604 }
2605}
2606
2611
2613 dumpName(D);
2614 if (D->isInline())
2615 OS << " inline";
2616 if (D->isNested())
2617 OS << " nested";
2618 if (!D->isFirstDecl())
2619 dumpDeclRef(D->getFirstDecl(), "original");
2620}
2621
2626
2631
2636
2641
2643 VisitRecordDecl(D);
2644 if (const auto *Instance = D->getTemplateInstantiationPattern()) {
2645 OS << " instantiated_from";
2646 dumpPointer(Instance);
2647 }
2648 if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
2649 dumpTemplateSpecializationKind(CTSD->getSpecializationKind());
2650 if (CTSD->hasStrictPackMatch())
2651 OS << " strict-pack-match";
2652 }
2653
2655
2656 if (!D->isCompleteDefinition())
2657 return;
2658
2659 AddChild([=] {
2660 {
2661 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2662 OS << "DefinitionData";
2663 }
2664#define FLAG(fn, name) \
2665 if (D->fn()) \
2666 OS << " " #name;
2667 FLAG(isParsingBaseSpecifiers, parsing_base_specifiers);
2668
2669 FLAG(isGenericLambda, generic);
2670 FLAG(isLambda, lambda);
2671
2672 FLAG(isAnonymousStructOrUnion, is_anonymous);
2673 FLAG(canPassInRegisters, pass_in_registers);
2674 FLAG(isEmpty, empty);
2675 FLAG(isAggregate, aggregate);
2676 FLAG(isStandardLayout, standard_layout);
2677 FLAG(isTriviallyCopyable, trivially_copyable);
2678 FLAG(isPOD, pod);
2679 FLAG(isTrivial, trivial);
2680 FLAG(isPolymorphic, polymorphic);
2681 FLAG(isAbstract, abstract);
2682 FLAG(isLiteral, literal);
2683
2684 FLAG(hasUserDeclaredConstructor, has_user_declared_ctor);
2685 FLAG(hasConstexprNonCopyMoveConstructor, has_constexpr_non_copy_move_ctor);
2686 FLAG(hasMutableFields, has_mutable_fields);
2687 FLAG(hasVariantMembers, has_variant_members);
2688 FLAG(allowConstDefaultInit, can_const_default_init);
2689
2690 AddChild([=] {
2691 {
2692 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2693 OS << "DefaultConstructor";
2694 }
2695 FLAG(hasDefaultConstructor, exists);
2696 FLAG(hasTrivialDefaultConstructor, trivial);
2697 FLAG(hasNonTrivialDefaultConstructor, non_trivial);
2698 FLAG(hasUserProvidedDefaultConstructor, user_provided);
2699 FLAG(hasConstexprDefaultConstructor, constexpr);
2700 FLAG(needsImplicitDefaultConstructor, needs_implicit);
2701 FLAG(defaultedDefaultConstructorIsConstexpr, defaulted_is_constexpr);
2702 });
2703
2704 AddChild([=] {
2705 {
2706 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2707 OS << "CopyConstructor";
2708 }
2709 FLAG(hasSimpleCopyConstructor, simple);
2710 FLAG(hasTrivialCopyConstructor, trivial);
2711 FLAG(hasNonTrivialCopyConstructor, non_trivial);
2712 FLAG(hasUserDeclaredCopyConstructor, user_declared);
2713 FLAG(hasCopyConstructorWithConstParam, has_const_param);
2714 FLAG(needsImplicitCopyConstructor, needs_implicit);
2715 FLAG(needsOverloadResolutionForCopyConstructor,
2716 needs_overload_resolution);
2718 FLAG(defaultedCopyConstructorIsDeleted, defaulted_is_deleted);
2719 FLAG(implicitCopyConstructorHasConstParam, implicit_has_const_param);
2720 });
2721
2722 AddChild([=] {
2723 {
2724 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2725 OS << "MoveConstructor";
2726 }
2727 FLAG(hasMoveConstructor, exists);
2728 FLAG(hasSimpleMoveConstructor, simple);
2729 FLAG(hasTrivialMoveConstructor, trivial);
2730 FLAG(hasNonTrivialMoveConstructor, non_trivial);
2731 FLAG(hasUserDeclaredMoveConstructor, user_declared);
2732 FLAG(needsImplicitMoveConstructor, needs_implicit);
2733 FLAG(needsOverloadResolutionForMoveConstructor,
2734 needs_overload_resolution);
2736 FLAG(defaultedMoveConstructorIsDeleted, defaulted_is_deleted);
2737 });
2738
2739 AddChild([=] {
2740 {
2741 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2742 OS << "CopyAssignment";
2743 }
2744 FLAG(hasSimpleCopyAssignment, simple);
2745 FLAG(hasTrivialCopyAssignment, trivial);
2746 FLAG(hasNonTrivialCopyAssignment, non_trivial);
2747 FLAG(hasCopyAssignmentWithConstParam, has_const_param);
2748 FLAG(hasUserDeclaredCopyAssignment, user_declared);
2749 FLAG(needsImplicitCopyAssignment, needs_implicit);
2750 FLAG(needsOverloadResolutionForCopyAssignment, needs_overload_resolution);
2751 FLAG(implicitCopyAssignmentHasConstParam, implicit_has_const_param);
2752 });
2753
2754 AddChild([=] {
2755 {
2756 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2757 OS << "MoveAssignment";
2758 }
2759 FLAG(hasMoveAssignment, exists);
2760 FLAG(hasSimpleMoveAssignment, simple);
2761 FLAG(hasTrivialMoveAssignment, trivial);
2762 FLAG(hasNonTrivialMoveAssignment, non_trivial);
2763 FLAG(hasUserDeclaredMoveAssignment, user_declared);
2764 FLAG(needsImplicitMoveAssignment, needs_implicit);
2765 FLAG(needsOverloadResolutionForMoveAssignment, needs_overload_resolution);
2766 });
2767
2768 AddChild([=] {
2769 {
2770 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2771 OS << "Destructor";
2772 }
2773 FLAG(hasSimpleDestructor, simple);
2774 FLAG(hasIrrelevantDestructor, irrelevant);
2775 FLAG(hasTrivialDestructor, trivial);
2776 FLAG(hasNonTrivialDestructor, non_trivial);
2777 FLAG(hasUserDeclaredDestructor, user_declared);
2778 FLAG(hasConstexprDestructor, constexpr);
2779 FLAG(needsImplicitDestructor, needs_implicit);
2780 FLAG(needsOverloadResolutionForDestructor, needs_overload_resolution);
2782 FLAG(defaultedDestructorIsDeleted, defaulted_is_deleted);
2783 });
2784 });
2785
2786 for (const auto &I : D->bases()) {
2787 AddChild([=] {
2788 if (I.isVirtual())
2789 OS << "virtual ";
2790 dumpAccessSpecifier(I.getAccessSpecifier());
2791 dumpType(I.getType());
2792 if (I.isPackExpansion())
2793 OS << "...";
2794 });
2795 }
2796}
2797
2801
2805
2809
2813
2815 if (const auto *TC = D->getTypeConstraint()) {
2816 OS << " ";
2817 dumpBareDeclRef(TC->getNamedConcept());
2818 if (TC->getNamedConcept() != TC->getFoundDecl()) {
2819 OS << " (";
2820 dumpBareDeclRef(TC->getFoundDecl());
2821 OS << ")";
2822 }
2823 } else if (D->wasDeclaredWithTypename())
2824 OS << " typename";
2825 else
2826 OS << " class";
2827 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2828 if (D->isParameterPack())
2829 OS << " ...";
2830 dumpName(D);
2831}
2832
2834 const NonTypeTemplateParmDecl *D) {
2835 dumpType(D->getType());
2836 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2837 if (D->isParameterPack())
2838 OS << " ...";
2839 dumpName(D);
2840}
2841
2843 const TemplateTemplateParmDecl *D) {
2844 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2845 if (D->isParameterPack())
2846 OS << " ...";
2847 dumpName(D);
2848}
2849
2851 OS << ' ';
2853 OS << D->getDeclName();
2855}
2856
2858 OS << ' ';
2860}
2861
2863 const UnresolvedUsingTypenameDecl *D) {
2864 OS << ' ';
2866 OS << D->getDeclName();
2867}
2868
2870 const UnresolvedUsingValueDecl *D) {
2871 OS << ' ';
2873 OS << D->getDeclName();
2874 dumpType(D->getType());
2875}
2876
2881
2883 const ConstructorUsingShadowDecl *D) {
2884 if (D->constructsVirtualBase())
2885 OS << " virtual";
2886
2887 AddChild([=] {
2888 OS << "target ";
2890 });
2891
2892 AddChild([=] {
2893 OS << "nominated ";
2895 OS << ' ';
2897 });
2898
2899 AddChild([=] {
2900 OS << "constructed ";
2902 OS << ' ';
2904 });
2905}
2906
2908 switch (D->getLanguage()) {
2910 OS << " C";
2911 break;
2913 OS << " C++";
2914 break;
2915 }
2916}
2917
2919 OS << ' ';
2921}
2922
2924 if (TypeSourceInfo *T = D->getFriendType())
2925 dumpType(T->getType());
2926 if (D->isPackExpansion())
2927 OS << "...";
2928}
2929
2931 dumpName(D);
2932 dumpType(D->getType());
2933 if (D->getSynthesize())
2934 OS << " synthesize";
2935
2936 switch (D->getAccessControl()) {
2937 case ObjCIvarDecl::None:
2938 OS << " none";
2939 break;
2941 OS << " private";
2942 break;
2944 OS << " protected";
2945 break;
2947 OS << " public";
2948 break;
2950 OS << " package";
2951 break;
2952 }
2953}
2954
2956 if (D->isInstanceMethod())
2957 OS << " -";
2958 else
2959 OS << " +";
2960 dumpName(D);
2961 dumpType(D->getReturnType());
2962
2963 if (D->isVariadic())
2964 OS << " variadic";
2965}
2966
2968 dumpName(D);
2969 switch (D->getVariance()) {
2971 break;
2972
2974 OS << " covariant";
2975 break;
2976
2978 OS << " contravariant";
2979 break;
2980 }
2981
2982 if (D->hasExplicitBound())
2983 OS << " bounded";
2985}
2986
2988 dumpName(D);
2991 for (const auto *P : D->protocols())
2992 dumpDeclRef(P);
2993}
2994
3000
3002 dumpName(D);
3003
3004 for (const auto *Child : D->protocols())
3005 dumpDeclRef(Child);
3006}
3007
3009 dumpName(D);
3010 dumpDeclRef(D->getSuperClass(), "super");
3011
3013 for (const auto *Child : D->protocols())
3014 dumpDeclRef(Child);
3015}
3016
3023
3029
3031 dumpName(D);
3032 dumpType(D->getType());
3033
3035 OS << " required";
3037 OS << " optional";
3038
3042 OS << " readonly";
3044 OS << " assign";
3046 OS << " readwrite";
3048 OS << " retain";
3050 OS << " copy";
3052 OS << " nonatomic";
3054 OS << " atomic";
3056 OS << " weak";
3058 OS << " strong";
3060 OS << " unsafe_unretained";
3062 OS << " class";
3064 OS << " direct";
3066 dumpDeclRef(D->getGetterMethodDecl(), "getter");
3068 dumpDeclRef(D->getSetterMethodDecl(), "setter");
3069 }
3070}
3071
3075 OS << " synthesize";
3076 else
3077 OS << " dynamic";
3080}
3081
3083 if (D->isVariadic())
3084 OS << " variadic";
3085
3086 if (D->capturesCXXThis())
3087 OS << " captures_this";
3088}
3089
3093
3095 VisitStmt(S);
3096 if (S->hasStoredFPFeatures())
3097 printFPOptions(S->getStoredFPFeatures());
3098}
3099
3101 if (D->isCBuffer())
3102 OS << " cbuffer";
3103 else
3104 OS << " tbuffer";
3105 dumpName(D);
3106}
3107
3109 const HLSLRootSignatureDecl *D) {
3110 dumpName(D);
3111 OS << " version: ";
3112 switch (D->getVersion()) {
3113 case llvm::dxbc::RootSignatureVersion::V1_0:
3114 OS << "1.0";
3115 break;
3116 case llvm::dxbc::RootSignatureVersion::V1_1:
3117 OS << "1.1";
3118 break;
3119 case llvm::dxbc::RootSignatureVersion::V1_2:
3120 OS << "1.2";
3121 break;
3122 }
3123 OS << ", ";
3124 llvm::hlsl::rootsig::dumpRootElements(OS, D->getRootElements());
3125}
3126
3128 OS << (E->isInOut() ? " inout" : " out");
3129}
3130
3135 if (S->isOrphanedLoopConstruct())
3136 OS << " <orphan>";
3137 else
3138 OS << " parent: " << S->getParentComputeConstructKind();
3139}
3140
3145
3149
3154
3159
3164
3169 const OpenACCCacheConstruct *S) {
3171 if (S->hasReadOnly())
3172 OS <<" readonly";
3173}
3188
3194
3196 OS << " " << D->getDirectiveKind();
3197
3198 for (const OpenACCClause *C : D->clauses())
3199 AddChild([=] {
3200 Visit(C);
3201 for (const Stmt *S : C->children())
3202 AddChild([=] { Visit(S); });
3203 });
3204}
3206 OS << " " << D->getDirectiveKind();
3207
3209
3210 AddChild([=] { Visit(D->getFunctionReference()); });
3211
3212 for (const OpenACCClause *C : D->clauses())
3213 AddChild([=] {
3214 Visit(C);
3215 for (const Stmt *S : C->children())
3216 AddChild([=] { Visit(S); });
3217 });
3218}
3219
3221 const OpenACCRoutineDeclAttr *A) {
3222 for (const OpenACCClause *C : A->Clauses)
3223 AddChild([=] {
3224 Visit(C);
3225 for (const Stmt *S : C->children())
3226 AddChild([=] { Visit(S); });
3227 });
3228}
3229
3231 AddChild("begin", [=] { OS << S->getStartingElementPos(); });
3232 AddChild("number of elements", [=] { OS << S->getDataElementCount(); });
3233}
3234
3236 OS << ' ' << AE->getOpAsString();
3237}
3238
3240 VisitStmt(S);
3241 if (S->hasStoredFPFeatures())
3242 printFPOptions(S->getStoredFPFeatures());
3243}
static double GetApproxValue(const llvm::APFloat &F)
Definition APValue.cpp:646
#define V(N, I)
static bool isTrivial(ASTContext &Ctx, const Expr *E)
Checks if the expression is constant or does not have non-trivial function calls.
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
#define X(type, name)
Definition Value.h:97
Defines the clang::Module class, which describes a module in the source code.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
static bool canPassInRegisters(Sema &S, CXXRecordDecl *D, TargetInfo::CallingConvKind CCK)
Determine whether a type is permitted to be passed or returned in registers, per C++ [class....
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static bool isSimpleAPValue(const APValue &Value)
True if the APValue Value can be folded onto the current line.
#define FLAG(fn, name)
static void dumpBasePath(raw_ostream &OS, const CastExpr *Node)
static void dumpPreviousDeclImpl(raw_ostream &OS,...)
static void dumpPreviousDecl(raw_ostream &OS, const Decl *D)
Dump the previous declaration in the redeclaration chain for a declaration, if any.
Defines enumerations for the type traits support.
C Language Family Type Representation.
OpenACCAtomicKind getAtomicKind() const
bool hasReadOnly() const
This class represents a 'loop' construct. The 'loop' construct applies to a 'for' loop (or range-for ...
bool isOrphanedLoopConstruct() const
OpenACC 3.3 2.9: An orphaned loop construct is a loop construct that is not lexically enclosed within...
OpenACCDirectiveKind getParentComputeConstructKind() const
llvm::APInt getValue() const
QualType getDynamicAllocType() const
Definition APValue.cpp:122
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition APValue.h:122
@ Indeterminate
This object has an indeterminate value (C++ [basic.indet]).
Definition APValue.h:131
@ None
There is no such object (it's outside its lifetime).
Definition APValue.h:129
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:226
ArrayRef< Decl * > getModuleInitializers(Module *M)
Get the initializations to perform when importing a module, if any.
const clang::PrintingPolicy & getPrintingPolicy() const
Definition ASTContext.h:850
ArrayRef< Module * > getModulesWithMergedDefinition(const NamedDecl *Def)
Get the additional modules in which the definition Def has been merged.
Represents an access specifier followed by colon ':'.
Definition DeclCXX.h:86
AddrLabelExpr - The GNU address of label extension, representing &&label.
Definition Expr.h:4553
LabelDecl * getLabel() const
Definition Expr.h:4576
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
Definition ExprCXX.h:2997
ArrayTypeTrait getTrait() const
Definition ExprCXX.h:3037
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3730
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Definition Expr.h:6927
StringRef getOpAsString() const
Definition Expr.h:6991
Attr - This represents one attribute.
Definition Attr.h:46
attr::Kind getKind() const
Definition Attr.h:92
bool isInherited() const
Definition Attr.h:101
bool isImplicit() const
Returns true if the attribute has been implicitly created instead of explicitly written by the user.
Definition Attr.h:105
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:4041
StringRef getOpcodeStr() const
Definition Expr.h:4107
bool hasStoredFPFeatures() const
Definition Expr.h:4226
FPOptionsOverride getStoredFPFeatures() const
Get FPFeatures from trailing storage.
Definition Expr.h:4238
Opcode getOpcode() const
Definition Expr.h:4086
A binding in a decomposition declaration.
Definition DeclCXX.h:4188
A class which contains all the information about a particular captured value.
Definition Decl.h:4680
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4674
bool capturesCXXThis() const
Definition Decl.h:4806
bool isVariadic() const
Definition Decl.h:4749
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
Represents a base class of a C++ class.
Definition DeclCXX.h:146
Represents binding an expression to a temporary.
Definition ExprCXX.h:1494
A boolean literal, per ([C++ lex.bool] Boolean literals).
Definition ExprCXX.h:724
bool getValue() const
Definition ExprCXX.h:741
Represents a call to a C++ constructor.
Definition ExprCXX.h:1549
bool isElidable() const
Whether this construction is elidable.
Definition ExprCXX.h:1618
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
Definition ExprCXX.h:1642
bool isImmediateEscalating() const
Definition ExprCXX.h:1707
bool requiresZeroInitialization() const
Whether this construction first requires zero-initialization before the initializer is called.
Definition ExprCXX.h:1651
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Definition ExprCXX.h:1612
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
Definition ExprCXX.h:1631
Represents a C++ constructor within a class.
Definition DeclCXX.h:2611
Represents a C++ base or member initializer.
Definition DeclCXX.h:2376
Represents a C++ deduction guide declaration.
Definition DeclCXX.h:1986
DeductionCandidate getDeductionCandidateKind() const
Definition DeclCXX.h:2082
A default argument (C++ [dcl.fct.default]).
Definition ExprCXX.h:1271
bool hasRewrittenInit() const
Definition ExprCXX.h:1316
A use of a default initializer in a constructor or in aggregate initialization.
Definition ExprCXX.h:1378
bool hasRewrittenInit() const
Definition ExprCXX.h:1407
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2627
FunctionDecl * getOperatorDelete() const
Definition ExprCXX.h:2666
bool isArrayForm() const
Definition ExprCXX.h:2653
bool isGlobalDelete() const
Definition ExprCXX.h:2652
Represents a C++ member access expression where the actual member referenced could not be resolved be...
Definition ExprCXX.h:3871
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Definition ExprCXX.h:3970
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
Definition ExprCXX.h:4009
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Definition ExprCXX.h:1832
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2136
Abstract class common to all of the C++ "named"/"keyword" casts.
Definition ExprCXX.h:376
const char * getCastName() const
getCastName - Get the name of the C++ cast being used, e.g., "static_cast", "dynamic_cast",...
Definition ExprCXX.cpp:768
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition ExprCXX.h:2356
bool isArray() const
Definition ExprCXX.h:2465
FunctionDecl * getOperatorNew() const
Definition ExprCXX.h:2460
bool isGlobalNew() const
Definition ExprCXX.h:2522
A call to an overloaded operator written using operator syntax.
Definition ExprCXX.h:85
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
Definition ExprCXX.h:115
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
base_class_range bases()
Definition DeclCXX.h:608
const CXXRecordDecl * getTemplateInstantiationPattern() const
Retrieve the record declaration from which this record could be instantiated.
Definition DeclCXX.cpp:2085
bool needsOverloadResolutionForMoveConstructor() const
Determine whether we need to eagerly declare a defaulted move constructor for this class.
Definition DeclCXX.h:902
bool needsOverloadResolutionForDestructor() const
Determine whether we need to eagerly declare a destructor for this class.
Definition DeclCXX.h:1013
bool needsOverloadResolutionForCopyConstructor() const
Determine whether we need to eagerly declare a defaulted copy constructor for this class.
Definition DeclCXX.h:805
A C++ static_cast expression (C++ [expr.static.cast]).
Definition ExprCXX.h:437
Represents the this expression in C++.
Definition ExprCXX.h:1155
bool isCapturedByCopyInLambdaWithExplicitObjectParameter() const
Definition ExprCXX.h:1181
bool isImplicit() const
Definition ExprCXX.h:1178
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
Definition ExprCXX.h:3745
bool isListInitialization() const
Determine whether this expression models list-initialization.
Definition ExprCXX.h:3800
QualType getTypeAsWritten() const
Retrieve the type that is being constructed, as specified in the source code.
Definition ExprCXX.h:3779
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2946
bool hasStoredFPFeatures() const
Definition Expr.h:3105
bool usesADL() const
Definition Expr.h:3103
FPOptionsOverride getFPFeatures() const
Definition Expr.h:3245
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition Decl.h:4946
bool isNothrow() const
Definition Decl.cpp:5702
CaseStmt - Represent a case statement.
Definition Stmt.h:1912
bool caseStmtIsGNURange() const
True if this case statement is of the form case LHS ... RHS, which is a GNU extension.
Definition Stmt.h:1975
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3679
path_iterator path_begin()
Definition Expr.h:3749
bool hasStoredFPFeatures() const
Definition Expr.h:3778
static const char * getCastKindName(CastKind CK)
Definition Expr.cpp:1951
path_iterator path_end()
Definition Expr.h:3750
const CXXBaseSpecifier *const * path_const_iterator
Definition Expr.h:3746
bool path_empty() const
Definition Expr.h:3747
FPOptionsOverride getFPFeatures() const
Definition Expr.h:3799
unsigned getValue() const
Definition Expr.h:1632
Declaration of a class template.
Represents a 'co_await' expression.
Definition ExprCXX.h:5370
bool isImplicit() const
Definition ExprCXX.h:5392
CompoundAssignOperator - For compound assignments (e.g.
Definition Expr.h:4303
QualType getComputationLHSType() const
Definition Expr.h:4337
QualType getComputationResultType() const
Definition Expr.h:4340
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition Stmt.h:1732
FPOptionsOverride getStoredFPFeatures() const
Get FPOptionsOverride from trailing storage.
Definition Stmt.h:1782
bool hasStoredFPFeatures() const
Definition Stmt.h:1779
Declaration of a C++20 concept.
A reference to a concept and its template args, as it appears in the code.
Definition ASTConcept.h:130
SourceRange getSourceRange() const LLVM_READONLY
Definition ASTConcept.h:193
TemplateDecl * getNamedConcept() const
Definition ASTConcept.h:201
Represents the specialization of a concept - evaluates to a prvalue of type bool.
NamedDecl * getFoundDecl() const
Represents the canonical version of C arrays with a specified constant size.
Definition TypeBase.h:3768
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Definition Expr.h:1085
APValue getAPValueResult() const
Definition Expr.cpp:413
bool hasAPValueResult() const
Definition Expr.h:1160
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition DeclCXX.h:3680
CXXRecordDecl * getConstructedBaseClass() const
Get the base class whose constructor or constructor shadow declaration is passed the constructor argu...
Definition DeclCXX.h:3771
bool constructsVirtualBase() const
Returns true if the constructed base class is a virtual base class subobject of this declaration's cl...
Definition DeclCXX.h:3780
ConstructorUsingShadowDecl * getConstructedBaseClassShadowDecl() const
Get the inheriting constructor declaration for the base class for which we don't have an explicit ini...
Definition DeclCXX.h:3761
ConstructorUsingShadowDecl * getNominatedBaseClassShadowDecl() const
Get the inheriting constructor declaration for the direct base class from which this using shadow dec...
Definition DeclCXX.h:3755
CXXRecordDecl * getNominatedBaseClass() const
Get the base class that was named in the using declaration.
Definition DeclCXX.cpp:3468
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
Definition Expr.h:4722
FPOptionsOverride getStoredFPFeatures() const
Get FPFeatures from trailing storage.
Definition Expr.h:4785
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
bool isImplicit() const
Definition StmtCXX.h:506
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2109
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1273
NamedDecl * getFoundDecl()
Get the NamedDecl through which this reference occurred.
Definition Expr.h:1384
NestedNameSpecifier getQualifier() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name.
Definition Expr.h:1374
bool refersToEnclosingVariableOrCapture() const
Does this DeclRefExpr refer to an enclosing local or a captured variable?
Definition Expr.h:1477
bool isCapturedByCopyInLambdaWithExplicitObjectParameter() const
Definition Expr.h:1489
ValueDecl * getDecl()
Definition Expr.h:1341
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
Definition Expr.h:1471
bool isImmediateEscalating() const
Definition Expr.h:1481
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition DeclBase.h:1226
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:546
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:593
@ FOK_Undeclared
A friend of a previously-undeclared entity.
Definition DeclBase.h:1219
@ FOK_None
Not a friend object.
Definition DeclBase.h:1217
@ FOK_Declared
A friend of a previously-declared entity.
Definition DeclBase.h:1218
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:842
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition DeclBase.h:793
bool isInvalidDecl() const
Definition DeclBase.h:588
SourceLocation getLocation() const
Definition DeclBase.h:439
const char * getDeclKindName() const
Definition DeclBase.cpp:169
bool isThisDeclarationReferenced() const
Whether this declaration was referenced.
Definition DeclBase.h:621
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition DeclBase.cpp:575
DeclContext * getDeclContext()
Definition DeclBase.h:448
AccessSpecifier getAccess() const
Definition DeclBase.h:507
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:918
Kind getKind() const
Definition DeclBase.h:442
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
Definition DeclBase.h:427
The name of a declaration.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
Definition Decl.h:837
TemplateName getUnderlying() const
DefaultArguments getDefaultArguments() const
A qualified reference to a name whose declaration cannot yet be resolved.
Definition ExprCXX.h:3511
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies this declaration.
Definition ExprCXX.h:3563
Represents an array type in C++ whose size is a value-dependent expression.
Definition TypeBase.h:4019
Represents an extended vector type where either the type or size is dependent.
Definition TypeBase.h:4109
NestedNameSpecifier getQualifier() const
Return the nested name specifier that qualifies this name.
Symbolic representation of a dynamic allocation.
Definition APValue.h:65
IdentifierInfo & getAccessor() const
Definition Expr.h:6584
Represents a reference to emded data.
Definition Expr.h:5129
unsigned getStartingElementPos() const
Definition Expr.h:5150
size_t getDataElementCount() const
Definition Expr.h:5151
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3423
Represents an enum.
Definition Decl.h:4013
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
Definition Decl.h:4231
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
Definition Decl.h:4234
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
Definition Decl.h:4240
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Definition Decl.h:4186
EnumDecl * getTemplateInstantiationPattern() const
Retrieve the enum definition from which this enumeration could be instantiated, if it is an instantia...
Definition Decl.cpp:5140
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
Definition Expr.h:3958
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
Definition ExprCXX.h:3662
CleanupObject getObject(unsigned i) const
Definition ExprCXX.h:3692
unsigned getNumObjects() const
Definition ExprCXX.h:3690
llvm::PointerUnion< BlockDecl *, CompoundLiteralExpr * > CleanupObject
The type of objects that are kept in the cleanup.
Definition ExprCXX.h:3668
This represents one expression.
Definition Expr.h:112
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition Expr.h:177
QualType getType() const
Definition Expr.h:144
An expression trait intrinsic.
Definition ExprCXX.h:3070
ExpressionTrait getTrait() const
Definition ExprCXX.h:3105
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
Definition Expr.h:6609
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Definition Decl.h:3160
bool isMutable() const
Determines whether this field is mutable (C++ only).
Definition Decl.h:3260
std::string getValueAsString(unsigned Radix) const
Definition Expr.cpp:1010
double getValueAsApproximateDouble() const
getValueAsApproximateDouble - This returns the value as an inaccurate double.
Definition Expr.cpp:1089
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
Definition DeclFriend.h:54
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
Definition DeclFriend.h:125
bool isPackExpansion() const
Definition DeclFriend.h:190
Represents a function declaration or definition.
Definition Decl.h:2000
StringLiteral * getDeletedMessage() const
Get the message that indicates why this function was deleted.
Definition Decl.h:2758
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
Definition Decl.h:2921
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
Definition Decl.cpp:4265
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Definition Decl.h:2377
param_iterator param_begin()
Definition Decl.h:2786
bool isDeleted() const
Whether this function has been deleted.
Definition Decl.h:2540
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:2888
bool isDeletedAsWritten() const
Definition Decl.h:2544
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
Definition Decl.h:2353
bool param_empty() const
Definition Decl.h:2785
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2385
bool isIneligibleOrNotSelected() const
Definition Decl.h:2418
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
Definition Decl.cpp:4418
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
Definition Decl.h:2344
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition Decl.cpp:3827
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Definition Decl.h:2899
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5315
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4511
static StringRef getNameForCallConv(CallingConv CC)
Definition Type.cpp:3646
Represents a C11 generic selection.
Definition Expr.h:6181
AssociationTy< true > ConstAssociation
Definition Expr.h:6415
bool isResultDependent() const
Whether this generic selection is result-dependent.
Definition Expr.h:6435
GotoStmt - This represents a direct goto.
Definition Stmt.h:2961
LabelDecl * getLabel() const
Definition Stmt.h:2974
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition Decl.h:5196
bool isCBuffer() const
Definition Decl.h:5240
This class represents temporary values used to represent inout and out arguments in HLSL.
Definition Expr.h:7396
bool isInOut() const
returns true if the parameter is inout and false if the parameter is out.
Definition Expr.h:7455
ArrayRef< llvm::hlsl::rootsig::RootElement > getRootElements() const
Definition Decl.h:5313
llvm::dxbc::RootSignatureVersion getVersion() const
Definition Decl.h:5311
const char * getNameStart() const
Return the beginning of the actual null-terminated string for this identifier.
StringRef getName() const
Return the actual identifier string.
IfStmt - This represents an if/then/else.
Definition Stmt.h:2251
bool hasElseStorage() const
True if this IfStmt has storage for an else statement.
Definition Stmt.h:2326
bool hasVarStorage() const
True if this IfStmt has storage for a variable declaration.
Definition Stmt.h:2323
bool isConstexpr() const
Definition Stmt.h:2444
bool hasInitStorage() const
True if this IfStmt has the storage for an init statement.
Definition Stmt.h:2320
bool isNegatedConsteval() const
Definition Stmt.h:2440
bool isConsteval() const
Definition Stmt.h:2431
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition Expr.h:3856
bool isPartOfExplicitCast() const
Definition Expr.h:3887
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Definition Decl.h:5055
Module * getImportedModule() const
Retrieve the module that was imported by the import declaration.
Definition Decl.h:5113
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3467
ArrayRef< NamedDecl * > chain() const
Definition Decl.h:3488
Describes an C or C++ initializer list.
Definition Expr.h:5302
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
Definition Expr.h:5428
Represents the declaration of a label.
Definition Decl.h:524
LabelStmt - Represents a label, which has a substatement.
Definition Stmt.h:2138
bool isSideEntry() const
Definition Stmt.h:2185
const char * getName() const
Definition Stmt.cpp:437
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
Definition DeclCXX.h:3311
Represents a linkage specification.
Definition DeclCXX.h:3018
LinkageSpecLanguageIDs getLanguage() const
Return the language specified by this linkage specification.
Definition DeclCXX.h:3041
Base class for BreakStmt and ContinueStmt.
Definition Stmt.h:3049
LabelDecl * getLabelDecl()
Definition Stmt.h:3087
const Stmt * getNamedLoopOrSwitch() const
If this is a named break/continue, get the loop or switch statement that this targets.
Definition Stmt.cpp:1535
bool hasLabelTarget() const
Definition Stmt.h:3082
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition ExprCXX.h:4921
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
Definition ExprCXX.h:4971
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3367
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
Definition Expr.h:3478
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
Definition Expr.h:3450
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
Definition Expr.h:3591
bool isArrow() const
Definition Expr.h:3551
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Describes a module or submodule.
Definition Module.h:144
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
Definition Module.cpp:239
This represents a decl that may have a name.
Definition Decl.h:274
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
Definition DeclBase.h:648
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:295
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Definition Decl.h:301
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
Represents a C++ namespace alias.
Definition DeclCXX.h:3204
NamespaceBaseDecl * getAliasedNamespace() const
Retrieve the namespace that this alias refers to, which may either be a NamespaceDecl or a NamespaceA...
Definition DeclCXX.h:3297
Represent a C++ namespace.
Definition Decl.h:592
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
bool isInline() const
Returns true if this is an inline namespace declaration.
Definition Decl.h:648
bool isNested() const
Returns true if this is a nested namespace declaration.
Definition Decl.h:657
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NamespaceAndPrefix getAsNamespaceAndPrefix() const
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false, bool PrintFinalScopeResOp=true) const
Print this nested name specifier to the given output stream.
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
unsigned getIndex() const
Get the index of the template parameter within its parameter list.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Pseudo declaration for capturing expressions.
Definition DeclOpenMP.h:445
This is a basic class for representing single OpenMP clause.
This represents 'pragma omp declare reduction ...' directive.
Definition DeclOpenMP.h:239
Expr * getInitializer()
Get initializer expression (if specified) of the declare reduction construct.
Definition DeclOpenMP.h:300
Expr * getCombiner()
Get combiner expression of the declare reduction construct.
Definition DeclOpenMP.h:282
OMPDeclareReductionInitKind getInitializerKind() const
Get initializer kind.
Definition DeclOpenMP.h:303
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
Definition ExprOpenMP.h:151
IteratorRange getIteratorRange(unsigned I)
Gets the iterator range for the given iterator.
Definition Expr.cpp:5535
unsigned numOfIterators() const
Returns number of iterator definitions.
Definition ExprOpenMP.h:275
Decl * getIteratorDecl(unsigned I)
Gets the iterator declaration for the given iterator.
Definition Expr.cpp:5531
This represents 'pragma omp requires...' directive.
Definition DeclOpenMP.h:479
clauselist_range clauselists()
Definition DeclOpenMP.h:504
Represents Objective-C's @catch statement.
Definition StmtObjC.h:77
const VarDecl * getCatchParamDecl() const
Definition StmtObjC.h:97
ObjCBoolLiteralExpr - Objective-C Boolean Literal.
Definition ExprObjC.h:88
ObjCBoxedExpr - used for generalized expression boxing.
Definition ExprObjC.h:128
ObjCMethodDecl * getBoxingMethod() const
Definition ExprObjC.h:147
ObjCCategoryDecl - Represents a category declaration.
Definition DeclObjC.h:2329
ObjCCategoryImplDecl * getImplementation() const
ObjCInterfaceDecl * getClassInterface()
Definition DeclObjC.h:2372
protocol_range protocols() const
Definition DeclObjC.h:2403
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Definition DeclObjC.h:2545
ObjCCategoryDecl * getCategoryDecl() const
ObjCCompatibleAliasDecl - Represents alias of a class.
Definition DeclObjC.h:2775
const ObjCInterfaceDecl * getClassInterface() const
Definition DeclObjC.h:2793
ObjCEncodeExpr, used for @encode in Objective-C.
Definition ExprObjC.h:407
QualType getEncodedType() const
Definition ExprObjC.h:426
const ObjCInterfaceDecl * getClassInterface() const
Definition DeclObjC.h:2486
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition DeclObjC.h:2597
const ObjCInterfaceDecl * getSuperClass() const
Definition DeclObjC.h:2735
Represents an ObjC class declaration.
Definition DeclObjC.h:1154
protocol_range protocols() const
Definition DeclObjC.h:1359
ObjCImplementationDecl * getImplementation() const
ObjCInterfaceDecl * getSuperClass() const
Definition DeclObjC.cpp:349
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
Definition TypeBase.h:7950
ObjCIvarDecl - Represents an ObjC instance variable.
Definition DeclObjC.h:1952
AccessControl getAccessControl() const
Definition DeclObjC.h:2000
bool getSynthesize() const
Definition DeclObjC.h:2007
ObjCIvarRefExpr - A reference to an ObjC instance variable.
Definition ExprObjC.h:546
ObjCIvarDecl * getDecl()
Definition ExprObjC.h:576
bool isFreeIvar() const
Definition ExprObjC.h:585
An expression that sends a message to the given Objective-C object or class.
Definition ExprObjC.h:937
Selector getSelector() const
Definition ExprObjC.cpp:289
@ SuperInstance
The receiver is the instance of the superclass object.
Definition ExprObjC.h:951
@ Instance
The receiver is an object instance.
Definition ExprObjC.h:945
@ SuperClass
The receiver is a superclass.
Definition ExprObjC.h:948
@ Class
The receiver is a class.
Definition ExprObjC.h:942
QualType getClassReceiver() const
Returns the type of a class message send, or NULL if the message is not a class message.
Definition ExprObjC.h:1284
ReceiverKind getReceiverKind() const
Determine the kind of receiver that this message is being sent to.
Definition ExprObjC.h:1226
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
bool isVariadic() const
Definition DeclObjC.h:431
Selector getSelector() const
Definition DeclObjC.h:327
bool isInstanceMethod() const
Definition DeclObjC.h:426
QualType getReturnType() const
Definition DeclObjC.h:329
Represents one property declaration in an Objective-C interface.
Definition DeclObjC.h:731
ObjCMethodDecl * getGetterMethodDecl() const
Definition DeclObjC.h:901
ObjCMethodDecl * getSetterMethodDecl() const
Definition DeclObjC.h:904
QualType getType() const
Definition DeclObjC.h:804
ObjCPropertyAttribute::Kind getPropertyAttributes() const
Definition DeclObjC.h:815
PropertyControl getPropertyImplementation() const
Definition DeclObjC.h:912
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Definition DeclObjC.h:2805
ObjCIvarDecl * getPropertyIvarDecl() const
Definition DeclObjC.h:2879
Kind getPropertyImplementation() const
Definition DeclObjC.h:2875
ObjCPropertyDecl * getPropertyDecl() const
Definition DeclObjC.h:2870
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
Definition ExprObjC.h:614
bool isMessagingGetter() const
True if the property reference will result in a message to the getter.
Definition ExprObjC.h:733
ObjCPropertyDecl * getExplicitProperty() const
Definition ExprObjC.h:703
bool isMessagingSetter() const
True if the property reference will result in a message to the setter.
Definition ExprObjC.h:740
ObjCMethodDecl * getImplicitPropertyGetter() const
Definition ExprObjC.h:708
bool isImplicitProperty() const
Definition ExprObjC.h:700
ObjCMethodDecl * getImplicitPropertySetter() const
Definition ExprObjC.h:713
bool isSuperReceiver() const
Definition ExprObjC.h:768
Represents an Objective-C protocol declaration.
Definition DeclObjC.h:2084
protocol_range protocols() const
Definition DeclObjC.h:2161
ObjCProtocolExpr used for protocol expression in Objective-C.
Definition ExprObjC.h:502
ObjCProtocolDecl * getProtocol() const
Definition ExprObjC.h:519
ObjCSelectorExpr used for @selector in Objective-C.
Definition ExprObjC.h:452
Selector getSelector() const
Definition ExprObjC.h:466
ObjCSubscriptRefExpr - used for array and dictionary subscripting.
Definition ExprObjC.h:836
bool isArraySubscriptRefExpr() const
Definition ExprObjC.h:889
ObjCMethodDecl * getAtIndexMethodDecl() const
Definition ExprObjC.h:881
ObjCMethodDecl * setAtIndexMethodDecl() const
Definition ExprObjC.h:885
Represents the declaration of an Objective-C type parameter.
Definition DeclObjC.h:578
bool hasExplicitBound() const
Whether this type parameter has an explicitly-written type bound, e.g., "T : NSView".
Definition DeclObjC.h:640
ObjCTypeParamVariance getVariance() const
Determine the variance of this type parameter.
Definition DeclObjC.h:623
This expression type represents an asterisk in an OpenACC Size-Expr, used in the 'tile' and 'gang' cl...
Definition Expr.h:2093
This is the base type for all OpenACC Clauses.
OpenACCDirectiveKind getDirectiveKind() const
Definition DeclOpenACC.h:56
ArrayRef< const OpenACCClause * > clauses() const
Definition DeclOpenACC.h:62
This is the base class for an OpenACC statement-level construct, other construct types are expected t...
Definition StmtOpenACC.h:26
OpenACCDirectiveKind getDirectiveKind() const
Definition StmtOpenACC.h:57
SourceLocation getRParenLoc() const
const Expr * getFunctionReference() const
SourceLocation getLParenLoc() const
UnresolvedSetImpl::iterator decls_iterator
Definition ExprCXX.h:3220
decls_iterator decls_begin() const
Definition ExprCXX.h:3222
decls_iterator decls_end() const
Definition ExprCXX.h:3225
DeclarationName getName() const
Gets the name looked up.
Definition ExprCXX.h:3239
Represents a #pragma comment line.
Definition Decl.h:167
StringRef getArg() const
Definition Decl.h:190
PragmaMSCommentKind getCommentKind() const
Definition Decl.h:188
Represents a #pragma detect_mismatch line.
Definition Decl.h:201
StringRef getName() const
Definition Decl.h:222
StringRef getValue() const
Definition Decl.h:223
[C99 6.4.2.2] - A predefined identifier such as func.
Definition Expr.h:2008
StringRef getIdentKindName() const
Definition Expr.h:2065
PredefinedIdentKind getIdentKind() const
Definition Expr.h:2043
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
bool isInvalid() const
Return true if this object is invalid or uninitialized.
A (possibly-)qualified type.
Definition TypeBase.h:937
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
Definition TypeBase.h:8409
std::string getAsString() const
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Definition TypeBase.h:1338
Represents a template name as written in source code.
NestedNameSpecifier getQualifier() const
Return the nested name specifier that qualifies this name.
TemplateName getUnderlyingTemplate() const
Return the underlying template name.
bool hasTemplateKeyword() const
Whether the template name was prefixed by the "template" keyword.
Represents a struct/union/class.
Definition Decl.h:4327
Provides common interface for the Decls that can be redeclared.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Base for LValueReferenceType and RValueReferenceType.
Definition TypeBase.h:3581
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
bool isSatisfied() const
Whether or not the requires clause is satisfied.
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Definition Stmt.h:3152
const VarDecl * getNRVOCandidate() const
Retrieve the variable that might be used for the named return value optimization.
Definition Stmt.h:3188
TypeSourceInfo * getTypeSourceInfo()
Definition Expr.h:2146
void print(llvm::raw_ostream &OS) const
Prints the full selector name (e.g. "foo:bar:").
Represents an expression that computes the length of a parameter pack.
Definition ExprCXX.h:4442
NamedDecl * getPack() const
Retrieve the parameter pack.
Definition ExprCXX.h:4510
Encodes a location in the source.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
Stmt - This represents one statement.
Definition Stmt.h:86
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:343
const char * getStmtClassName() const
Definition Stmt.cpp:86
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1802
void outputString(raw_ostream &OS) const
Definition Expr.cpp:1209
A structure for storing the information associated with a substituted template template parameter.
TemplateTemplateParmDecl * getParameter() const
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
SwitchStmt - This represents a 'switch' stmt.
Definition Stmt.h:2501
bool hasVarStorage() const
True if this SwitchStmt has storage for a condition variable.
Definition Stmt.h:2562
bool hasInitStorage() const
True if this SwitchStmt has storage for an init statement.
Definition Stmt.h:2559
StringRef getKindName() const
Definition Decl.h:3913
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3818
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
Definition Decl.h:3963
Represents a template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
bool structurallyEquals(const TemplateArgument &Other) const
Determines whether two template arguments are superficially the same.
void print(const PrintingPolicy &Policy, raw_ostream &Out, bool IncludeType) const
Print this template argument to the given output stream.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
bool isCanonicalExpr() const
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
DeducedTemplateStorage * getAsDeducedTemplateName() const
Retrieve the deduced template info, if any.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
void print(raw_ostream &OS, const PrintingPolicy &Policy, Qualified Qual=Qualified::AsWritten) const
Print the template name.
NameKind getKind() const
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...
@ OverloadedTemplate
A set of overloaded template declarations.
@ Template
A single template declaration.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
@ DeducedTemplate
A template name that refers to another TemplateName with deduced default arguments.
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
UsingShadowDecl * getAsUsingShadowDecl() const
Retrieve the using shadow declaration through which the underlying template declaration is introduced...
SubstTemplateTemplateParmStorage * getAsSubstTemplateTemplateParm() const
Retrieve the substituted template template parameter, if known.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
unsigned getIndex() const
Get the index of the template parameter within its parameter list.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Declaration of a template type parameter.
bool wasDeclaredWithTypename() const
Whether this template type parameter was declared with the 'typename' keyword.
unsigned getIndex() const
Retrieve the index of the template parameter.
const TypeConstraint * getTypeConstraint() const
Returns the type constraint associated with this template parameter (if any).
bool isParameterPack() const
Returns whether this is a parameter pack.
unsigned getDepth() const
Retrieve the depth of the template parameter.
void VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node)
void VisitEnumDecl(const EnumDecl *D)
void VisitExprWithCleanups(const ExprWithCleanups *Node)
void visitInlineCommandComment(const comments::InlineCommandComment *C, const comments::FullComment *)
void VisitCXXStaticCastExpr(const CXXStaticCastExpr *Node)
void visitVerbatimBlockComment(const comments::VerbatimBlockComment *C, const comments::FullComment *)
void dumpPointer(const void *Ptr)
void VisitDeclarationTemplateArgument(const TemplateArgument &TA)
void VisitOpenACCLoopConstruct(const OpenACCLoopConstruct *S)
void VisitLinkageSpecDecl(const LinkageSpecDecl *D)
void VisitVectorType(const VectorType *T)
void VisitLoopControlStmt(const LoopControlStmt *L)
void VisitHLSLRootSignatureDecl(const HLSLRootSignatureDecl *D)
void VisitCoawaitExpr(const CoawaitExpr *Node)
void VisitUnaryOperator(const UnaryOperator *Node)
void dumpAccessSpecifier(AccessSpecifier AS)
void VisitHLSLOutArgExpr(const HLSLOutArgExpr *E)
void VisitDeducedTemplateSpecializationType(const DeducedTemplateSpecializationType *T)
void VisitObjCSelectorExpr(const ObjCSelectorExpr *Node)
void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *Node)
void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *Node)
void VisitPragmaCommentDecl(const PragmaCommentDecl *D)
void VisitOpenACCRoutineDecl(const OpenACCRoutineDecl *D)
void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr *Node)
void VisitImportDecl(const ImportDecl *D)
void VisitUsingEnumDecl(const UsingEnumDecl *D)
void VisitOMPCapturedExprDecl(const OMPCapturedExprDecl *D)
void VisitUnresolvedUsingType(const UnresolvedUsingType *T)
void VisitObjCProtocolExpr(const ObjCProtocolExpr *Node)
void VisitIntegralTemplateArgument(const TemplateArgument &TA)
void VisitObjCCategoryDecl(const ObjCCategoryDecl *D)
void VisitIndirectFieldDecl(const IndirectFieldDecl *D)
void VisitNullTemplateArgument(const TemplateArgument &TA)
void VisitPackTemplateArgument(const TemplateArgument &TA)
void VisitUsingType(const UsingType *T)
void VisitInjectedClassNameType(const InjectedClassNameType *T)
void VisitBinaryOperator(const BinaryOperator *Node)
void VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node)
void VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D)
void VisitBlockDecl(const BlockDecl *D)
void VisitCXXDeleteExpr(const CXXDeleteExpr *Node)
void VisitObjCBoxedExpr(const ObjCBoxedExpr *Node)
void VisitNullPtrTemplateArgument(const TemplateArgument &TA)
void VisitVarTemplateDecl(const VarTemplateDecl *D)
void VisitSubstTemplateTypeParmPackType(const SubstTemplateTypeParmPackType *T)
void VisitConceptSpecializationExpr(const ConceptSpecializationExpr *Node)
void VisitCXXDeductionGuideDecl(const CXXDeductionGuideDecl *D)
TextNodeDumper(raw_ostream &OS, const ASTContext &Context, bool ShowColors)
void VisitPredefinedExpr(const PredefinedExpr *Node)
void dumpType(QualType T)
void VisitMatrixElementExpr(const MatrixElementExpr *Node)
void VisitObjCEncodeExpr(const ObjCEncodeExpr *Node)
void dumpNestedNameSpecifier(NestedNameSpecifier NNS)
void VisitStructuralValueTemplateArgument(const TemplateArgument &TA)
void VisitHLSLBufferDecl(const HLSLBufferDecl *D)
void VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D)
void VisitNamespaceAliasDecl(const NamespaceAliasDecl *D)
void VisitObjCMessageExpr(const ObjCMessageExpr *Node)
void dumpSourceRange(SourceRange R)
void VisitMemberExpr(const MemberExpr *Node)
void VisitOpenACCDataConstruct(const OpenACCDataConstruct *S)
void dumpBareTemplateName(TemplateName TN)
void VisitOpenACCConstructStmt(const OpenACCConstructStmt *S)
void VisitCompoundStmt(const CompoundStmt *Node)
void VisitConstantExpr(const ConstantExpr *Node)
void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node)
void VisitOpenACCDeclareDecl(const OpenACCDeclareDecl *D)
void VisitOpenACCAsteriskSizeExpr(const OpenACCAsteriskSizeExpr *S)
void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *Node)
void VisitConstructorUsingShadowDecl(const ConstructorUsingShadowDecl *D)
void VisitWhileStmt(const WhileStmt *Node)
void VisitCharacterLiteral(const CharacterLiteral *Node)
void VisitAccessSpecDecl(const AccessSpecDecl *D)
void VisitFunctionType(const FunctionType *T)
void VisitObjCImplementationDecl(const ObjCImplementationDecl *D)
void VisitReturnStmt(const ReturnStmt *Node)
void VisitTypeLoc(TypeLoc TL)
void VisitAutoType(const AutoType *T)
void VisitObjCInterfaceType(const ObjCInterfaceType *T)
void visitVerbatimLineComment(const comments::VerbatimLineComment *C, const comments::FullComment *)
void VisitTypedefDecl(const TypedefDecl *D)
void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *Node)
void visitParamCommandComment(const comments::ParamCommandComment *C, const comments::FullComment *FC)
void VisitIntegerLiteral(const IntegerLiteral *Node)
void VisitObjCProtocolDecl(const ObjCProtocolDecl *D)
void VisitGotoStmt(const GotoStmt *Node)
void VisitDependentSizedExtVectorType(const DependentSizedExtVectorType *T)
void VisitFriendDecl(const FriendDecl *D)
void VisitSwitchStmt(const SwitchStmt *Node)
void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node)
void VisitEmbedExpr(const EmbedExpr *S)
void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D)
void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D)
void VisitUsingDecl(const UsingDecl *D)
void VisitConstantArrayType(const ConstantArrayType *T)
void VisitTypeTemplateArgument(const TemplateArgument &TA)
void VisitObjCPropertyDecl(const ObjCPropertyDecl *D)
void VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D)
void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node)
void VisitArrayType(const ArrayType *T)
void visitHTMLEndTagComment(const comments::HTMLEndTagComment *C, const comments::FullComment *)
void VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node)
void visitTextComment(const comments::TextComment *C, const comments::FullComment *)
void VisitLifetimeExtendedTemporaryDecl(const LifetimeExtendedTemporaryDecl *D)
void VisitCXXRecordDecl(const CXXRecordDecl *D)
void VisitTemplateTemplateArgument(const TemplateArgument &TA)
void dumpCleanupObject(const ExprWithCleanups::CleanupObject &C)
void VisitOpenACCExitDataConstruct(const OpenACCExitDataConstruct *S)
void VisitCaseStmt(const CaseStmt *Node)
void VisitRValueReferenceType(const ReferenceType *T)
void VisitPackExpansionType(const PackExpansionType *T)
void VisitConceptDecl(const ConceptDecl *D)
void VisitOpenACCEnterDataConstruct(const OpenACCEnterDataConstruct *S)
void VisitCallExpr(const CallExpr *Node)
void VisitCapturedDecl(const CapturedDecl *D)
void VisitOpenACCWaitConstruct(const OpenACCWaitConstruct *S)
void VisitBuiltinTemplateDecl(const BuiltinTemplateDecl *D)
void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node)
void VisitOMPDeclareReductionDecl(const OMPDeclareReductionDecl *D)
void VisitCoreturnStmt(const CoreturnStmt *Node)
void VisitSizeOfPackExpr(const SizeOfPackExpr *Node)
void VisitDeclRefExpr(const DeclRefExpr *Node)
void VisitLabelStmt(const LabelStmt *Node)
void VisitOpenACCUpdateConstruct(const OpenACCUpdateConstruct *S)
void Visit(const comments::Comment *C, const comments::FullComment *FC)
void VisitLabelDecl(const LabelDecl *D)
void VisitUnaryTransformType(const UnaryTransformType *T)
void VisitStringLiteral(const StringLiteral *Str)
void VisitOMPRequiresDecl(const OMPRequiresDecl *D)
void dumpBareType(QualType T, bool Desugar=true)
void VisitTemplateSpecializationType(const TemplateSpecializationType *T)
void VisitOpenACCInitConstruct(const OpenACCInitConstruct *S)
void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D)
void VisitCompoundAssignOperator(const CompoundAssignOperator *Node)
void VisitCXXThisExpr(const CXXThisExpr *Node)
void VisitOpenACCRoutineDeclAttr(const OpenACCRoutineDeclAttr *A)
void dumpName(const NamedDecl *ND)
void dumpTemplateName(TemplateName TN, StringRef Label={})
void VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *Node)
void VisitObjCIvarDecl(const ObjCIvarDecl *D)
void VisitFieldDecl(const FieldDecl *D)
void dumpDeclRef(const Decl *D, StringRef Label={})
void VisitRecordDecl(const RecordDecl *D)
void VisitCXXNewExpr(const CXXNewExpr *Node)
void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node)
void VisitCastExpr(const CastExpr *Node)
void VisitObjCTypeParamDecl(const ObjCTypeParamDecl *D)
void VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T)
void VisitExpressionTraitExpr(const ExpressionTraitExpr *Node)
void VisitAddrLabelExpr(const AddrLabelExpr *Node)
void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D)
void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *Node)
void VisitOpenACCAtomicConstruct(const OpenACCAtomicConstruct *S)
void visitBlockCommandComment(const comments::BlockCommandComment *C, const comments::FullComment *)
void VisitExpressionTemplateArgument(const TemplateArgument &TA)
void VisitTypeAliasDecl(const TypeAliasDecl *D)
void VisitVarDecl(const VarDecl *D)
void VisitOpenACCCacheConstruct(const OpenACCCacheConstruct *S)
void VisitFixedPointLiteral(const FixedPointLiteral *Node)
void VisitOMPIteratorExpr(const OMPIteratorExpr *Node)
void VisitUsingDirectiveDecl(const UsingDirectiveDecl *D)
void VisitObjCMethodDecl(const ObjCMethodDecl *D)
void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D)
void VisitUsingShadowDecl(const UsingShadowDecl *D)
void VisitNamespaceDecl(const NamespaceDecl *D)
void VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D)
void VisitOpenACCHostDataConstruct(const OpenACCHostDataConstruct *S)
void VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node)
void VisitIfStmt(const IfStmt *Node)
void VisitCXXConstructExpr(const CXXConstructExpr *Node)
void VisitFunctionProtoType(const FunctionProtoType *T)
void dumpTemplateArgument(const TemplateArgument &TA)
void dumpLocation(SourceLocation Loc)
void VisitDependentSizedArrayType(const DependentSizedArrayType *T)
void VisitOpenACCCombinedConstruct(const OpenACCCombinedConstruct *S)
void VisitOMPExecutableDirective(const OMPExecutableDirective *D)
void VisitImplicitCastExpr(const ImplicitCastExpr *Node)
void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *Node)
void VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node)
void VisitTagType(const TagType *T)
void VisitTemplateExpansionTemplateArgument(const TemplateArgument &TA)
void VisitSYCLUniqueStableNameExpr(const SYCLUniqueStableNameExpr *Node)
void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D)
void VisitOpenACCSetConstruct(const OpenACCSetConstruct *S)
void VisitFunctionDecl(const FunctionDecl *D)
void visitTParamCommandComment(const comments::TParamCommandComment *C, const comments::FullComment *FC)
void VisitTypeTraitExpr(const TypeTraitExpr *Node)
void dumpBareDeclRef(const Decl *D)
void VisitExtVectorElementExpr(const ExtVectorElementExpr *Node)
void VisitConvertVectorExpr(const ConvertVectorExpr *S)
void visitVerbatimBlockLineComment(const comments::VerbatimBlockLineComment *C, const comments::FullComment *)
void VisitOpenACCShutdownConstruct(const OpenACCShutdownConstruct *S)
void VisitFloatingLiteral(const FloatingLiteral *Node)
void VisitInitListExpr(const InitListExpr *ILE)
void VisitRequiresExpr(const RequiresExpr *Node)
void VisitVariableArrayType(const VariableArrayType *T)
void VisitGenericSelectionExpr(const GenericSelectionExpr *E)
void VisitTemplateTypeParmType(const TemplateTypeParmType *T)
void VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *Node)
void visitHTMLStartTagComment(const comments::HTMLStartTagComment *C, const comments::FullComment *)
void VisitEnumConstantDecl(const EnumConstantDecl *D)
void VisitPragmaDetectMismatchDecl(const PragmaDetectMismatchDecl *D)
void dumpTemplateSpecializationKind(TemplateSpecializationKind TSK)
void VisitAtomicExpr(const AtomicExpr *AE)
void VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D)
void VisitClassTemplateDecl(const ClassTemplateDecl *D)
void VisitBindingDecl(const BindingDecl *D)
void VisitTypedefType(const TypedefType *T)
TextTreeStructure(raw_ostream &OS, bool ShowColors)
void AddChild(Fn DoAddChild)
Add a child of the current node. Calls DoAddChild without arguments.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition Decl.h:3688
Declaration of an alias template.
Symbolic representation of typeid(T) for some type T.
Definition APValue.h:44
RetTy Visit(TypeLoc TyLoc)
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
QualType getType() const
Get the type for which this source info wrapper provides information.
Definition TypeLoc.h:133
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition TypeLoc.h:154
TypeLocClass getTypeLocClass() const
Definition TypeLoc.h:116
const Type * getTypePtr() const
Definition TypeLoc.h:137
A container of type source information.
Definition TypeBase.h:8359
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8370
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
Definition ExprCXX.h:2897
TypeTrait getTrait() const
Determine which type trait this expression uses.
Definition ExprCXX.h:2940
RetTy Visit(const Type *T)
Performs the operation associated with this visitor object.
Definition TypeVisitor.h:68
The base class of the type hierarchy.
Definition TypeBase.h:1839
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
Definition Type.cpp:2230
QualType getLocallyUnqualifiedSingleStepDesugaredType() const
Pull a single level of sugar off of this locally-unqualified type.
Definition Type.cpp:522
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2790
const char * getTypeClassName() const
Definition Type.cpp:3419
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9218
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3667
QualType getUnderlyingType() const
Definition Decl.h:3617
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
Definition Expr.h:2628
QualType getArgumentType() const
Definition Expr.h:2671
UnaryExprOrTypeTrait getKind() const
Definition Expr.h:2660
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2247
static bool isPostfix(Opcode Op)
isPostfix - Return true if this is a postfix operation, like x++.
Definition Expr.h:2317
Opcode getOpcode() const
Definition Expr.h:2283
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
Definition Expr.h:2384
FPOptionsOverride getStoredFPFeatures() const
Get FPFeatures from trailing storage.
Definition Expr.h:2387
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
Definition Expr.cpp:1406
bool canOverflow() const
Returns true if the unary operator can cause an overflow.
Definition Expr.h:2301
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition ExprCXX.h:3391
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
Definition ExprCXX.h:3460
Represents the dependent type named by a dependently-scoped typename using declaration,...
Definition TypeBase.h:6031
Represents a dependent using declaration which was marked with typename.
Definition DeclCXX.h:4040
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Definition DeclCXX.h:4077
Represents a dependent using declaration which was not marked with typename.
Definition DeclCXX.h:3943
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Definition DeclCXX.h:3987
Represents a C++ using-declaration.
Definition DeclCXX.h:3594
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Definition DeclCXX.h:3631
Represents C++ using-directive.
Definition DeclCXX.h:3099
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
Definition DeclCXX.cpp:3315
Represents a C++ using-enum-declaration.
Definition DeclCXX.h:3795
EnumDecl * getEnumDecl() const
Definition DeclCXX.h:3837
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3402
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
Definition DeclCXX.h:3466
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
QualType getType() const
Definition Decl.h:723
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Definition Decl.cpp:5594
Kind getKind() const
Definition Value.h:137
Represents a variable declaration or definition.
Definition Decl.h:926
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
Definition Decl.h:1569
TLSKind getTLSKind() const
Definition Decl.cpp:2180
bool hasInit() const
Definition Decl.cpp:2410
InitializationStyle getInitStyle() const
The style of initialization for this declaration.
Definition Decl.h:1466
static const char * getStorageClassSpecifierString(StorageClass SC)
Return the string used to specify the storage class SC.
Definition Decl.cpp:2133
@ ListInit
Direct list-initialization (C++11)
Definition Decl.h:937
@ CInit
C-style initialization with assignment.
Definition Decl.h:931
@ ParenListInit
Parenthesized list-initialization (C++20)
Definition Decl.h:940
@ CallInit
Call-style initialization (C++98)
Definition Decl.h:934
APValue * evaluateValue() const
Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...
Definition Decl.cpp:2587
VarDecl * getTemplateInstantiationPattern() const
Retrieve the variable declaration from which this variable could be instantiated, if it is an instant...
Definition Decl.cpp:2726
bool isNRVOVariable() const
Determine whether this local variable can be used with the named return value optimization (NRVO).
Definition Decl.h:1512
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
Definition Decl.cpp:2863
bool isInline() const
Whether this variable is (C++1z) inline.
Definition Decl.h:1551
const Expr * getInit() const
Definition Decl.h:1368
@ TLS_Static
TLS with a known-constant initializer.
Definition Decl.h:949
@ TLS_Dynamic
TLS with a dynamic initializer.
Definition Decl.h:952
@ TLS_None
Not a TLS variable.
Definition Decl.h:946
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:1168
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Definition Decl.cpp:2791
Declaration of a variable template.
Represents a C array with a specified size that is not an integer-constant-expression.
Definition TypeBase.h:3974
Represents a GCC generic vector type.
Definition TypeBase.h:4183
WhileStmt - This represents a 'while' stmt.
Definition Stmt.h:2689
bool hasVarStorage() const
True if this WhileStmt has storage for a condition variable.
Definition Stmt.h:2739
A command that has zero or more word-like arguments (number of word-like arguments depends on command...
Definition Comment.h:625
static const CommandInfo * getBuiltinCommandInfo(StringRef Name)
Any part of the comment.
Definition Comment.h:66
A full comment attached to a declaration, contains block content.
Definition Comment.h:1104
An opening HTML tag with attributes.
Definition Comment.h:454
A command with word-like arguments that is considered inline content.
Definition Comment.h:341
Doxygen \param command.
Definition Comment.h:732
static const char * getDirectionAsString(ParamCommandPassDirection D)
Definition Comment.cpp:189
Doxygen \tparam command, describes a template parameter.
Definition Comment.h:814
A verbatim block command (e.
Definition Comment.h:900
A line of text contained in a verbatim block.
Definition Comment.h:875
A verbatim line command.
Definition Comment.h:951
A static requirement that can be used in a requires-expression to check properties of types and expre...
RequirementKind getKind() const
bool containsUnexpandedParameterPack() const
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
Definition Address.h:330
llvm::StringRef getAccessSpelling(AccessSpecifier AS)
Definition Specifiers.h:419
@ PCK_ExeStr
Definition PragmaKinds.h:19
@ PCK_Compiler
Definition PragmaKinds.h:18
@ PCK_Linker
Definition PragmaKinds.h:16
@ PCK_Lib
Definition PragmaKinds.h:17
@ PCK_Unknown
Definition PragmaKinds.h:15
@ PCK_User
Definition PragmaKinds.h:20
@ RQ_None
No ref-qualifier was provided.
Definition TypeBase.h:1788
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
Definition TypeBase.h:1791
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
Definition TypeBase.h:1794
@ OK_VectorComponent
A vector component is an element or range of elements of a vector.
Definition Specifiers.h:157
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
Definition Specifiers.h:161
@ OK_ObjCSubscript
An Objective-C array/dictionary subscripting which reads an object or writes at the subscripted array...
Definition Specifiers.h:166
@ OK_Ordinary
An ordinary object is located at an address in memory.
Definition Specifiers.h:151
@ OK_BitField
A bitfield object is a bitfield on a C or C++ record.
Definition Specifiers.h:154
@ OK_MatrixComponent
A matrix component is a single element or range of elements of a matrix.
Definition Specifiers.h:169
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
Definition Sema.h:636
@ Auto
'auto' clause, allowed on 'loop' directives.
@ Bind
'bind' clause, allowed on routine constructs.
@ Gang
'gang' clause, allowed on 'loop' and Combined constructs.
@ Wait
'wait' clause, allowed on Compute, Data, 'update', and Combined constructs.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ PCopyOut
'copyout' clause alias 'pcopyout'. Preserved for diagnostic purposes.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ PresentOrCreate
'create' clause alias 'present_or_create'.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ NoHost
'nohost' clause, allowed on 'routine' directives.
@ PresentOrCopy
'copy' clause alias 'present_or_copy'. Preserved for diagnostic purposes.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ Private
'private' clause, allowed on 'parallel', 'serial', 'loop', 'parallel loop', and 'serial loop' constru...
@ Invalid
Represents an invalid clause, for the purposes of parsing.
@ Vector
'vector' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Copy
'copy' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ Worker
'worker' clause, allowed on 'loop', Combined, and 'routine' directives.
@ Create
'create' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ DeviceType
'device_type' clause, allowed on Compute, 'data', 'init', 'shutdown', 'set', update',...
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ Shortloop
'shortloop' is represented in the ACC.td file, but isn't present in the standard.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Default
'default' clause, allowed on parallel, serial, kernel (and compound) constructs.
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ PresentOrCopyOut
'copyout' clause alias 'present_or_copyout'.
@ Link
'link' clause, allowed on 'declare' construct.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ CopyOut
'copyout' clause, allowed on Compute and Combined constructs, plus 'data', 'exit data',...
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Host
'host' clause, allowed on 'update' construct.
@ PCopy
'copy' clause alias 'pcopy'. Preserved for diagnostic purposes.
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ PCopyIn
'copyin' clause alias 'pcopyin'. Preserved for diagnostic purposes.
@ DeviceResident
'device_resident' clause, allowed on the 'declare' construct.
@ PCreate
'create' clause alias 'pcreate'. Preserved for diagnostic purposes.
@ Present
'present' clause, allowed on Compute and Combined constructs, plus 'data' and 'declare'.
@ DType
'dtype' clause, an alias for 'device_type', stored separately for diagnostic purposes.
@ CopyIn
'copyin' clause, allowed on Compute and Combined constructs, plus 'data', 'enter data',...
@ Device
'device' clause, allowed on the 'update' construct.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ PresentOrCopyIn
'copyin' clause alias 'present_or_copyin'.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition Specifiers.h:123
StorageClass
Storage classes.
Definition Specifiers.h:248
@ SC_None
Definition Specifiers.h:250
IdentifierLoc DeviceTypeArgument
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:135
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
Definition Specifiers.h:144
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:139
const char * getTraitSpelling(ExpressionTrait T) LLVM_READONLY
Return the spelling of the type trait TT. Never null.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition Specifiers.h:188
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
Definition Specifiers.h:206
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
Definition Specifiers.h:202
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
Definition Specifiers.h:198
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
Definition Specifiers.h:194
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
Definition Specifiers.h:191
@ Invariant
The parameter is invariant: must match exactly.
Definition DeclObjC.h:555
@ Contravariant
The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...
Definition DeclObjC.h:563
@ Covariant
The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...
Definition DeclObjC.h:559
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
@ AltiVecBool
is AltiVec 'vector bool ...'
Definition TypeBase.h:4153
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
Definition TypeBase.h:4162
@ AltiVecVector
is AltiVec vector
Definition TypeBase.h:4147
@ AltiVecPixel
is AltiVec 'vector Pixel'
Definition TypeBase.h:4150
@ Neon
is ARM Neon vector
Definition TypeBase.h:4156
@ Generic
not a target-specific vector type
Definition TypeBase.h:4144
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
Definition TypeBase.h:4168
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
Definition TypeBase.h:4171
@ NeonPoly
is ARM Neon polynomial vector
Definition TypeBase.h:4159
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
Definition TypeBase.h:4165
U cast(CodeGen::Address addr)
Definition Address.h:327
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition TypeBase.h:5914
@ None
No keyword precedes the qualified type name.
Definition TypeBase.h:5935
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
@ NOUR_Discarded
This name appears as a potential result of a discarded value expression.
Definition Specifiers.h:183
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
Definition Specifiers.h:177
@ NOUR_None
This is an odr-use.
Definition Specifiers.h:175
@ NOUR_Constant
This name appears as a potential result of an lvalue-to-rvalue conversion that is a constant expressi...
Definition Specifiers.h:180
static constexpr TerminalColor Value
static constexpr TerminalColor Address
static constexpr TerminalColor Comment
static constexpr TerminalColor DeclKindName
static constexpr TerminalColor ObjectKind
static constexpr TerminalColor Null
static constexpr TerminalColor Location
static constexpr TerminalColor Attr
static constexpr TerminalColor DeclName
static constexpr TerminalColor Stmt
static constexpr TerminalColor Cast
static constexpr TerminalColor ValueKind
static constexpr TerminalColor Undeserialized
static constexpr TerminalColor Type
static constexpr TerminalColor Errors
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
Definition TypeBase.h:5384
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
Definition TypeBase.h:5388
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5374
Extra information about a function prototype.
Definition TypeBase.h:5400
static StringRef getKeywordName(ElaboratedTypeKeyword Keyword)
Definition Type.cpp:3378
Iterator range representation begin:end[:step].
Definition ExprOpenMP.h:154
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
Definition TypeBase.h:870
Information about a single command.