clang 24.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"
23#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 =
213 T->getLocallyUnqualifiedSingleStepDesugaredType();
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);
553 dumpSourceRange(R->getSourceRange());
554 OS << ' ';
555 dumpBareDeclRef(R->getNamedConcept());
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");
594 if (R->containsUnexpandedParameterPack())
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 dumpAPValueChildren(
815 Value, Ty,
816 [](const APValue &Value, unsigned Index) -> const APValue & {
817 return Value.getStructVirtualBase(Index);
818 },
819 Value.getStructNumVirtualBases(), "vbase", "vbases");
820 return;
821 }
822 case APValue::Matrix: {
823 unsigned NumRows = Value.getMatrixNumRows();
824 unsigned NumCols = Value.getMatrixNumColumns();
825 OS << "Matrix " << NumRows << "x" << NumCols;
826
827 dumpAPValueChildren(
828 Value, Ty,
829 [](const APValue &Value, unsigned Index) -> const APValue & {
830 return Value.getMatrixElt(Index);
831 },
832 Value.getMatrixNumElements(), "element", "elements");
833 return;
834 }
835 case APValue::Union: {
836 OS << "Union";
837 {
838 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
839 if (const FieldDecl *FD = Value.getUnionField())
840 OS << " ." << *cast<NamedDecl>(FD);
841 }
842 // If the union value is considered to be simple, fold it into the
843 // current line to save some vertical space.
844 const APValue &UnionValue = Value.getUnionValue();
845 if (isSimpleAPValue(UnionValue)) {
846 OS << ' ';
847 Visit(UnionValue, Ty);
848 } else {
849 AddChild([=] { Visit(UnionValue, Ty); });
850 }
851
852 return;
853 }
855 OS << "MemberPointer ";
856 auto Path = Value.getMemberPointerPath();
857 for (const CXXRecordDecl *D : Path) {
858 {
859 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclName);
860 OS << D->getDeclName();
861 }
862 OS << "::";
863 }
864
865 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclName);
866 if (const ValueDecl *MemDecl = Value.getMemberPointerDecl())
867 OS << MemDecl->getDeclName();
868 else
869 OS << "null";
870 return;
871 }
873 OS << "AddrLabelDiff ";
874 OS << "&&" << Value.getAddrLabelDiffLHS()->getLabel()->getName();
875 OS << " - ";
876 OS << "&&" << Value.getAddrLabelDiffRHS()->getLabel()->getName();
877 return;
878 }
879 llvm_unreachable("Unknown APValue kind!");
880}
881
882void TextNodeDumper::dumpPointer(const void *Ptr) {
883 ColorScope Color(OS, ShowColors, ASTDumpColor::Address);
884 OS << ' ' << Ptr;
885}
886
888 if (!SM)
889 return;
890
891 ColorScope Color(OS, ShowColors, ASTDumpColor::Location);
892 SourceLocation SpellingLoc = SM->getSpellingLoc(Loc);
893
894 // The general format we print out is filename:line:col, but we drop pieces
895 // that haven't changed since the last loc printed.
896 PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc);
897
898 if (PLoc.isInvalid()) {
899 OS << "<invalid sloc>";
900 return;
901 }
902
903 if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) {
904 OS << PLoc.getFilename() << ':' << PLoc.getLine() << ':'
905 << PLoc.getColumn();
906 LastLocFilename = PLoc.getFilename();
907 LastLocLine = PLoc.getLine();
908 } else if (PLoc.getLine() != LastLocLine) {
909 OS << "line" << ':' << PLoc.getLine() << ':' << PLoc.getColumn();
910 LastLocLine = PLoc.getLine();
911 } else {
912 OS << "col" << ':' << PLoc.getColumn();
913 }
914}
915
917 // Can't translate locations if a SourceManager isn't available.
918 if (!SM)
919 return;
920
921 OS << " <";
922 dumpLocation(R.getBegin());
923 if (R.getBegin() != R.getEnd()) {
924 OS << ", ";
925 dumpLocation(R.getEnd());
926 }
927 OS << ">";
928
929 // <t2.c:123:421[blah], t2.c:412:321>
930}
931
933 ColorScope Color(OS, ShowColors, ASTDumpColor::Type);
934
935 SplitQualType T_split = T.split();
936 std::string T_str = QualType::getAsString(T_split, PrintPolicy);
937 OS << "'" << T_str << "'";
938
939 if (Desugar && !T.isNull()) {
940 // If the type is sugared, also dump a (shallow) desugared type when
941 // it is visibly different.
942 SplitQualType D_split = T.getSplitDesugaredType();
943 if (T_split != D_split) {
944 std::string D_str = QualType::getAsString(D_split, PrintPolicy);
945 if (T_str != D_str)
946 OS << ":'" << QualType::getAsString(D_split, PrintPolicy) << "'";
947 }
948 }
949}
950
952 OS << ' ';
954}
955
957 if (!D) {
958 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
959 OS << "<<<NULL>>>";
960 return;
961 }
962
963 {
964 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
965 OS << D->getDeclKindName();
966 }
967 dumpPointer(D);
968
969 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
970 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclName);
971 if (DeclarationName Name = ND->getDeclName())
972 OS << " '" << Name << '\'';
973 else
974 switch (ND->getKind()) {
975 case Decl::Decomposition:
976 if (auto Bindings = cast<DecompositionDecl>(ND)->bindings();
977 !Bindings.empty())
978 OS << " first_binding '" << Bindings[0]->getDeclName() << '\'';
979 else
980 OS << " no_bindings";
981 break;
982 case Decl::Field: {
983 auto *FD = cast<FieldDecl>(ND);
984 OS << " field_index " << FD->getFieldIndex();
985 break;
986 }
987 case Decl::ParmVar: {
988 auto *PD = cast<ParmVarDecl>(ND);
989 OS << " depth " << PD->getFunctionScopeDepth() << " index "
990 << PD->getFunctionScopeIndex();
991 break;
992 }
993 case Decl::TemplateTypeParm: {
994 auto *TD = cast<TemplateTypeParmDecl>(ND);
995 OS << " depth " << TD->getDepth() << " index " << TD->getIndex();
996 break;
997 }
998 case Decl::NonTypeTemplateParm: {
999 auto *TD = cast<NonTypeTemplateParmDecl>(ND);
1000 OS << " depth " << TD->getDepth() << " index " << TD->getIndex();
1001 break;
1002 }
1003 default:
1004 // Var, Namespace, (CXX)Record: Nothing else besides source location.
1005 dumpSourceRange(ND->getSourceRange());
1006 break;
1007 }
1008 }
1009
1010 if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
1011 dumpType(VD->getType());
1012}
1013
1015 if (ND->getDeclName()) {
1016 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclName);
1017 OS << ' ' << ND->getDeclName();
1018 }
1019}
1020
1022 const auto AccessSpelling = getAccessSpelling(AS);
1023 if (AccessSpelling.empty())
1024 return;
1025 OS << AccessSpelling;
1026}
1027
1030 if (auto *BD = dyn_cast<BlockDecl *>(C))
1031 dumpDeclRef(BD, "cleanup");
1032 else if (auto *CLE = dyn_cast<CompoundLiteralExpr *>(C))
1033 AddChild([=] {
1034 OS << "cleanup ";
1035 {
1036 ColorScope Color(OS, ShowColors, ASTDumpColor::Stmt);
1037 OS << CLE->getStmtClassName();
1038 }
1039 dumpPointer(CLE);
1040 });
1041 else
1042 llvm_unreachable("unexpected cleanup type");
1043}
1044
1047 switch (TSK) {
1048 case TSK_Undeclared:
1049 break;
1051 OS << " implicit_instantiation";
1052 break;
1054 OS << " explicit_specialization";
1055 break;
1057 OS << " explicit_instantiation_declaration";
1058 break;
1060 OS << " explicit_instantiation_definition";
1061 break;
1062 }
1063}
1064
1066 if (!NNS)
1067 return;
1068
1069 AddChild([=] {
1070 OS << "NestedNameSpecifier";
1071
1072 switch (NNS.getKind()) {
1074 auto [Namespace, Prefix] = NNS.getAsNamespaceAndPrefix();
1075 OS << " "; // "Namespace" is printed as the decl kind.
1076 dumpBareDeclRef(Namespace);
1078 break;
1079 }
1081 OS << " TypeSpec";
1082 dumpType(QualType(NNS.getAsType(), 0));
1083 break;
1085 OS << " Global";
1086 break;
1088 OS << " Super";
1089 break;
1091 llvm_unreachable("unexpected null nested name specifier");
1092 }
1093 });
1094}
1095
1096void TextNodeDumper::dumpDeclRef(const Decl *D, StringRef Label) {
1097 if (!D)
1098 return;
1099
1100 AddChild([=] {
1101 if (!Label.empty())
1102 OS << Label << ' ';
1103 dumpBareDeclRef(D);
1104 });
1105}
1106
1109 {
1110 llvm::raw_svector_ostream SS(Str);
1111 TA.print(PrintPolicy, SS, /*IncludeType=*/true);
1112 }
1113 OS << " '" << Str << "'";
1114
1115 if (!Context)
1116 return;
1117
1118 if (TemplateArgument CanonTA = Context->getCanonicalTemplateArgument(TA);
1119 !CanonTA.structurallyEquals(TA)) {
1120 llvm::SmallString<128> CanonStr;
1121 {
1122 llvm::raw_svector_ostream SS(CanonStr);
1123 CanonTA.print(PrintPolicy, SS, /*IncludeType=*/true);
1124 }
1125 if (CanonStr != Str)
1126 OS << ":'" << CanonStr << "'";
1127 }
1128}
1129
1130const char *TextNodeDumper::getCommandName(unsigned CommandID) {
1131 if (Traits)
1132 return Traits->getCommandInfo(CommandID)->Name;
1133 const comments::CommandInfo *Info =
1135 if (Info)
1136 return Info->Name;
1137 return "<not a builtin command>";
1138}
1139
1140void TextNodeDumper::printFPOptions(FPOptionsOverride FPO) {
1141#define FP_OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
1142 if (FPO.has##NAME##Override()) \
1143 OS << " " #NAME "=" << FPO.get##NAME##Override();
1144#include "clang/Basic/FPOptions.def"
1145}
1146
1148 const comments::FullComment *) {
1149 OS << " Text=\"" << C->getText() << "\"";
1150}
1151
1154 OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
1155 switch (C->getRenderKind()) {
1157 OS << " RenderNormal";
1158 break;
1160 OS << " RenderBold";
1161 break;
1163 OS << " RenderMonospaced";
1164 break;
1166 OS << " RenderEmphasized";
1167 break;
1169 OS << " RenderAnchor";
1170 break;
1171 }
1172
1173 for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
1174 OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
1175}
1176
1179 OS << " Name=\"" << C->getTagName() << "\"";
1180 if (C->getNumAttrs() != 0) {
1181 OS << " Attrs: ";
1182 for (unsigned i = 0, e = C->getNumAttrs(); i != e; ++i) {
1183 const comments::HTMLStartTagComment::Attribute &Attr = C->getAttr(i);
1184 OS << " \"" << Attr.Name << "=\"" << Attr.Value << "\"";
1185 }
1186 }
1187 if (C->isSelfClosing())
1188 OS << " SelfClosing";
1189}
1190
1193 OS << " Name=\"" << C->getTagName() << "\"";
1194}
1195
1198 OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
1199 for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
1200 OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
1201}
1202
1205 OS << " "
1207
1208 if (C->isDirectionExplicit())
1209 OS << " explicitly";
1210 else
1211 OS << " implicitly";
1212
1213 if (C->hasParamName()) {
1214 if (C->isParamIndexValid())
1215 OS << " Param=\"" << C->getParamName(FC) << "\"";
1216 else
1217 OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
1218 }
1219
1220 if (C->isParamIndexValid() && !C->isVarArgParam())
1221 OS << " ParamIndex=" << C->getParamIndex();
1222}
1223
1226 if (C->hasParamName()) {
1227 if (C->isPositionValid())
1228 OS << " Param=\"" << C->getParamName(FC) << "\"";
1229 else
1230 OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
1231 }
1232
1233 if (C->isPositionValid()) {
1234 OS << " Position=<";
1235 for (unsigned i = 0, e = C->getDepth(); i != e; ++i) {
1236 OS << C->getIndex(i);
1237 if (i != e - 1)
1238 OS << ", ";
1239 }
1240 OS << ">";
1241 }
1242}
1243
1246 OS << " Name=\"" << getCommandName(C->getCommandID())
1247 << "\""
1248 " CloseName=\""
1249 << C->getCloseName() << "\"";
1250}
1251
1254 const comments::FullComment *) {
1255 OS << " Text=\"" << C->getText() << "\"";
1256}
1257
1260 OS << " Text=\"" << C->getText() << "\"";
1261}
1262
1264 OS << " null";
1265}
1266
1268 OS << " type";
1270}
1271
1273 const TemplateArgument &TA) {
1274 OS << " decl";
1276 dumpDeclRef(TA.getAsDecl());
1277}
1278
1280 OS << " nullptr";
1282}
1283
1285 OS << " integral";
1287}
1288
1290 const TemplateArgument &TA) {
1291 OS << " structural value";
1293}
1294
1296 AddChild(Label, [=] {
1297 {
1299 {
1300 llvm::raw_svector_ostream SS(Str);
1301 TN.print(SS, PrintPolicy);
1302 }
1303 OS << "'" << Str << "'";
1304
1305 if (Context) {
1306 if (TemplateName CanonTN = Context->getCanonicalTemplateName(TN);
1307 CanonTN != TN) {
1308 llvm::SmallString<128> CanonStr;
1309 {
1310 llvm::raw_svector_ostream SS(CanonStr);
1311 CanonTN.print(SS, PrintPolicy);
1312 }
1313 if (CanonStr != Str)
1314 OS << ":'" << CanonStr << "'";
1315 }
1316 }
1317 }
1319 });
1320}
1321
1323 switch (TN.getKind()) {
1325 AddChild([=] { Visit(TN.getAsTemplateDecl()); });
1326 return;
1328 const UsingShadowDecl *USD = TN.getAsUsingShadowDecl();
1329 AddChild([=] { Visit(USD); });
1330 AddChild("target", [=] { Visit(USD->getTargetDecl()); });
1331 return;
1332 }
1334 OS << " qualified";
1336 if (QTN->hasTemplateKeyword())
1337 OS << " keyword";
1340 return;
1341 }
1343 OS << " dependent";
1346 return;
1347 }
1349 OS << " subst";
1352 OS << " index " << STS->getIndex();
1354 OS << " pack_index " << *PackIndex;
1355 if (STS->getFinal())
1356 OS << " final";
1357 if (const TemplateTemplateParmDecl *P = STS->getParameter())
1358 AddChild("parameter", [=] { Visit(P); });
1359 dumpDeclRef(STS->getAssociatedDecl(), "associated");
1360 dumpTemplateName(STS->getReplacement(), "replacement");
1361 return;
1362 }
1364 OS << " deduced";
1366 dumpTemplateName(DTS->getUnderlying(), "underlying");
1367 AddChild("defaults", [=] {
1368 auto [StartPos, Args] = DTS->getDefaultArguments();
1369 OS << " start " << StartPos;
1370 for (const TemplateArgument &Arg : Args)
1371 AddChild([=] { Visit(Arg, SourceRange()); });
1372 });
1373 return;
1374 }
1375 // FIXME: Implement these.
1377 OS << " overloaded";
1378 return;
1380 OS << " assumed";
1381 return;
1383 OS << " subst_pack";
1384 return;
1385 }
1386 llvm_unreachable("Unexpected TemplateName Kind");
1387}
1388
1394
1401
1403 const TemplateArgument &TA) {
1404 OS << " expr";
1405 if (TA.isCanonicalExpr())
1406 OS << " canonical";
1408}
1409
1411 OS << " pack";
1413}
1414
1415static void dumpBasePath(raw_ostream &OS, const CastExpr *Node) {
1416 if (Node->path_empty())
1417 return;
1418
1419 OS << " (";
1420 bool First = true;
1422 E = Node->path_end();
1423 I != E; ++I) {
1424 const CXXBaseSpecifier *Base = *I;
1425 if (!First)
1426 OS << " -> ";
1427
1428 const auto *RD = cast<CXXRecordDecl>(
1429 Base->getType()->castAsCanonical<RecordType>()->getDecl());
1430
1431 if (Base->isVirtual())
1432 OS << "virtual ";
1433 OS << RD->getName();
1434 First = false;
1435 }
1436
1437 OS << ')';
1438}
1439
1441 switch (ND->getFormalLinkage()) {
1442 case Linkage::None:
1443 // A lot of declarations have no linkage, so we only dump linkage if there
1444 // is one.
1445 break;
1446 case Linkage::Internal:
1447 OS << " internal-linkage";
1448 break;
1449 case Linkage::External:
1450 OS << " external-linkage";
1451 break;
1452 case Linkage::Module:
1453 OS << " module-linkage";
1454 break;
1455 case Linkage::Invalid:
1456 llvm_unreachable("Linkage hasn't been computed!");
1459 llvm_unreachable("Not a formal linkage!");
1460 }
1461}
1462
1464 if (!Node->hasLabelTarget())
1465 return;
1466
1467 OS << " '" << Node->getLabelDecl()->getIdentifier()->getName() << "' (";
1468
1469 auto *Target = Node->getNamedLoopOrSwitch();
1470 if (!Target) {
1471 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
1472 OS << "<<<NULL>>>";
1473 } else {
1474 {
1475 ColorScope Color(OS, ShowColors, ASTDumpColor::Stmt);
1476 OS << Target->getStmtClassName();
1477 }
1479 }
1480 OS << ")";
1481}
1482
1484 if (Node->hasInitStorage())
1485 OS << " has_init";
1486 if (Node->hasVarStorage())
1487 OS << " has_var";
1488 if (Node->hasElseStorage())
1489 OS << " has_else";
1490 if (Node->isConstexpr())
1491 OS << " constexpr";
1492 if (Node->isConsteval()) {
1493 OS << " ";
1494 if (Node->isNegatedConsteval())
1495 OS << "!";
1496 OS << "consteval";
1497 }
1498}
1499
1501 if (Node->hasInitStorage())
1502 OS << " has_init";
1503 if (Node->hasVarStorage())
1504 OS << " has_var";
1505}
1506
1508 if (Node->hasVarStorage())
1509 OS << " has_var";
1510}
1511
1513 OS << " '" << Node->getName() << "'";
1514 if (Node->isSideEntry())
1515 OS << " side_entry";
1516}
1517
1519 OS << " '" << Node->getLabel()->getName() << "'";
1520 dumpPointer(Node->getLabel());
1521}
1522
1524 if (Node->caseStmtIsGNURange())
1525 OS << " gnu_range";
1526}
1527
1529 if (const VarDecl *Cand = Node->getNRVOCandidate()) {
1530 OS << " nrvo_candidate(";
1531 dumpBareDeclRef(Cand);
1532 OS << ")";
1533 }
1534}
1535
1537 if (Node->isImplicit())
1538 OS << " implicit";
1539}
1540
1542 if (Node->isImplicit())
1543 OS << " implicit";
1544}
1545
1547 const CXXExpansionStmtPattern *Node) {
1548 switch (Node->getKind()) {
1550 OS << " enumerating";
1551 return;
1553 OS << " iterating";
1554 return;
1556 OS << " destructuring";
1557 return;
1559 OS << " dependent";
1560 return;
1561 }
1562
1563 llvm_unreachable("invalid expansion statement kind");
1564}
1565
1567 const CXXExpansionStmtInstantiation *Node) {
1569 OS << " applies_lifetime_extension";
1570}
1571
1573 if (Node->hasAPValueResult())
1574 AddChild("value",
1575 [=] { Visit(Node->getAPValueResult(), Node->getType()); });
1576}
1577
1579 if (Node->usesADL())
1580 OS << " adl";
1581 if (Node->hasStoredFPFeatures())
1582 printFPOptions(Node->getFPFeatures());
1583}
1584
1586 const char *OperatorSpelling = clang::getOperatorSpelling(Node->getOperator());
1587 if (OperatorSpelling)
1588 OS << " '" << OperatorSpelling << "'";
1589
1590 VisitCallExpr(Node);
1591}
1592
1594 OS << " <";
1595 {
1596 ColorScope Color(OS, ShowColors, ASTDumpColor::Cast);
1597 OS << Node->getCastKindName();
1598 }
1599 dumpBasePath(OS, Node);
1600 OS << ">";
1601 if (Node->hasStoredFPFeatures())
1602 printFPOptions(Node->getFPFeatures());
1603}
1604
1606 VisitCastExpr(Node);
1607 if (Node->isPartOfExplicitCast())
1608 OS << " part_of_explicit_cast";
1609}
1610
1612 OS << " ";
1613 dumpBareDeclRef(Node->getDecl());
1615 if (Node->getDecl() != Node->getFoundDecl()) {
1616 OS << " (";
1618 OS << ")";
1619 }
1620 switch (Node->isNonOdrUse()) {
1621 case NOUR_None: break;
1622 case NOUR_Unevaluated: OS << " non_odr_use_unevaluated"; break;
1623 case NOUR_Constant: OS << " non_odr_use_constant"; break;
1624 case NOUR_Discarded: OS << " non_odr_use_discarded"; break;
1625 }
1627 OS << " dependent_capture";
1628 else if (Node->refersToEnclosingVariableOrCapture())
1629 OS << " refers_to_enclosing_variable_or_capture";
1630
1631 if (Node->isImmediateEscalating())
1632 OS << " immediate-escalating";
1633}
1634
1640
1642 const UnresolvedLookupExpr *Node) {
1643 OS << " (";
1644 if (!Node->requiresADL())
1645 OS << "no ";
1646 OS << "ADL) = '" << Node->getName() << '\'';
1647
1649 E = Node->decls_end();
1650 if (I == E)
1651 OS << " empty";
1652 for (; I != E; ++I)
1653 dumpPointer(*I);
1654}
1655
1657 {
1658 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
1659 OS << " " << Node->getDecl()->getDeclKindName() << "Decl";
1660 }
1661 OS << "='" << *Node->getDecl() << "'";
1662 dumpPointer(Node->getDecl());
1663 if (Node->isFreeIvar())
1664 OS << " isFreeIvar";
1665}
1666
1671
1675
1677 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
1678 OS << " " << Node->getValue();
1679}
1680
1682 bool isSigned = Node->getType()->isSignedIntegerType();
1683 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
1684 OS << " " << toString(Node->getValue(), 10, isSigned);
1685}
1686
1688 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
1689 OS << " " << Node->getValueAsString(/*Radix=*/10);
1690}
1691
1693 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
1694 OS << " " << Node->getValueAsApproximateDouble();
1695}
1696
1698 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
1699 OS << " ";
1700 Str->outputString(OS);
1701}
1702
1704 if (auto *Field = ILE->getInitializedFieldInUnion()) {
1705 OS << " field ";
1706 dumpBareDeclRef(Field);
1707 }
1708 OS << ' ' << (ILE->isExplicit() ? "explicit" : "implicit");
1709}
1710
1712 if (E->isResultDependent())
1713 OS << " result_dependent";
1714}
1715
1717 OS << " " << (Node->isPostfix() ? "postfix" : "prefix") << " '"
1718 << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1719 if (!Node->canOverflow())
1720 OS << " cannot overflow";
1721 if (Node->hasStoredFPFeatures())
1722 printFPOptions(Node->getStoredFPFeatures());
1723}
1724
1726 const UnaryExprOrTypeTraitExpr *Node) {
1727 OS << " " << getTraitSpelling(Node->getKind());
1728
1729 if (Node->isArgumentType())
1730 dumpType(Node->getArgumentType());
1731}
1732
1734 OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl();
1735 dumpPointer(Node->getMemberDecl());
1737 switch (Node->isNonOdrUse()) {
1738 case NOUR_None: break;
1739 case NOUR_Unevaluated: OS << " non_odr_use_unevaluated"; break;
1740 case NOUR_Constant: OS << " non_odr_use_constant"; break;
1741 case NOUR_Discarded: OS << " non_odr_use_discarded"; break;
1742 }
1743}
1744
1746 const ExtVectorElementExpr *Node) {
1747 OS << " " << Node->getAccessor().getNameStart();
1748}
1749
1751 OS << " " << Node->getAccessor().getNameStart();
1752}
1753
1755 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1756 if (Node->hasStoredFPFeatures())
1757 printFPOptions(Node->getStoredFPFeatures());
1758}
1759
1761 const CompoundAssignOperator *Node) {
1762 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
1763 << "' ComputeLHSTy=";
1765 OS << " ComputeResultTy=";
1767 if (Node->hasStoredFPFeatures())
1768 printFPOptions(Node->getStoredFPFeatures());
1769}
1770
1772 OS << " " << Node->getLabel()->getName();
1773 dumpPointer(Node->getLabel());
1774}
1775
1777 OS << " " << Node->getCastName() << "<"
1778 << Node->getTypeAsWritten().getAsString() << ">"
1779 << " <" << Node->getCastKindName();
1780 dumpBasePath(OS, Node);
1781 OS << ">";
1782}
1783
1785 OS << " " << (Node->getValue() ? "true" : "false");
1786}
1787
1789 if (Node->isImplicit())
1790 OS << " implicit";
1792 OS << " dependent_capture";
1793 OS << " this";
1794}
1795
1797 const CXXFunctionalCastExpr *Node) {
1798 OS << " functional cast to " << Node->getTypeAsWritten().getAsString() << " <"
1799 << Node->getCastKindName() << ">";
1800 if (Node->hasStoredFPFeatures())
1801 printFPOptions(Node->getFPFeatures());
1802}
1803
1806 if (Node->hasStoredFPFeatures())
1807 printFPOptions(Node->getFPFeatures());
1808}
1809
1811 const CXXUnresolvedConstructExpr *Node) {
1812 dumpType(Node->getTypeAsWritten());
1813 if (Node->isListInitialization())
1814 OS << " list";
1815}
1816
1818 CXXConstructorDecl *Ctor = Node->getConstructor();
1819 dumpType(Ctor->getType());
1820 if (Node->isElidable())
1821 OS << " elidable";
1822 if (Node->isListInitialization())
1823 OS << " list";
1824 if (Node->isStdInitListInitialization())
1825 OS << " std::initializer_list";
1826 if (Node->requiresZeroInitialization())
1827 OS << " zeroing";
1828 if (Node->isImmediateEscalating())
1829 OS << " immediate-escalating";
1830}
1831
1833 const CXXBindTemporaryExpr *Node) {
1834 OS << " (CXXTemporary";
1835 dumpPointer(Node);
1836 OS << ")";
1837}
1838
1840 if (Node->isGlobalNew())
1841 OS << " global";
1842 if (Node->isArray())
1843 OS << " array";
1844 if (Node->getOperatorNew()) {
1845 OS << ' ';
1847 }
1848 // We could dump the deallocation function used in case of error, but it's
1849 // usually not that interesting.
1850}
1851
1853 if (Node->isGlobalDelete())
1854 OS << " global";
1855 if (Node->isArrayForm())
1856 OS << " array";
1857 if (Node->getOperatorDelete()) {
1858 OS << ' ';
1860 }
1861}
1862
1864 OS << " " << getTraitSpelling(Node->getTrait());
1865}
1866
1868 OS << " " << getTraitSpelling(Node->getTrait());
1869}
1870
1874
1876 if (Node->hasRewrittenInit())
1877 OS << " has rewritten init";
1878}
1879
1881 if (Node->hasRewrittenInit())
1882 OS << " has rewritten init";
1883}
1884
1886 const MaterializeTemporaryExpr *Node) {
1887 if (const ValueDecl *VD = Node->getExtendingDecl()) {
1888 OS << " extended by ";
1889 dumpBareDeclRef(VD);
1890 }
1891}
1892
1894 for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i)
1895 dumpCleanupObject(Node->getObject(i));
1896}
1897
1899 dumpPointer(Node->getPack());
1900 dumpName(Node->getPack());
1901}
1902
1904 const CXXDependentScopeMemberExpr *Node) {
1905 OS << " " << (Node->isArrow() ? "->" : ".") << Node->getMember();
1906}
1907
1909 OS << " selector=";
1910 Node->getSelector().print(OS);
1911 switch (Node->getReceiverKind()) {
1913 break;
1914
1916 OS << " class=";
1918 break;
1919
1921 OS << " super (instance)";
1922 break;
1923
1925 OS << " super (class)";
1926 break;
1927 }
1928}
1929
1931 if (auto *BoxingMethod = Node->getBoxingMethod()) {
1932 OS << " selector=";
1933 BoxingMethod->getSelector().print(OS);
1934 }
1935}
1936
1938 if (!Node->getCatchParamDecl())
1939 OS << " catch all";
1940}
1941
1945
1947 OS << " ";
1948 Node->getSelector().print(OS);
1949}
1950
1952 OS << ' ' << *Node->getProtocol();
1953}
1954
1956 if (Node->isImplicitProperty()) {
1957 OS << " Kind=MethodRef Getter=\"";
1958 if (Node->getImplicitPropertyGetter())
1960 else
1961 OS << "(null)";
1962
1963 OS << "\" Setter=\"";
1964 if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
1965 Setter->getSelector().print(OS);
1966 else
1967 OS << "(null)";
1968 OS << "\"";
1969 } else {
1970 OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty()
1971 << '"';
1972 }
1973
1974 if (Node->isSuperReceiver())
1975 OS << " super";
1976
1977 OS << " Messaging=";
1978 if (Node->isMessagingGetter() && Node->isMessagingSetter())
1979 OS << "Getter&Setter";
1980 else if (Node->isMessagingGetter())
1981 OS << "Getter";
1982 else if (Node->isMessagingSetter())
1983 OS << "Setter";
1984}
1985
1987 const ObjCSubscriptRefExpr *Node) {
1988 if (Node->isArraySubscriptRefExpr())
1989 OS << " Kind=ArraySubscript GetterForArray=\"";
1990 else
1991 OS << " Kind=DictionarySubscript GetterForDictionary=\"";
1992 if (Node->getAtIndexMethodDecl())
1993 Node->getAtIndexMethodDecl()->getSelector().print(OS);
1994 else
1995 OS << "(null)";
1996
1997 if (Node->isArraySubscriptRefExpr())
1998 OS << "\" SetterForArray=\"";
1999 else
2000 OS << "\" SetterForDictionary=\"";
2001 if (Node->setAtIndexMethodDecl())
2002 Node->setAtIndexMethodDecl()->getSelector().print(OS);
2003 else
2004 OS << "(null)";
2005}
2006
2008 OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
2009}
2010
2012 OS << " ";
2013 for (unsigned I = 0, E = Node->numOfIterators(); I < E; ++I) {
2014 Visit(Node->getIteratorDecl(I));
2015 OS << " = ";
2016 const OMPIteratorExpr::IteratorRange Range = Node->getIteratorRange(I);
2017 OS << " begin ";
2018 Visit(Range.Begin);
2019 OS << " end ";
2020 Visit(Range.End);
2021 if (Range.Step) {
2022 OS << " step ";
2023 Visit(Range.Step);
2024 }
2025 }
2026}
2027
2033
2035 const RequiresExpr *Node) {
2036 if (!Node->isValueDependent())
2037 OS << (Node->isSatisfied() ? " satisfied" : " unsatisfied");
2038}
2039
2041 if (T->isSpelledAsLValue())
2042 OS << " written as lvalue reference";
2043}
2044
2046 switch (T->getSizeModifier()) {
2048 break;
2050 OS << " static";
2051 break;
2053 OS << " *";
2054 break;
2055 }
2056 OS << " " << T->getIndexTypeQualifiers().getAsString();
2057}
2058
2060 OS << " " << T->getSize();
2062}
2063
2067
2072
2075 OS << " ";
2076 dumpLocation(T->getAttributeLoc());
2077}
2078
2080 switch (T->getVectorKind()) {
2082 break;
2084 OS << " altivec";
2085 break;
2087 OS << " altivec pixel";
2088 break;
2090 OS << " altivec bool";
2091 break;
2092 case VectorKind::Neon:
2093 OS << " neon";
2094 break;
2096 OS << " neon poly";
2097 break;
2099 OS << " fixed-length sve data vector";
2100 break;
2102 OS << " fixed-length sve predicate vector";
2103 break;
2105 OS << " fixed-length rvv data vector";
2106 break;
2111 OS << " fixed-length rvv mask vector";
2112 break;
2113 }
2114 OS << " " << T->getNumElements();
2115}
2116
2118 auto EI = T->getExtInfo();
2119 if (EI.getNoReturn())
2120 OS << " noreturn";
2121 if (EI.getProducesResult())
2122 OS << " produces_result";
2123 if (EI.getHasRegParm())
2124 OS << " regparm " << EI.getRegParm();
2125 OS << " " << FunctionType::getNameForCallConv(EI.getCC());
2126}
2127
2129 auto EPI = T->getExtProtoInfo();
2130 if (EPI.HasTrailingReturn)
2131 OS << " trailing_return";
2132 if (T->isConst())
2133 OS << " const";
2134 if (T->isVolatile())
2135 OS << " volatile";
2136 if (T->isRestrict())
2137 OS << " restrict";
2138 if (T->getExtProtoInfo().Variadic)
2139 OS << " variadic";
2140 switch (EPI.RefQualifier) {
2141 case RQ_None:
2142 break;
2143 case RQ_LValue:
2144 OS << " &";
2145 break;
2146 case RQ_RValue:
2147 OS << " &&";
2148 break;
2149 }
2150
2151 switch (EPI.ExceptionSpec.Type) {
2152 case EST_None:
2153 break;
2154 case EST_DynamicNone:
2155 OS << " exceptionspec_dynamic_none";
2156 break;
2157 case EST_Dynamic:
2158 OS << " exceptionspec_dynamic";
2159 break;
2160 case EST_MSAny:
2161 OS << " exceptionspec_ms_any";
2162 break;
2163 case EST_NoThrow:
2164 OS << " exceptionspec_nothrow";
2165 break;
2166 case EST_BasicNoexcept:
2167 OS << " exceptionspec_basic_noexcept";
2168 break;
2170 OS << " exceptionspec_dependent_noexcept";
2171 break;
2172 case EST_NoexceptFalse:
2173 OS << " exceptionspec_noexcept_false";
2174 break;
2175 case EST_NoexceptTrue:
2176 OS << " exceptionspec_noexcept_true";
2177 break;
2178 case EST_Unevaluated:
2179 OS << " exceptionspec_unevaluated";
2180 break;
2181 case EST_Uninstantiated:
2182 OS << " exceptionspec_uninstantiated";
2183 break;
2184 case EST_Unparsed:
2185 OS << " exceptionspec_unparsed";
2186 break;
2187 }
2188 if (!EPI.ExceptionSpec.Exceptions.empty()) {
2189 AddChild([=] {
2190 OS << "Exceptions:";
2191 for (unsigned I = 0, N = EPI.ExceptionSpec.Exceptions.size(); I != N;
2192 ++I) {
2193 if (I)
2194 OS << ",";
2195 dumpType(EPI.ExceptionSpec.Exceptions[I]);
2196 }
2197 });
2198 }
2199 if (EPI.ExceptionSpec.NoexceptExpr) {
2200 AddChild([=] {
2201 OS << "NoexceptExpr: ";
2202 Visit(EPI.ExceptionSpec.NoexceptExpr);
2203 });
2204 }
2205 dumpDeclRef(EPI.ExceptionSpec.SourceDecl, "ExceptionSourceDecl");
2206 dumpDeclRef(EPI.ExceptionSpec.SourceTemplate, "ExceptionSourceTemplate");
2207
2208 // FIXME: Consumed parameters.
2210}
2211
2213 if (ElaboratedTypeKeyword K = T->getKeyword();
2215 OS << ' ' << TypeWithKeyword::getKeywordName(K);
2216 dumpNestedNameSpecifier(T->getQualifier());
2217 dumpDeclRef(T->getDecl());
2218}
2219
2221 if (ElaboratedTypeKeyword K = T->getKeyword();
2223 OS << ' ' << TypeWithKeyword::getKeywordName(K);
2224 dumpNestedNameSpecifier(T->getQualifier());
2225 dumpDeclRef(T->getDecl());
2226 dumpType(T->desugar());
2227}
2228
2230 if (ElaboratedTypeKeyword K = T->getKeyword();
2232 OS << ' ' << TypeWithKeyword::getKeywordName(K);
2233 dumpNestedNameSpecifier(T->getQualifier());
2234 dumpDeclRef(T->getDecl());
2235 if (!T->typeMatchesDecl()) {
2236 OS << " divergent";
2237 dumpType(T->desugar());
2238 }
2239}
2240
2241void TextNodeDumper::VisitUnaryTransformType(const UnaryTransformType *T) {
2242 switch (T->getUTTKind()) {
2243#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
2244 case UnaryTransformType::Enum: \
2245 OS << " " #Trait; \
2246 break;
2247#include "clang/Basic/Traits.inc"
2248 }
2249}
2250
2251void TextNodeDumper::VisitTagType(const TagType *T) {
2252 if (T->isCanonicalUnqualified())
2253 OS << " canonical";
2254 if (T->isTagOwned())
2255 OS << " owns_tag";
2256 if (T->isInjected())
2257 OS << " injected";
2258 if (ElaboratedTypeKeyword K = T->getKeyword();
2260 OS << ' ' << TypeWithKeyword::getKeywordName(K);
2261 dumpNestedNameSpecifier(T->getQualifier());
2262 dumpDeclRef(T->getDecl());
2263}
2264
2265void TextNodeDumper::VisitTemplateTypeParmType(const TemplateTypeParmType *T) {
2266 OS << " depth " << T->getDepth() << " index " << T->getIndex();
2267 if (T->isParameterPack())
2268 OS << " pack";
2269 dumpDeclRef(T->getDecl());
2270}
2271
2273 const SubstTemplateTypeParmType *T) {
2274 dumpDeclRef(T->getAssociatedDecl());
2275 VisitTemplateTypeParmDecl(T->getReplacedParameter());
2276 if (auto PackIndex = T->getPackIndex())
2277 OS << " pack_index " << *PackIndex;
2278 if (T->getFinal())
2279 OS << " final";
2280}
2281
2283 const SubstTemplateTypeParmPackType *T) {
2284 dumpDeclRef(T->getAssociatedDecl());
2285 VisitTemplateTypeParmDecl(T->getReplacedParameter());
2286}
2287
2288void TextNodeDumper::VisitDeducedType(const DeducedType *T) {
2289 switch (T->getDeducedKind()) {
2291 OS << " undeduced";
2292 break;
2294 break;
2296 OS << " deduced-as-dependent";
2297 break;
2299 OS << " deduced-as-pack";
2300 break;
2301 }
2302}
2303
2304void TextNodeDumper::VisitAutoType(const AutoType *T) {
2306 // Not necessary to dump the keyword since it's spelled plainly in the printed
2307 // type anyway.
2308 if (T->isConstrained())
2309 dumpDeclRef(T->getTypeConstraintConcept());
2310}
2311
2313 const DeducedTemplateSpecializationType *T) {
2315 dumpTemplateName(T->getTemplateName(), "name");
2316}
2317
2319 const TemplateSpecializationType *T) {
2320 if (T->isTypeAlias())
2321 OS << " alias";
2322 if (ElaboratedTypeKeyword K = T->getKeyword();
2324 OS << ' ' << TypeWithKeyword::getKeywordName(K);
2325 dumpTemplateName(T->getTemplateName(), "name");
2326}
2327
2329 const InjectedClassNameType *T) {
2330 dumpDeclRef(T->getDecl());
2331}
2332
2336
2337void TextNodeDumper::VisitPackExpansionType(const PackExpansionType *T) {
2338 if (auto N = T->getNumExpansions())
2339 OS << " expansions " << *N;
2340}
2341
2343 // By default, add extra Type details with no extra loc info.
2345}
2346// FIXME: override behavior for TypeLocs that have interesting location
2347// information, such as the qualifier in ElaboratedTypeLoc.
2348
2350
2352 dumpName(D);
2354 if (D->isModulePrivate())
2355 OS << " __module_private__";
2356
2357 const TagDecl *TD = D->getUnderlyingType()->getAsTagDecl();
2358 if (TD && TD->getTypedefNameForAnonDecl()) {
2360 }
2361}
2362
2364 if (D->isScoped()) {
2365 if (D->isScopedUsingClassTag())
2366 OS << " class";
2367 else
2368 OS << " struct";
2369 }
2370 dumpName(D);
2371 if (D->isModulePrivate())
2372 OS << " __module_private__";
2373 if (D->isFixed())
2375
2376 if (const auto *Instance = D->getTemplateInstantiationPattern()) {
2377 OS << " instantiated_from";
2378 dumpPointer(Instance);
2379 }
2380
2382}
2383
2385 OS << ' ' << D->getKindName();
2386 dumpName(D);
2387 if (D->isModulePrivate())
2388 OS << " __module_private__";
2389 if (D->isCompleteDefinition())
2390 OS << " definition";
2391
2392 if (!D->isImplicit() && !D->getDescribedTemplate()) {
2394 }
2395}
2396
2401
2403 dumpName(D);
2404 dumpType(D->getType());
2405
2406 for (const auto *Child : D->chain())
2407 dumpDeclRef(Child);
2408}
2409
2411 dumpName(D);
2412 dumpType(D->getType());
2414
2415 StorageClass SC = D->getStorageClass();
2416 if (SC != SC_None)
2418 if (D->isInlineSpecified())
2419 OS << " inline";
2420 if (D->isVirtualAsWritten())
2421 OS << " virtual";
2422 if (D->isModulePrivate())
2423 OS << " __module_private__";
2424
2425 if (D->isPureVirtual())
2426 OS << " pure";
2427 if (D->isDefaulted()) {
2428 OS << " default";
2429 if (D->isDeleted())
2430 OS << "_delete";
2431 }
2432 if (D->isDeletedAsWritten())
2433 OS << " delete";
2434 if (D->isTrivial())
2435 OS << " trivial";
2436
2437 if (const StringLiteral *M = D->getDeletedMessage())
2438 AddChild("delete message", [=] { Visit(M); });
2439
2441 OS << (isa<CXXDestructorDecl>(D) ? " not_selected" : " ineligible");
2442
2443 if (const auto *FPT = D->getType()->getAs<FunctionProtoType>()) {
2444 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
2445 switch (EPI.ExceptionSpec.Type) {
2446 default:
2447 break;
2448 case EST_Unevaluated:
2449 OS << " noexcept-unevaluated " << EPI.ExceptionSpec.SourceDecl;
2450 break;
2451 case EST_Uninstantiated:
2452 OS << " noexcept-uninstantiated " << EPI.ExceptionSpec.SourceTemplate;
2453 break;
2454 }
2455 }
2456
2457 if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
2458 if (MD->size_overridden_methods() != 0) {
2459 auto dumpOverride = [=](const CXXMethodDecl *D) {
2460 SplitQualType T_split = D->getType().split();
2461 OS << D << " " << D->getParent()->getName() << "::" << D->getDeclName()
2462 << " '" << QualType::getAsString(T_split, PrintPolicy) << "'";
2463 };
2464
2465 AddChild([=] {
2466 auto Overrides = MD->overridden_methods();
2467 OS << "Overrides: [ ";
2468 dumpOverride(*Overrides.begin());
2469 for (const auto *Override : llvm::drop_begin(Overrides)) {
2470 OS << ", ";
2471 dumpOverride(Override);
2472 }
2473 OS << " ]";
2474 });
2475 }
2476 }
2477
2478 if (!D->isInlineSpecified() && D->isInlined()) {
2479 OS << " implicit-inline";
2480 }
2481 // Since NumParams comes from the FunctionProtoType of the FunctionDecl and
2482 // the Params are set later, it is possible for a dump during debugging to
2483 // encounter a FunctionDecl that has been created but hasn't been assigned
2484 // ParmVarDecls yet.
2485 if (!D->param_empty() && !D->param_begin())
2486 OS << " <<<NULL params x " << D->getNumParams() << ">>>";
2487
2488 if (const auto *Instance = D->getTemplateInstantiationPattern()) {
2489 OS << " instantiated_from";
2490 dumpPointer(Instance);
2491 }
2492
2495 }
2496}
2497
2499 const CXXDeductionGuideDecl *D) {
2501 switch (D->getDeductionCandidateKind()) {
2504 return;
2506 OS << " aggregate ";
2507 break;
2508 }
2509}
2510
2513 OS << " extended by ";
2515 OS << " mangling ";
2516 {
2517 ColorScope Color(OS, ShowColors, ASTDumpColor::Value);
2518 OS << D->getManglingNumber();
2519 }
2520}
2521
2523 dumpName(D);
2524 dumpType(D->getType());
2525 if (D->isMutable())
2526 OS << " mutable";
2527 if (D->isModulePrivate())
2528 OS << " __module_private__";
2529}
2530
2533 dumpName(D);
2534 if (const auto *P = dyn_cast<ParmVarDecl>(D);
2535 P && P->isExplicitObjectParameter())
2536 OS << " this";
2537
2538 dumpType(D->getType());
2540 StorageClass SC = D->getStorageClass();
2541 if (SC != SC_None)
2543 switch (D->getTLSKind()) {
2544 case VarDecl::TLS_None:
2545 break;
2547 OS << " tls";
2548 break;
2550 OS << " tls_dynamic";
2551 break;
2552 }
2553 if (D->isModulePrivate())
2554 OS << " __module_private__";
2555 if (D->isNRVOVariable())
2556 OS << " nrvo";
2557 if (D->isInline())
2558 OS << " inline";
2559 if (D->isConstexpr())
2560 OS << " constexpr";
2561 if (D->hasInit()) {
2562 switch (D->getInitStyle()) {
2563 case VarDecl::CInit:
2564 OS << " cinit";
2565 break;
2566 case VarDecl::CallInit:
2567 OS << " callinit";
2568 break;
2569 case VarDecl::ListInit:
2570 OS << " listinit";
2571 break;
2573 OS << " parenlistinit";
2574 }
2575 }
2576 if (D->needsDestruction(D->getASTContext()))
2577 OS << " destroyed";
2578 if (D->isParameterPack())
2579 OS << " pack";
2580
2581 if (const auto *Instance = D->getTemplateInstantiationPattern()) {
2582 OS << " instantiated_from";
2583 dumpPointer(Instance);
2584 }
2585
2586 if (D->hasInit()) {
2587 const Expr *E = D->getInit();
2588 // Only dump the value of constexpr VarDecls for now.
2589 if (E && !E->isValueDependent() && D->isConstexpr() &&
2590 !D->getType()->isDependentType()) {
2591 const APValue *Value = D->evaluateValue();
2592 if (Value)
2593 AddChild("value", [=] { Visit(*Value, E->getType()); });
2594 }
2595 }
2596
2597 if (!D->getDescribedVarTemplate()) {
2599 }
2600}
2601
2603 dumpName(D);
2604 dumpType(D->getType());
2605}
2606
2608 if (D->isNothrow())
2609 OS << " nothrow";
2610}
2611
2613 OS << ' ' << D->getImportedModule()->getFullModuleName();
2614
2615 for (Decl *InitD :
2617 dumpDeclRef(InitD, "initializer");
2618}
2619
2621 OS << ' ';
2622 switch (D->getCommentKind()) {
2623 case PCK_Unknown:
2624 llvm_unreachable("unexpected pragma comment kind");
2625 case PCK_Compiler:
2626 OS << "compiler";
2627 break;
2628 case PCK_ExeStr:
2629 OS << "exestr";
2630 break;
2631 case PCK_Lib:
2632 OS << "lib";
2633 break;
2634 case PCK_Linker:
2635 OS << "linker";
2636 break;
2637 case PCK_User:
2638 OS << "user";
2639 break;
2640 case PCK_Copyright:
2641 OS << "copyright";
2642 break;
2643 }
2644 StringRef Arg = D->getArg();
2645 if (!Arg.empty())
2646 OS << " \"" << Arg << "\"";
2647}
2648
2650 const PragmaDetectMismatchDecl *D) {
2651 OS << " \"" << D->getName() << "\" \"" << D->getValue() << "\"";
2652}
2653
2655 const OMPExecutableDirective *D) {
2656 if (D->isStandaloneDirective())
2657 OS << " openmp_standalone_directive";
2658}
2659
2661 const OMPDeclareReductionDecl *D) {
2662 dumpName(D);
2663 dumpType(D->getType());
2664 OS << " combiner";
2666 if (const auto *Initializer = D->getInitializer()) {
2667 OS << " initializer";
2669 switch (D->getInitializerKind()) {
2671 OS << " omp_priv = ";
2672 break;
2674 OS << " omp_priv ()";
2675 break;
2677 break;
2678 }
2679 }
2680}
2681
2683 for (const auto *C : D->clauselists()) {
2684 AddChild([=] {
2685 if (!C) {
2686 ColorScope Color(OS, ShowColors, ASTDumpColor::Null);
2687 OS << "<<<NULL>>> OMPClause";
2688 return;
2689 }
2690 {
2691 ColorScope Color(OS, ShowColors, ASTDumpColor::Attr);
2692 StringRef ClauseName(
2693 llvm::omp::getOpenMPClauseName(C->getClauseKind()));
2694 OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
2695 << ClauseName.drop_front() << "Clause";
2696 }
2697 dumpPointer(C);
2698 dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
2699 });
2700 }
2701}
2702
2707
2709 dumpName(D);
2710 if (D->isInline())
2711 OS << " inline";
2712 if (D->isNested())
2713 OS << " nested";
2714 if (!D->isFirstDecl())
2715 dumpDeclRef(D->getFirstDecl(), "original");
2716
2718}
2719
2724
2729
2731 dumpName(D);
2733
2734 const TagDecl *TD = D->getUnderlyingType()->getAsTagDecl();
2735 if (TD && TD->getTypedefNameForAnonDecl()) {
2737 }
2738}
2739
2745
2747 VisitRecordDecl(D);
2748 if (const auto *Instance = D->getTemplateInstantiationPattern()) {
2749 OS << " instantiated_from";
2750 dumpPointer(Instance);
2751 }
2752 if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
2753 dumpTemplateSpecializationKind(CTSD->getSpecializationKind());
2754 if (CTSD->hasStrictPackMatch())
2755 OS << " strict-pack-match";
2756 }
2757
2759
2760 if (!D->isCompleteDefinition())
2761 return;
2762
2763 AddChild([=] {
2764 {
2765 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2766 OS << "DefinitionData";
2767 }
2768#define FLAG(fn, name) \
2769 if (D->fn()) \
2770 OS << " " #name;
2771 FLAG(isParsingBaseSpecifiers, parsing_base_specifiers);
2772
2773 FLAG(isGenericLambda, generic);
2774 FLAG(isLambda, lambda);
2775
2776 FLAG(isAnonymousStructOrUnion, is_anonymous);
2777 FLAG(canPassInRegisters, pass_in_registers);
2778 FLAG(isEmpty, empty);
2779 FLAG(isAggregate, aggregate);
2780 FLAG(isStandardLayout, standard_layout);
2781 FLAG(isTriviallyCopyable, trivially_copyable);
2782 FLAG(isPOD, pod);
2783 FLAG(isTrivial, trivial);
2784 FLAG(isPolymorphic, polymorphic);
2785 FLAG(isAbstract, abstract);
2786 FLAG(isLiteral, literal);
2787
2788 FLAG(hasUserDeclaredConstructor, has_user_declared_ctor);
2789 FLAG(hasConstexprNonCopyMoveConstructor, has_constexpr_non_copy_move_ctor);
2790 FLAG(hasMutableFields, has_mutable_fields);
2791 FLAG(hasVariantMembers, has_variant_members);
2792 FLAG(allowConstDefaultInit, can_const_default_init);
2793
2794 AddChild([=] {
2795 {
2796 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2797 OS << "DefaultConstructor";
2798 }
2799 FLAG(hasDefaultConstructor, exists);
2800 FLAG(hasTrivialDefaultConstructor, trivial);
2801 FLAG(hasNonTrivialDefaultConstructor, non_trivial);
2802 FLAG(hasUserProvidedDefaultConstructor, user_provided);
2803 FLAG(hasConstexprDefaultConstructor, constexpr);
2804 FLAG(needsImplicitDefaultConstructor, needs_implicit);
2805 FLAG(defaultedDefaultConstructorIsConstexpr, defaulted_is_constexpr);
2806 });
2807
2808 AddChild([=] {
2809 {
2810 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2811 OS << "CopyConstructor";
2812 }
2813 FLAG(hasSimpleCopyConstructor, simple);
2814 FLAG(hasTrivialCopyConstructor, trivial);
2815 FLAG(hasNonTrivialCopyConstructor, non_trivial);
2816 FLAG(hasUserDeclaredCopyConstructor, user_declared);
2817 FLAG(hasCopyConstructorWithConstParam, has_const_param);
2818 FLAG(needsImplicitCopyConstructor, needs_implicit);
2819 FLAG(needsOverloadResolutionForCopyConstructor,
2820 needs_overload_resolution);
2822 FLAG(defaultedCopyConstructorIsDeleted, defaulted_is_deleted);
2823 FLAG(implicitCopyConstructorHasConstParam, implicit_has_const_param);
2824 });
2825
2826 AddChild([=] {
2827 {
2828 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2829 OS << "MoveConstructor";
2830 }
2831 FLAG(hasMoveConstructor, exists);
2832 FLAG(hasSimpleMoveConstructor, simple);
2833 FLAG(hasTrivialMoveConstructor, trivial);
2834 FLAG(hasNonTrivialMoveConstructor, non_trivial);
2835 FLAG(hasUserDeclaredMoveConstructor, user_declared);
2836 FLAG(needsImplicitMoveConstructor, needs_implicit);
2837 FLAG(needsOverloadResolutionForMoveConstructor,
2838 needs_overload_resolution);
2840 FLAG(defaultedMoveConstructorIsDeleted, defaulted_is_deleted);
2841 });
2842
2843 AddChild([=] {
2844 {
2845 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2846 OS << "CopyAssignment";
2847 }
2848 FLAG(hasSimpleCopyAssignment, simple);
2849 FLAG(hasTrivialCopyAssignment, trivial);
2850 FLAG(hasNonTrivialCopyAssignment, non_trivial);
2851 FLAG(hasCopyAssignmentWithConstParam, has_const_param);
2852 FLAG(hasUserDeclaredCopyAssignment, user_declared);
2853 FLAG(needsImplicitCopyAssignment, needs_implicit);
2854 FLAG(needsOverloadResolutionForCopyAssignment, needs_overload_resolution);
2855 FLAG(implicitCopyAssignmentHasConstParam, implicit_has_const_param);
2856 });
2857
2858 AddChild([=] {
2859 {
2860 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2861 OS << "MoveAssignment";
2862 }
2863 FLAG(hasMoveAssignment, exists);
2864 FLAG(hasSimpleMoveAssignment, simple);
2865 FLAG(hasTrivialMoveAssignment, trivial);
2866 FLAG(hasNonTrivialMoveAssignment, non_trivial);
2867 FLAG(hasUserDeclaredMoveAssignment, user_declared);
2868 FLAG(needsImplicitMoveAssignment, needs_implicit);
2869 FLAG(needsOverloadResolutionForMoveAssignment, needs_overload_resolution);
2870 });
2871
2872 AddChild([=] {
2873 {
2874 ColorScope Color(OS, ShowColors, ASTDumpColor::DeclKindName);
2875 OS << "Destructor";
2876 }
2877 FLAG(hasSimpleDestructor, simple);
2878 FLAG(hasIrrelevantDestructor, irrelevant);
2879 FLAG(hasTrivialDestructor, trivial);
2880 FLAG(hasNonTrivialDestructor, non_trivial);
2881 FLAG(hasUserDeclaredDestructor, user_declared);
2882 FLAG(hasConstexprDestructor, constexpr);
2883 FLAG(needsImplicitDestructor, needs_implicit);
2884 FLAG(needsOverloadResolutionForDestructor, needs_overload_resolution);
2886 FLAG(defaultedDestructorIsDeleted, defaulted_is_deleted);
2887 });
2888 });
2889
2890 for (const auto &I : D->bases()) {
2891 AddChild([=] {
2892 if (I.isVirtual())
2893 OS << "virtual ";
2894 dumpAccessSpecifier(I.getAccessSpecifier());
2895 dumpType(I.getType());
2896 if (I.isPackExpansion())
2897 OS << "...";
2898 });
2899 }
2900}
2901
2906
2911
2916
2920
2922 if (const auto *TC = D->getTypeConstraint()) {
2923 OS << " ";
2924 dumpBareDeclRef(TC->getNamedConcept());
2925 if (TC->getNamedConcept() != TC->getFoundDecl()) {
2926 OS << " (";
2927 dumpBareDeclRef(TC->getFoundDecl());
2928 OS << ")";
2929 }
2930 } else if (D->wasDeclaredWithTypename())
2931 OS << " typename";
2932 else
2933 OS << " class";
2934 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2935 if (D->isParameterPack())
2936 OS << " ...";
2937 dumpName(D);
2938}
2939
2941 const NonTypeTemplateParmDecl *D) {
2942 dumpType(D->getType());
2943 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2944 if (D->isParameterPack())
2945 OS << " ...";
2946 dumpName(D);
2947}
2948
2950 const TemplateTemplateParmDecl *D) {
2951 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2952 if (D->isParameterPack())
2953 OS << " ...";
2954 dumpName(D);
2955}
2956
2958 OS << ' ';
2960 OS << D->getDeclName();
2962}
2963
2965 OS << ' ';
2967}
2968
2970 const UnresolvedUsingTypenameDecl *D) {
2971 OS << ' ';
2973 OS << D->getDeclName();
2974}
2975
2977 const UnresolvedUsingValueDecl *D) {
2978 OS << ' ';
2980 OS << D->getDeclName();
2981 dumpType(D->getType());
2982}
2983
2988
2990 const ConstructorUsingShadowDecl *D) {
2991 if (D->constructsVirtualBase())
2992 OS << " virtual";
2993
2994 AddChild([=] {
2995 OS << "target ";
2997 });
2998
2999 AddChild([=] {
3000 OS << "nominated ";
3002 OS << ' ';
3004 });
3005
3006 AddChild([=] {
3007 OS << "constructed ";
3009 OS << ' ';
3011 });
3012}
3013
3015 switch (D->getLanguage()) {
3017 OS << " C";
3018 break;
3020 OS << " C++";
3021 break;
3022 }
3023}
3024
3026 OS << ' ';
3028}
3029
3031 const ExplicitInstantiationDecl *D) {
3033 if (D->isExternTemplate())
3034 OS << " extern";
3035 if (D->getQualifierLoc())
3037 if (const NamedDecl *Spec = D->getSpecialization()) {
3038 OS << " '" << Spec->getDeclName() << "'";
3039 dumpDeclRef(Spec);
3040 }
3041}
3042
3044 if (TypeSourceInfo *T = D->getFriendType())
3045 dumpType(T->getType());
3046 if (D->isPackExpansion())
3047 OS << "...";
3048}
3049
3051 dumpName(D);
3052 dumpType(D->getType());
3053 if (D->getSynthesize())
3054 OS << " synthesize";
3055
3056 switch (D->getAccessControl()) {
3057 case ObjCIvarDecl::None:
3058 OS << " none";
3059 break;
3061 OS << " private";
3062 break;
3064 OS << " protected";
3065 break;
3067 OS << " public";
3068 break;
3070 OS << " package";
3071 break;
3072 }
3073}
3074
3076 if (D->isInstanceMethod())
3077 OS << " -";
3078 else
3079 OS << " +";
3080 dumpName(D);
3081 dumpType(D->getReturnType());
3082
3083 if (D->isVariadic())
3084 OS << " variadic";
3085}
3086
3088 dumpName(D);
3089 switch (D->getVariance()) {
3091 break;
3092
3094 OS << " covariant";
3095 break;
3096
3098 OS << " contravariant";
3099 break;
3100 }
3101
3102 if (D->hasExplicitBound())
3103 OS << " bounded";
3105}
3106
3108 dumpName(D);
3111 for (const auto *P : D->protocols())
3112 dumpDeclRef(P);
3113}
3114
3120
3122 dumpName(D);
3123
3124 for (const auto *Child : D->protocols())
3125 dumpDeclRef(Child);
3126}
3127
3129 dumpName(D);
3130 dumpDeclRef(D->getSuperClass(), "super");
3131
3133 for (const auto *Child : D->protocols())
3134 dumpDeclRef(Child);
3135}
3136
3143
3149
3151 dumpName(D);
3152 dumpType(D->getType());
3153
3155 OS << " required";
3157 OS << " optional";
3158
3162 OS << " readonly";
3164 OS << " assign";
3166 OS << " readwrite";
3168 OS << " retain";
3170 OS << " copy";
3172 OS << " nonatomic";
3174 OS << " atomic";
3176 OS << " weak";
3178 OS << " strong";
3180 OS << " unsafe_unretained";
3182 OS << " class";
3184 OS << " direct";
3186 dumpDeclRef(D->getGetterMethodDecl(), "getter");
3188 dumpDeclRef(D->getSetterMethodDecl(), "setter");
3189 }
3190}
3191
3195 OS << " synthesize";
3196 else
3197 OS << " dynamic";
3200}
3201
3203 if (D->isVariadic())
3204 OS << " variadic";
3205
3206 if (D->capturesCXXThis())
3207 OS << " captures_this";
3208}
3209
3214
3216 VisitStmt(S);
3217 if (S->hasStoredFPFeatures())
3218 printFPOptions(S->getStoredFPFeatures());
3219}
3220
3222 if (D->isCBuffer())
3223 OS << " cbuffer";
3224 else
3225 OS << " tbuffer";
3226 dumpName(D);
3227}
3228
3230 const HLSLRootSignatureDecl *D) {
3231 dumpName(D);
3232 OS << " version: ";
3233 switch (D->getVersion()) {
3234 case llvm::dxbc::RootSignatureVersion::V1_0:
3235 OS << "1.0";
3236 break;
3237 case llvm::dxbc::RootSignatureVersion::V1_1:
3238 OS << "1.1";
3239 break;
3240 case llvm::dxbc::RootSignatureVersion::V1_2:
3241 OS << "1.2";
3242 break;
3243 }
3244 OS << ", ";
3245 llvm::hlsl::rootsig::dumpRootElements(OS, D->getRootElements());
3246}
3247
3249 OS << (E->isInOut() ? " inout" : " out");
3250}
3251
3256 if (S->isOrphanedLoopConstruct())
3257 OS << " <orphan>";
3258 else
3259 OS << " parent: " << S->getParentComputeConstructKind();
3260}
3261
3266
3270
3275
3280
3285
3290 const OpenACCCacheConstruct *S) {
3292 if (S->hasReadOnly())
3293 OS <<" readonly";
3294}
3309
3315
3317 OS << " " << D->getDirectiveKind();
3318
3319 for (const OpenACCClause *C : D->clauses())
3320 AddChild([=] {
3321 Visit(C);
3322 for (const Stmt *S : C->children())
3323 AddChild([=] { Visit(S); });
3324 });
3325}
3327 OS << " " << D->getDirectiveKind();
3328
3330
3331 AddChild([=] { Visit(D->getFunctionReference()); });
3332
3333 for (const OpenACCClause *C : D->clauses())
3334 AddChild([=] {
3335 Visit(C);
3336 for (const Stmt *S : C->children())
3337 AddChild([=] { Visit(S); });
3338 });
3339}
3340
3342 const OpenACCRoutineDeclAttr *A) {
3343 for (const OpenACCClause *C : A->Clauses)
3344 AddChild([=] {
3345 Visit(C);
3346 for (const Stmt *S : C->children())
3347 AddChild([=] { Visit(S); });
3348 });
3349}
3350
3352 AddChild("begin", [=] { OS << S->getStartingElementPos(); });
3353 AddChild("number of elements", [=] { OS << S->getDataElementCount(); });
3354}
3355
3357 OS << ' ' << AE->getOpAsString();
3358}
3359
3361 VisitStmt(S);
3362 if (S->hasStoredFPFeatures())
3363 printFPOptions(S->getStoredFPFeatures());
3364}
static double GetApproxValue(const llvm::APFloat &F)
Definition APValue.cpp:640
#define V(N, I)
Defines enumerations for traits support.
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.
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
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.
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:223
ArrayRef< Decl * > getModuleInitializers(Module *M)
Get the initializations to perform when importing a module, if any.
const clang::PrintingPolicy & getPrintingPolicy() const
Definition ASTContext.h:861
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:4556
LabelDecl * getLabel() const
Definition Expr.h:4579
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
Definition ExprCXX.h:2999
ArrayTypeTrait getTrait() const
Definition ExprCXX.h:3039
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3821
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Definition Expr.h:6940
StringRef getOpAsString() const
Definition Expr.h:7004
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:4044
StringRef getOpcodeStr() const
Definition Expr.h:4110
bool hasStoredFPFeatures() const
Definition Expr.h:4229
FPOptionsOverride getStoredFPFeatures() const
Get FPFeatures from trailing storage.
Definition Expr.h:4241
Opcode getOpcode() const
Definition Expr.h:4089
A binding in a decomposition declaration.
Definition DeclCXX.h:4206
A class which contains all the information about a particular captured value.
Definition Decl.h:4722
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition Decl.h:4716
bool capturesCXXThis() const
Definition Decl.h:4848
bool isVariadic() const
Definition Decl.h:4791
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:1496
A boolean literal, per ([C++ lex.bool] Boolean literals).
Definition ExprCXX.h:726
bool getValue() const
Definition ExprCXX.h:743
Represents a call to a C++ constructor.
Definition ExprCXX.h:1551
bool isElidable() const
Whether this construction is elidable.
Definition ExprCXX.h:1620
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
Definition ExprCXX.h:1644
bool isImmediateEscalating() const
Definition ExprCXX.h:1709
bool requiresZeroInitialization() const
Whether this construction first requires zero-initialization before the initializer is called.
Definition ExprCXX.h:1653
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Definition ExprCXX.h:1614
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
Definition ExprCXX.h:1633
Represents a C++ constructor within a class.
Definition DeclCXX.h:2633
Represents a C++ base or member initializer.
Definition DeclCXX.h:2398
Represents a C++ deduction guide declaration.
Definition DeclCXX.h:1996
DeductionCandidate getDeductionCandidateKind() const
Definition DeclCXX.h:2091
A default argument (C++ [dcl.fct.default]).
Definition ExprCXX.h:1273
bool hasRewrittenInit() const
Definition ExprCXX.h:1318
A use of a default initializer in a constructor or in aggregate initialization.
Definition ExprCXX.h:1380
bool hasRewrittenInit() const
Definition ExprCXX.h:1409
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2629
FunctionDecl * getOperatorDelete() const
Definition ExprCXX.h:2668
bool isArrayForm() const
Definition ExprCXX.h:2655
bool isGlobalDelete() const
Definition ExprCXX.h:2654
Represents a C++ member access expression where the actual member referenced could not be resolved be...
Definition ExprCXX.h:3869
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Definition ExprCXX.h:3968
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
Definition ExprCXX.h:4007
Represents the code generated for an expanded expansion statement.
Definition StmtCXX.h:1028
bool shouldApplyLifetimeExtensionToPreamble() const
Definition StmtCXX.h:1077
CXXExpansionStmtPattern - Represents an unexpanded C++ expansion statement.
Definition StmtCXX.h:675
ExpansionStmtKind getKind() const
Definition StmtCXX.h:774
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Definition ExprCXX.h:1834
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2145
Abstract class common to all of the C++ "named"/"keyword" casts.
Definition ExprCXX.h:378
const char * getCastName() const
getCastName - Get the name of the C++ cast being used, e.g., "static_cast", "dynamic_cast",...
Definition ExprCXX.cpp:775
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition ExprCXX.h:2358
bool isArray() const
Definition ExprCXX.h:2467
FunctionDecl * getOperatorNew() const
Definition ExprCXX.h:2462
bool isGlobalNew() const
Definition ExprCXX.h:2524
A call to an overloaded operator written using operator syntax.
Definition ExprCXX.h:84
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
Definition ExprCXX.h:114
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:2087
bool needsOverloadResolutionForMoveConstructor() const
Determine whether we need to eagerly declare a defaulted move constructor for this class.
Definition DeclCXX.h:905
bool needsOverloadResolutionForDestructor() const
Determine whether we need to eagerly declare a destructor for this class.
Definition DeclCXX.h:1018
bool needsOverloadResolutionForCopyConstructor() const
Determine whether we need to eagerly declare a defaulted copy constructor for this class.
Definition DeclCXX.h:807
A C++ static_cast expression (C++ [expr.static.cast]).
Definition ExprCXX.h:439
Represents the this expression in C++.
Definition ExprCXX.h:1157
bool isCapturedByCopyInLambdaWithExplicitObjectParameter() const
Definition ExprCXX.h:1183
bool isImplicit() const
Definition ExprCXX.h:1180
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
Definition ExprCXX.h:3743
bool isListInitialization() const
Determine whether this expression models list-initialization.
Definition ExprCXX.h:3798
QualType getTypeAsWritten() const
Retrieve the type that is being constructed, as specified in the source code.
Definition ExprCXX.h:3777
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2949
bool hasStoredFPFeatures() const
Definition Expr.h:3108
bool usesADL() const
Definition Expr.h:3106
FPOptionsOverride getFPFeatures() const
Definition Expr.h:3248
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition Decl.h:4988
bool isNothrow() const
Definition Decl.cpp:5706
CaseStmt - Represent a case statement.
Definition Stmt.h:1929
bool caseStmtIsGNURange() const
True if this case statement is of the form case LHS ... RHS, which is a GNU extension.
Definition Stmt.h:1992
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3682
path_iterator path_begin()
Definition Expr.h:3752
bool hasStoredFPFeatures() const
Definition Expr.h:3781
static const char * getCastKindName(CastKind CK)
Definition Expr.cpp:1959
path_iterator path_end()
Definition Expr.h:3753
const CXXBaseSpecifier *const * path_const_iterator
Definition Expr.h:3749
bool path_empty() const
Definition Expr.h:3750
FPOptionsOverride getFPFeatures() const
Definition Expr.h:3802
unsigned getValue() const
Definition Expr.h:1635
Declaration of a class template.
Represents a 'co_await' expression.
Definition ExprCXX.h:5368
bool isImplicit() const
Definition ExprCXX.h:5390
CompoundAssignOperator - For compound assignments (e.g.
Definition Expr.h:4306
QualType getComputationLHSType() const
Definition Expr.h:4340
QualType getComputationResultType() const
Definition Expr.h:4343
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition Stmt.h:1749
FPOptionsOverride getStoredFPFeatures() const
Get FPOptionsOverride from trailing storage.
Definition Stmt.h:1799
bool hasStoredFPFeatures() const
Definition Stmt.h:1796
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
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:3859
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Definition Expr.h:1088
APValue getAPValueResult() const
Definition Expr.cpp:419
bool hasAPValueResult() const
Definition Expr.h:1163
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition DeclCXX.h:3698
CXXRecordDecl * getConstructedBaseClass() const
Get the base class whose constructor or constructor shadow declaration is passed the constructor argu...
Definition DeclCXX.h:3789
bool constructsVirtualBase() const
Returns true if the constructed base class is a virtual base class subobject of this declaration's cl...
Definition DeclCXX.h:3798
ConstructorUsingShadowDecl * getConstructedBaseClassShadowDecl() const
Get the inheriting constructor declaration for the base class for which we don't have an explicit ini...
Definition DeclCXX.h:3779
ConstructorUsingShadowDecl * getNominatedBaseClassShadowDecl() const
Get the inheriting constructor declaration for the direct base class from which this using shadow dec...
Definition DeclCXX.h:3773
CXXRecordDecl * getNominatedBaseClass() const
Get the base class that was named in the using declaration.
Definition DeclCXX.cpp:3510
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
Definition Expr.h:4725
FPOptionsOverride getStoredFPFeatures() const
Get FPFeatures from trailing storage.
Definition Expr.h:4788
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
Definition Expr.h:4783
Represents a 'co_return' statement in the C++ Coroutines TS.
Definition StmtCXX.h:474
bool isImplicit() const
Definition StmtCXX.h:507
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2126
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1276
NamedDecl * getFoundDecl()
Get the NamedDecl through which this reference occurred.
Definition Expr.h:1387
NestedNameSpecifier getQualifier() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name.
Definition Expr.h:1377
bool refersToEnclosingVariableOrCapture() const
Does this DeclRefExpr refer to an enclosing local or a captured variable?
Definition Expr.h:1480
bool isCapturedByCopyInLambdaWithExplicitObjectParameter() const
Definition Expr.h:1492
ValueDecl * getDecl()
Definition Expr.h:1344
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
Definition Expr.h:1474
bool isImmediateEscalating() const
Definition Expr.h:1484
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
Definition DeclBase.cpp:285
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition DeclBase.h:1243
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:550
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:601
@ FOK_Undeclared
A friend of a previously-undeclared entity.
Definition DeclBase.h:1236
@ FOK_None
Not a friend object.
Definition DeclBase.h:1234
@ FOK_Declared
A friend of a previously-declared entity.
Definition DeclBase.h:1235
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition DeclBase.h:854
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition DeclBase.h:805
bool isInvalidDecl() const
Definition DeclBase.h:596
SourceLocation getLocation() const
Definition DeclBase.h:447
const char * getDeclKindName() const
Definition DeclBase.cpp:169
bool isThisDeclarationReferenced() const
Whether this declaration was referenced.
Definition DeclBase.h:629
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition DeclBase.cpp:579
DeclContext * getDeclContext()
Definition DeclBase.h:456
AccessSpecifier getAccess() const
Definition DeclBase.h:515
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:935
Kind getKind() const
Definition DeclBase.h:450
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
Definition DeclBase.h:435
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:3509
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies this declaration.
Definition ExprCXX.h:3561
Represents an array type in C++ whose size is a value-dependent expression.
Definition TypeBase.h:4110
Represents an extended vector type where either the type or size is dependent.
Definition TypeBase.h:4200
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:6597
Represents a reference to emded data.
Definition Expr.h:5141
unsigned getStartingElementPos() const
Definition Expr.h:5162
size_t getDataElementCount() const
Definition Expr.h:5163
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3467
Represents an enum.
Definition Decl.h:4055
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
Definition Decl.h:4273
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
Definition Decl.h:4276
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
Definition Decl.h:4282
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Definition Decl.h:4228
EnumDecl * getTemplateInstantiationPattern() const
Retrieve the enum definition from which this enumeration could be instantiated, if it is an instantia...
Definition Decl.cpp:5139
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
Definition Expr.h:3961
Represents an explicit instantiation of a template entity in source code.
TemplateSpecializationKind getTemplateSpecializationKind() const
NamedDecl * getSpecialization() const
NestedNameSpecifierLoc getQualifierLoc() const
Returns the qualifier regardless of where it is stored.
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
Definition ExprCXX.h:3660
CleanupObject getObject(unsigned i) const
Definition ExprCXX.h:3690
unsigned getNumObjects() const
Definition ExprCXX.h:3688
llvm::PointerUnion< BlockDecl *, CompoundLiteralExpr * > CleanupObject
The type of objects that are kept in the cleanup.
Definition ExprCXX.h:3666
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:3072
ExpressionTrait getTrait() const
Definition ExprCXX.h:3107
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
Definition Expr.h:6622
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Definition Decl.h:3204
bool isMutable() const
Determines whether this field is mutable (C++ only).
Definition Decl.h:3304
std::string getValueAsString(unsigned Radix) const
Definition Expr.cpp:1016
double getValueAsApproximateDouble() const
getValueAsApproximateDouble - This returns the value as an inaccurate double.
Definition Expr.cpp:1095
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:2029
StringLiteral * getDeletedMessage() const
Get the message that indicates why this function was deleted.
Definition Decl.h:2798
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
Definition Decl.h:2961
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:4244
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Definition Decl.h:2413
param_iterator param_begin()
Definition Decl.h:2826
bool isDeleted() const
Whether this function has been deleted.
Definition Decl.h:2576
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:2928
bool isDeletedAsWritten() const
Definition Decl.h:2580
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
Definition Decl.h:2389
bool param_empty() const
Definition Decl.h:2825
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2421
bool isIneligibleOrNotSelected() const
Definition Decl.h:2454
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
Definition Decl.cpp:4397
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
Definition Decl.h:2380
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition Decl.cpp:3806
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Definition Decl.h:2939
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5406
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4602
static StringRef getNameForCallConv(CallingConv CC)
Definition Type.cpp:3708
Represents a C11 generic selection.
Definition Expr.h:6194
AssociationTy< true > ConstAssociation
Definition Expr.h:6428
bool isResultDependent() const
Whether this generic selection is result-dependent.
Definition Expr.h:6448
GotoStmt - This represents a direct goto.
Definition Stmt.h:2978
LabelDecl * getLabel() const
Definition Stmt.h:2991
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition Decl.h:5238
bool isCBuffer() const
Definition Decl.h:5282
This class represents temporary values used to represent inout and out arguments in HLSL.
Definition Expr.h:7409
bool isInOut() const
returns true if the parameter is inout and false if the parameter is out.
Definition Expr.h:7468
ArrayRef< llvm::hlsl::rootsig::RootElement > getRootElements() const
Definition Decl.h:5355
llvm::dxbc::RootSignatureVersion getVersion() const
Definition Decl.h:5353
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:2268
bool hasElseStorage() const
True if this IfStmt has storage for an else statement.
Definition Stmt.h:2343
bool hasVarStorage() const
True if this IfStmt has storage for a variable declaration.
Definition Stmt.h:2340
bool isConstexpr() const
Definition Stmt.h:2461
bool hasInitStorage() const
True if this IfStmt has the storage for an init statement.
Definition Stmt.h:2337
bool isNegatedConsteval() const
Definition Stmt.h:2457
bool isConsteval() const
Definition Stmt.h:2448
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition Expr.h:3859
bool isPartOfExplicitCast() const
Definition Expr.h:3890
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Definition Decl.h:5097
Module * getImportedModule() const
Retrieve the module that was imported by the import declaration.
Definition Decl.h:5155
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3511
ArrayRef< NamedDecl * > chain() const
Definition Decl.h:3532
Describes an C or C++ initializer list.
Definition Expr.h:5314
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
Definition Expr.h:5441
bool isExplicit() const
Definition Expr.h:5457
Represents the declaration of a label.
Definition Decl.h:524
LabelStmt - Represents a label, which has a substatement.
Definition Stmt.h:2155
bool isSideEntry() const
Definition Stmt.h:2202
const char * getName() const
Definition Stmt.cpp:437
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
Definition DeclCXX.h:3329
Represents a linkage specification.
Definition DeclCXX.h:3036
LinkageSpecLanguageIDs getLanguage() const
Return the language specified by this linkage specification.
Definition DeclCXX.h:3059
Base class for BreakStmt and ContinueStmt.
Definition Stmt.h:3066
LabelDecl * getLabelDecl()
Definition Stmt.h:3104
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:3099
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition ExprCXX.h:4919
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
Definition ExprCXX.h:4969
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3370
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
Definition Expr.h:3481
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
Definition Expr.h:3453
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
Definition Expr.h:3594
bool isArrow() const
Definition Expr.h:3554
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:340
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:240
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:656
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
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Definition Decl.cpp:1207
Represents a C++ namespace alias.
Definition DeclCXX.h:3222
NamespaceBaseDecl * getAliasedNamespace() const
Retrieve the namespace that this alias refers to, which may either be a NamespaceDecl or a NamespaceA...
Definition DeclCXX.h:3315
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
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
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:5574
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:5570
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:119
ObjCBoxedExpr - used for generalized expression boxing.
Definition ExprObjC.h:159
ObjCMethodDecl * getBoxingMethod() const
Definition ExprObjC.h:181
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:441
QualType getEncodedType() const
Definition ExprObjC.h:460
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:8051
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:582
ObjCIvarDecl * getDecl()
Definition ExprObjC.h:612
bool isFreeIvar() const
Definition ExprObjC.h:621
An expression that sends a message to the given Objective-C object or class.
Definition ExprObjC.h:973
Selector getSelector() const
Definition ExprObjC.cpp:301
@ SuperInstance
The receiver is the instance of the superclass object.
Definition ExprObjC.h:987
@ Instance
The receiver is an object instance.
Definition ExprObjC.h:981
@ SuperClass
The receiver is a superclass.
Definition ExprObjC.h:984
@ Class
The receiver is a class.
Definition ExprObjC.h:978
QualType getClassReceiver() const
Returns the type of a class message send, or NULL if the message is not a class message.
Definition ExprObjC.h:1320
ReceiverKind getReceiverKind() const
Determine the kind of receiver that this message is being sent to.
Definition ExprObjC.h:1262
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:650
bool isMessagingGetter() const
True if the property reference will result in a message to the getter.
Definition ExprObjC.h:769
ObjCPropertyDecl * getExplicitProperty() const
Definition ExprObjC.h:739
bool isMessagingSetter() const
True if the property reference will result in a message to the setter.
Definition ExprObjC.h:776
ObjCMethodDecl * getImplicitPropertyGetter() const
Definition ExprObjC.h:744
bool isImplicitProperty() const
Definition ExprObjC.h:736
ObjCMethodDecl * getImplicitPropertySetter() const
Definition ExprObjC.h:749
bool isSuperReceiver() const
Definition ExprObjC.h:804
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:538
ObjCProtocolDecl * getProtocol() const
Definition ExprObjC.h:555
ObjCSelectorExpr used for @selector in Objective-C.
Definition ExprObjC.h:486
Selector getSelector() const
Definition ExprObjC.h:500
ObjCSubscriptRefExpr - used for array and dictionary subscripting.
Definition ExprObjC.h:872
bool isArraySubscriptRefExpr() const
Definition ExprObjC.h:925
ObjCMethodDecl * getAtIndexMethodDecl() const
Definition ExprObjC.h:917
ObjCMethodDecl * setAtIndexMethodDecl() const
Definition ExprObjC.h:921
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:2096
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:3222
decls_iterator decls_begin() const
Definition ExprCXX.h:3224
decls_iterator decls_end() const
Definition ExprCXX.h:3227
DeclarationName getName() const
Gets the name looked up.
Definition ExprCXX.h:3241
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:2011
StringRef getIdentKindName() const
Definition Expr.h:2068
PredefinedIdentKind getIdentKind() const
Definition Expr.h:2046
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:938
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
Definition TypeBase.h:8510
std::string getAsString() const
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Definition TypeBase.h:1348
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:4369
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:3672
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:3169
const VarDecl * getNRVOCandidate() const
Retrieve the variable that might be used for the named return value optimization.
Definition Stmt.h:3205
TypeSourceInfo * getTypeSourceInfo()
Definition Expr.h:2149
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:4440
NamedDecl * getPack() const
Retrieve the parameter pack.
Definition ExprCXX.h:4508
Encodes a location in the source.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
Definition Stmt.h:85
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:1805
void outputString(raw_ostream &OS) const
Definition Expr.cpp:1215
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:2518
bool hasVarStorage() const
True if this SwitchStmt has storage for a condition variable.
Definition Stmt.h:2579
bool hasInitStorage() const
True if this SwitchStmt has storage for an init statement.
Definition Stmt.h:2576
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3761
StringRef getKindName() const
Definition Decl.h:3957
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3862
TypedefNameDecl * getTypedefNameForAnonDecl() const
Definition Decl.h:3998
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
Definition Decl.h:4007
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 VisitDeducedType(const DeducedType *T)
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 VisitExplicitInstantiationDecl(const ExplicitInstantiationDecl *D)
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 VisitCXXExpansionStmtInstantiation(const CXXExpansionStmtInstantiation *Node)
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 dumpFormalLinkage(const NamedDecl *ND)
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 VisitCXXExpansionStmtPattern(const CXXExpansionStmtPattern *Node)
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:3732
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:8460
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8471
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
Definition ExprCXX.h:2899
TypeTrait getTrait() const
Determine which type trait this expression uses.
Definition ExprCXX.h:2942
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:1876
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
Definition Type.cpp:2270
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
Definition Type.h:63
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2847
const char * getTypeClassName() const
Definition Type.cpp:3481
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9319
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition Decl.h:3711
QualType getUnderlyingType() const
Definition Decl.h:3661
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
Definition Expr.h:2631
QualType getArgumentType() const
Definition Expr.h:2674
UnaryExprOrTypeTrait getKind() const
Definition Expr.h:2663
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2250
static bool isPostfix(Opcode Op)
isPostfix - Return true if this is a postfix operation, like x++.
Definition Expr.h:2320
Opcode getOpcode() const
Definition Expr.h:2286
bool hasStoredFPFeatures() const
Is FPFeatures in Trailing Storage?
Definition Expr.h:2387
FPOptionsOverride getStoredFPFeatures() const
Get FPFeatures from trailing storage.
Definition Expr.h:2390
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
Definition Expr.cpp:1412
bool canOverflow() const
Returns true if the unary operator can cause an overflow.
Definition Expr.h:2304
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition ExprCXX.h:3389
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
Definition ExprCXX.h:3458
Represents the dependent type named by a dependently-scoped typename using declaration,...
Definition TypeBase.h:6122
Represents a dependent using declaration which was marked with typename.
Definition DeclCXX.h:4058
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Definition DeclCXX.h:4095
Represents a dependent using declaration which was not marked with typename.
Definition DeclCXX.h:3961
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Definition DeclCXX.h:4005
Represents a C++ using-declaration.
Definition DeclCXX.h:3612
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Definition DeclCXX.h:3649
Represents C++ using-directive.
Definition DeclCXX.h:3117
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
Definition DeclCXX.cpp:3357
Represents a C++ using-enum-declaration.
Definition DeclCXX.h:3813
EnumDecl * getEnumDecl() const
Definition DeclCXX.h:3855
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3420
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
Definition DeclCXX.h:3484
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:5593
Kind getKind() const
Definition Value.h:137
Represents a variable declaration or definition.
Definition Decl.h:932
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
Definition Decl.cpp:2773
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
Definition Decl.h:1593
TLSKind getTLSKind() const
Definition Decl.cpp:2149
bool hasInit() const
Definition Decl.cpp:2379
InitializationStyle getInitStyle() const
The style of initialization for this declaration.
Definition Decl.h:1490
static const char * getStorageClassSpecifierString(StorageClass SC)
Return the string used to specify the storage class SC.
Definition Decl.cpp:2102
@ ListInit
Direct list-initialization (C++11)
Definition Decl.h:943
@ CInit
C-style initialization with assignment.
Definition Decl.h:937
@ ParenListInit
Parenthesized list-initialization (C++20)
Definition Decl.h:946
@ CallInit
Call-style initialization (C++98)
Definition Decl.h:940
VarDecl * getTemplateInstantiationPattern() const
Retrieve the variable declaration from which this variable could be instantiated, if it is an instant...
Definition Decl.cpp:2690
bool isNRVOVariable() const
Determine whether this local variable can be used with the named return value optimization (NRVO).
Definition Decl.h:1536
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
Definition Decl.cpp:2814
bool isInline() const
Whether this variable is (C++1z) inline.
Definition Decl.h:1575
const Expr * getInit() const
Definition Decl.h:1391
const APValue * evaluateValue() const
Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...
Definition Decl.cpp:2556
@ TLS_Static
TLS with a known-constant initializer.
Definition Decl.h:955
@ TLS_Dynamic
TLS with a dynamic initializer.
Definition Decl.h:958
@ TLS_None
Not a TLS variable.
Definition Decl.h:952
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:1174
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:2742
Declaration of a variable template.
Represents a C array with a specified size that is not an integer-constant-expression.
Definition TypeBase.h:4065
Represents a GCC generic vector type.
Definition TypeBase.h:4274
WhileStmt - This represents a 'while' stmt.
Definition Stmt.h:2706
bool hasVarStorage() const
True if this WhileStmt has storage for a condition variable.
Definition Stmt.h:2756
A command that has zero or more word-like arguments (number of word-like arguments depends on command...
Definition Comment.h:616
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:1097
An opening HTML tag with attributes.
Definition Comment.h:445
A command with word-like arguments that is considered inline content.
Definition Comment.h:341
Doxygen \param command.
Definition Comment.h:723
static const char * getDirectionAsString(ParamCommandPassDirection D)
Definition Comment.cpp:189
Doxygen \tparam command, describes a template parameter.
Definition Comment.h:805
A verbatim block command (e.
Definition Comment.h:891
A line of text contained in a verbatim block.
Definition Comment.h:866
A verbatim line command.
Definition Comment.h:942
A static requirement that can be used in a requires-expression to check properties of types and expre...
The JSON file list parser is used to communicate input to InstallAPI.
const char * getTraitSpelling(TypeTrait T) LLVM_READONLY
Return the spelling of the trait T. Never null.
bool isa(CodeGen::Address addr)
Definition Address.h:330
llvm::StringRef getAccessSpelling(AccessSpecifier AS)
Definition Specifiers.h:422
@ 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_Copyright
Definition PragmaKinds.h:21
@ PCK_Unknown
Definition PragmaKinds.h:15
@ PCK_User
Definition PragmaKinds.h:20
@ RQ_None
No ref-qualifier was provided.
Definition TypeBase.h:1798
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
Definition TypeBase.h:1801
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
Definition TypeBase.h:1804
@ OK_VectorComponent
A vector component is an element or range of elements of a vector.
Definition Specifiers.h:158
@ 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:162
@ OK_ObjCSubscript
An Objective-C array/dictionary subscripting which reads an object or writes at the subscripted array...
Definition Specifiers.h:167
@ OK_Ordinary
An ordinary object is located at an address in memory.
Definition Specifiers.h:152
@ OK_BitField
A bitfield object is a bitfield on a C or C++ record.
Definition Specifiers.h:155
@ OK_MatrixComponent
A matrix component is a single element or range of elements of a matrix.
Definition Specifiers.h:170
@ Override
Merge availability attributes for an override, which requires an exact match or a weakening of constr...
Definition Sema.h:635
@ 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:124
StorageClass
Storage classes.
Definition Specifiers.h:249
@ SC_None
Definition Specifiers.h:251
IdentifierLoc DeviceTypeArgument
@ VisibleNone
No linkage according to the standard, but is visible from other translation units because of types de...
Definition Linkage.h:48
@ None
No linkage, which means that the entity is unique and can only be referred to from within its scope.
Definition Linkage.h:30
@ UniqueExternal
External linkage within a unique namespace.
Definition Linkage.h:44
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
Definition Linkage.h:35
@ External
External linkage, which indicates that the entity can be referred to from other translation units.
Definition Linkage.h:58
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
Definition Linkage.h:54
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
@ Deduced
The normal deduced case.
Definition TypeBase.h:1815
@ Undeduced
Not deduced yet. This is for example an 'auto' which was just parsed.
Definition TypeBase.h:1810
@ DeducedAsPack
Same as above, but additionally this represents a case where the deduced entity itself is a pack.
Definition TypeBase.h:1831
@ DeducedAsDependent
This is a special case where the initializer is dependent, so we can't deduce a type yet.
Definition TypeBase.h:1825
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:136
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
Definition Specifiers.h:145
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:140
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition Specifiers.h:189
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
Definition Specifiers.h:207
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
Definition Specifiers.h:203
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
Definition Specifiers.h:199
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
Definition Specifiers.h:195
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
Definition Specifiers.h:192
@ 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:4244
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
Definition TypeBase.h:4253
@ AltiVecVector
is AltiVec vector
Definition TypeBase.h:4238
@ AltiVecPixel
is AltiVec 'vector Pixel'
Definition TypeBase.h:4241
@ Neon
is ARM Neon vector
Definition TypeBase.h:4247
@ Generic
not a target-specific vector type
Definition TypeBase.h:4235
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
Definition TypeBase.h:4259
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
Definition TypeBase.h:4262
@ NeonPoly
is ARM Neon polynomial vector
Definition TypeBase.h:4250
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
Definition TypeBase.h:4256
U cast(CodeGen::Address addr)
Definition Address.h:327
@ PackIndex
Index of a pack indexing expression or specifier.
Definition Sema.h:850
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition TypeBase.h:6005
@ None
No keyword precedes the qualified type name.
Definition TypeBase.h:6026
@ 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:184
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
Definition Specifiers.h:178
@ NOUR_None
This is an odr-use.
Definition Specifiers.h:176
@ NOUR_Constant
This name appears as a potential result of an lvalue-to-rvalue conversion that is a constant expressi...
Definition Specifiers.h:181
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:5475
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
Definition TypeBase.h:5479
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5465
Extra information about a function prototype.
Definition TypeBase.h:5491
static StringRef getKeywordName(ElaboratedTypeKeyword Keyword)
Definition Type.cpp:3440
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:871
Information about a single command.