clang 20.0.0git
TextNodeDumper.cpp
Go to the documentation of this file.
1//===--- TextNodeDumper.cpp - Printing of AST nodes -----------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements AST dumping of components of individual AST nodes.
10//
11//===----------------------------------------------------------------------===//
12
14#include "clang/AST/APValue.h"
20#include "clang/AST/Type.h"
22#include "clang/Basic/Module.h"
26#include "llvm/ADT/StringExtras.h"
27
28#include <algorithm>
29#include <utility>
30
31using namespace clang;
32
33static void dumpPreviousDeclImpl(raw_ostream &OS, ...) {}
34
35template <typename T>
36static void dumpPreviousDeclImpl(raw_ostream &OS, const Mergeable<T> *D) {
37 const T *First = D->getFirstDecl();
38 if (First != D)
39 OS << " first " << First;
40}
41
42template <typename T>
43static void dumpPreviousDeclImpl(raw_ostream &OS, const Redeclarable<T> *D) {
44 const T *Prev = D->getPreviousDecl();
45 if (Prev)
46 OS << " prev " << Prev;
47}
48
49/// Dump the previous declaration in the redeclaration chain for a declaration,
50/// if any.
51static void dumpPreviousDecl(raw_ostream &OS, const Decl *D) {
52 switch (D->getKind()) {
53#define DECL(DERIVED, BASE) \
54 case Decl::DERIVED: \
55 return dumpPreviousDeclImpl(OS, cast<DERIVED##Decl>(D));
56#define ABSTRACT_DECL(DECL)
57#include "clang/AST/DeclNodes.inc"
58 }
59 llvm_unreachable("Decl that isn't part of DeclNodes.inc!");
60}
61
62TextNodeDumper::TextNodeDumper(raw_ostream &OS, const ASTContext &Context,
63 bool ShowColors)
65 Context(&Context), SM(&Context.getSourceManager()),
66 PrintPolicy(Context.getPrintingPolicy()),
67 Traits(&Context.getCommentCommandTraits()) {}
68
71
73 const comments::FullComment *FC) {
74 if (!C) {
75 ColorScope Color(OS, ShowColors, NullColor);
76 OS << "<<<NULL>>>";
77 return;
78 }
79
80 {
81 ColorScope Color(OS, ShowColors, CommentColor);
82 OS << C->getCommentKindName();
83 }
85 dumpSourceRange(C->getSourceRange());
86
87 ConstCommentVisitor<TextNodeDumper, void,
88 const comments::FullComment *>::visit(C, FC);
89}
90
92 {
93 ColorScope Color(OS, ShowColors, AttrColor);
94
95 switch (A->getKind()) {
96#define ATTR(X) \
97 case attr::X: \
98 OS << #X; \
99 break;
100#include "clang/Basic/AttrList.inc"
101 }
102 OS << "Attr";
103 }
104 dumpPointer(A);
106 if (A->isInherited())
107 OS << " Inherited";
108 if (A->isImplicit())
109 OS << " Implicit";
110
112}
113
115 const Decl *From, StringRef Label) {
116 OS << "TemplateArgument";
117 if (R.isValid())
119
120 if (From)
121 dumpDeclRef(From, Label);
122
124}
125
127 if (!Node) {
128 ColorScope Color(OS, ShowColors, NullColor);
129 OS << "<<<NULL>>>";
130 return;
131 }
132 {
133 ColorScope Color(OS, ShowColors, StmtColor);
134 OS << Node->getStmtClassName();
135 }
138
139 if (const auto *E = dyn_cast<Expr>(Node)) {
140 dumpType(E->getType());
141
142 if (E->containsErrors()) {
143 ColorScope Color(OS, ShowColors, ErrorsColor);
144 OS << " contains-errors";
145 }
146
147 {
148 ColorScope Color(OS, ShowColors, ValueKindColor);
149 switch (E->getValueKind()) {
150 case VK_PRValue:
151 break;
152 case VK_LValue:
153 OS << " lvalue";
154 break;
155 case VK_XValue:
156 OS << " xvalue";
157 break;
158 }
159 }
160
161 {
162 ColorScope Color(OS, ShowColors, ObjectKindColor);
163 switch (E->getObjectKind()) {
164 case OK_Ordinary:
165 break;
166 case OK_BitField:
167 OS << " bitfield";
168 break;
169 case OK_ObjCProperty:
170 OS << " objcproperty";
171 break;
172 case OK_ObjCSubscript:
173 OS << " objcsubscript";
174 break;
176 OS << " vectorcomponent";
177 break;
179 OS << " matrixcomponent";
180 break;
181 }
182 }
183 }
184
186}
187
189 if (!T) {
190 ColorScope Color(OS, ShowColors, NullColor);
191 OS << "<<<NULL>>>";
192 return;
193 }
194 if (isa<LocInfoType>(T)) {
195 {
196 ColorScope Color(OS, ShowColors, TypeColor);
197 OS << "LocInfo Type";
198 }
199 dumpPointer(T);
200 return;
201 }
202
203 {
204 ColorScope Color(OS, ShowColors, TypeColor);
205 OS << T->getTypeClassName() << "Type";
206 }
207 dumpPointer(T);
208 OS << " ";
209 dumpBareType(QualType(T, 0), false);
210
211 QualType SingleStepDesugar =
213 if (SingleStepDesugar != QualType(T, 0))
214 OS << " sugar";
215
216 if (T->containsErrors()) {
217 ColorScope Color(OS, ShowColors, ErrorsColor);
218 OS << " contains-errors";
219 }
220
221 if (T->isDependentType())
222 OS << " dependent";
224 OS << " instantiation_dependent";
225
227 OS << " variably_modified";
229 OS << " contains_unexpanded_pack";
230 if (T->isFromAST())
231 OS << " imported";
232
234}
235
237 OS << "QualType";
238 dumpPointer(T.getAsOpaquePtr());
239 OS << " ";
240 dumpBareType(T, false);
241 OS << " " << T.split().Quals.getAsString();
242}
243
245 if (!TL) {
246 ColorScope Color(OS, ShowColors, NullColor);
247 OS << "<<<NULL>>>";
248 return;
249 }
250
251 {
252 ColorScope Color(OS, ShowColors, TypeColor);
254 ? "Qualified"
255 : TL.getType()->getTypeClassName())
256 << "TypeLoc";
257 }
259 OS << ' ';
260 dumpBareType(TL.getType(), /*Desugar=*/false);
261
263}
264
266 if (!D) {
267 ColorScope Color(OS, ShowColors, NullColor);
268 OS << "<<<NULL>>>";
269 return;
270 }
271
272 {
273 ColorScope Color(OS, ShowColors, DeclKindNameColor);
274 OS << D->getDeclKindName() << "Decl";
275 }
276 dumpPointer(D);
278 OS << " parent " << cast<Decl>(D->getDeclContext());
279 dumpPreviousDecl(OS, D);
281 OS << ' ';
283 if (D->isFromASTFile())
284 OS << " imported";
285 if (Module *M = D->getOwningModule())
286 OS << " in " << M->getFullModuleName();
287 if (auto *ND = dyn_cast<NamedDecl>(D))
289 const_cast<NamedDecl *>(ND)))
290 AddChild([=] { OS << "also in " << M->getFullModuleName(); });
291 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
292 if (!ND->isUnconditionallyVisible())
293 OS << " hidden";
294 if (D->isImplicit())
295 OS << " implicit";
296
297 if (D->isUsed())
298 OS << " used";
299 else if (D->isThisDeclarationReferenced())
300 OS << " referenced";
301
302 if (D->isInvalidDecl())
303 OS << " invalid";
304 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
305 if (FD->isConstexprSpecified())
306 OS << " constexpr";
307 if (FD->isConsteval())
308 OS << " consteval";
309 else if (FD->isImmediateFunction())
310 OS << " immediate";
311 if (FD->isMultiVersion())
312 OS << " multiversion";
313 }
314
315 if (!isa<FunctionDecl>(*D)) {
316 const auto *MD = dyn_cast<ObjCMethodDecl>(D);
317 if (!MD || !MD->isThisDeclarationADefinition()) {
318 const auto *DC = dyn_cast<DeclContext>(D);
319 if (DC && DC->hasExternalLexicalStorage()) {
320 ColorScope Color(OS, ShowColors, UndeserializedColor);
321 OS << " <undeserialized declarations>";
322 }
323 }
324 }
325
326 switch (D->getFriendObjectKind()) {
327 case Decl::FOK_None:
328 break;
330 OS << " friend";
331 break;
333 OS << " friend_undeclared";
334 break;
335 }
336
338}
339
341 OS << "CXXCtorInitializer";
342 if (Init->isAnyMemberInitializer()) {
343 OS << ' ';
344 dumpBareDeclRef(Init->getAnyMember());
345 } else if (Init->isBaseInitializer()) {
346 dumpType(QualType(Init->getBaseClass(), 0));
347 } else if (Init->isDelegatingInitializer()) {
348 dumpType(Init->getTypeSourceInfo()->getType());
349 } else {
350 llvm_unreachable("Unknown initializer type");
351 }
352}
353
355 OS << "capture";
356 if (C.isByRef())
357 OS << " byref";
358 if (C.isNested())
359 OS << " nested";
360 if (C.getVariable()) {
361 OS << ' ';
362 dumpBareDeclRef(C.getVariable());
363 }
364}
365
367 if (!C) {
368 ColorScope Color(OS, ShowColors, NullColor);
369 OS << "<<<NULL>>> OMPClause";
370 return;
371 }
372 {
373 ColorScope Color(OS, ShowColors, AttrColor);
374 StringRef ClauseName(llvm::omp::getOpenMPClauseName(C->getClauseKind()));
375 OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
376 << ClauseName.drop_front() << "Clause";
377 }
378 dumpPointer(C);
379 dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
380 if (C->isImplicit())
381 OS << " <implicit>";
382}
383
385 const OpenACCAsteriskSizeExpr *E) {
386 // Nothing to do here, only location exists, and that is printed elsewhere.
387}
388
390 if (!C) {
391 ColorScope Color(OS, ShowColors, NullColor);
392 OS << "<<<NULL>>> OpenACCClause";
393 return;
394 }
395 {
396 ColorScope Color(OS, ShowColors, AttrColor);
397 OS << C->getClauseKind();
398
399 // Handle clauses with parens for types that have no children, likely
400 // because there is no sub expression.
401 switch (C->getClauseKind()) {
403 OS << '(' << cast<OpenACCDefaultClause>(C)->getDefaultClauseKind() << ')';
404 break;
433 // The condition expression will be printed as a part of the 'children',
434 // but print 'clause' here so it is clear what is happening from the dump.
435 OS << " clause";
436 break;
438 OS << " clause";
439 // print the list of all GangKinds, so that there is some sort of
440 // relationship to the expressions listed afterwards.
441 auto *GC = cast<OpenACCGangClause>(C);
442
443 for (unsigned I = 0; I < GC->getNumExprs(); ++I) {
444 OS << " " << GC->getExpr(I).first;
445 }
446 break;
447 }
449 OS << " clause";
450 if (cast<OpenACCCollapseClause>(C)->hasForce())
451 OS << ": force";
452 break;
453
457 OS << " clause";
458 if (cast<OpenACCCopyInClause>(C)->isReadOnly())
459 OS << " : readonly";
460 break;
464 OS << " clause";
465 if (cast<OpenACCCopyOutClause>(C)->isZero())
466 OS << " : zero";
467 break;
471 OS << " clause";
472 if (cast<OpenACCCreateClause>(C)->isZero())
473 OS << " : zero";
474 break;
476 OS << " clause";
477 if (cast<OpenACCWaitClause>(C)->hasDevNumExpr())
478 OS << " has devnum";
479 if (cast<OpenACCWaitClause>(C)->hasQueuesTag())
480 OS << " has queues tag";
481 break;
484 OS << "(";
485 llvm::interleaveComma(
486 cast<OpenACCDeviceTypeClause>(C)->getArchitectures(), OS,
487 [&](const DeviceTypeArgument &Arch) {
488 if (Arch.first == nullptr)
489 OS << "*";
490 else
491 OS << Arch.first->getName();
492 });
493 OS << ")";
494 break;
496 OS << " clause Operator: "
497 << cast<OpenACCReductionClause>(C)->getReductionOp();
498 break;
499 default:
500 // Nothing to do here.
501 break;
502 }
503 }
504 dumpPointer(C);
505 dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
506}
507
509 const TypeSourceInfo *TSI = A.getTypeSourceInfo();
510 if (TSI) {
511 OS << "case ";
512 dumpType(TSI->getType());
513 } else {
514 OS << "default";
515 }
516
517 if (A.isSelected())
518 OS << " selected";
519}
520
522 if (!R) {
523 ColorScope Color(OS, ShowColors, NullColor);
524 OS << "<<<NULL>>> ConceptReference";
525 return;
526 }
527
528 OS << "ConceptReference";
529 dumpPointer(R);
531 OS << ' ';
533}
534
536 if (!R) {
537 ColorScope Color(OS, ShowColors, NullColor);
538 OS << "<<<NULL>>> Requirement";
539 return;
540 }
541
542 {
543 ColorScope Color(OS, ShowColors, StmtColor);
544 switch (R->getKind()) {
546 OS << "TypeRequirement";
547 break;
549 OS << "SimpleRequirement";
550 break;
552 OS << "CompoundRequirement";
553 break;
555 OS << "NestedRequirement";
556 break;
557 }
558 }
559
560 dumpPointer(R);
561
562 if (auto *ER = dyn_cast<concepts::ExprRequirement>(R)) {
563 if (ER->hasNoexceptRequirement())
564 OS << " noexcept";
565 }
566
567 if (R->isDependent())
568 OS << " dependent";
569 else
570 OS << (R->isSatisfied() ? " satisfied" : " unsatisfied");
572 OS << " contains_unexpanded_pack";
573}
574
575static double GetApproxValue(const llvm::APFloat &F) {
576 llvm::APFloat V = F;
577 bool ignored;
578 V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
579 &ignored);
580 return V.convertToDouble();
581}
582
583/// True if the \p APValue \p Value can be folded onto the current line.
584static bool isSimpleAPValue(const APValue &Value) {
585 switch (Value.getKind()) {
586 case APValue::None:
588 case APValue::Int:
589 case APValue::Float:
593 case APValue::LValue:
596 return true;
597 case APValue::Vector:
598 case APValue::Array:
599 case APValue::Struct:
600 return false;
601 case APValue::Union:
602 return isSimpleAPValue(Value.getUnionValue());
603 }
604 llvm_unreachable("unexpected APValue kind!");
605}
606
607/// Dump the children of the \p APValue \p Value.
608///
609/// \param[in] Value The \p APValue to visit
610/// \param[in] Ty The \p QualType passed to \p Visit
611///
612/// \param[in] IdxToChildFun A function mapping an \p APValue and an index
613/// to one of the child of the \p APValue
614///
615/// \param[in] NumChildren \p IdxToChildFun will be called on \p Value with
616/// the indices in the range \p [0,NumChildren(
617///
618/// \param[in] LabelSingular The label to use on a line with a single child
619/// \param[in] LabelPlurial The label to use on a line with multiple children
620void TextNodeDumper::dumpAPValueChildren(
621 const APValue &Value, QualType Ty,
622 const APValue &(*IdxToChildFun)(const APValue &, unsigned),
623 unsigned NumChildren, StringRef LabelSingular, StringRef LabelPlurial) {
624 // To save some vertical space we print up to MaxChildrenPerLine APValues
625 // considered to be simple (by isSimpleAPValue) on a single line.
626 constexpr unsigned MaxChildrenPerLine = 4;
627 unsigned I = 0;
628 while (I < NumChildren) {
629 unsigned J = I;
630 while (J < NumChildren) {
631 if (isSimpleAPValue(IdxToChildFun(Value, J)) &&
632 (J - I < MaxChildrenPerLine)) {
633 ++J;
634 continue;
635 }
636 break;
637 }
638
639 J = std::max(I + 1, J);
640
641 // Print [I,J) on a single line.
642 AddChild(J - I > 1 ? LabelPlurial : LabelSingular, [=]() {
643 for (unsigned X = I; X < J; ++X) {
644 Visit(IdxToChildFun(Value, X), Ty);
645 if (X + 1 != J)
646 OS << ", ";
647 }
648 });
649 I = J;
650 }
651}
652
654 ColorScope Color(OS, ShowColors, ValueKindColor);
655 switch (Value.getKind()) {
656 case APValue::None:
657 OS << "None";
658 return;
660 OS << "Indeterminate";
661 return;
662 case APValue::Int:
663 OS << "Int ";
664 {
665 ColorScope Color(OS, ShowColors, ValueColor);
666 OS << Value.getInt();
667 }
668 return;
669 case APValue::Float:
670 OS << "Float ";
671 {
672 ColorScope Color(OS, ShowColors, ValueColor);
673 OS << GetApproxValue(Value.getFloat());
674 }
675 return;
677 OS << "FixedPoint ";
678 {
679 ColorScope Color(OS, ShowColors, ValueColor);
680 OS << Value.getFixedPoint();
681 }
682 return;
683 case APValue::Vector: {
684 unsigned VectorLength = Value.getVectorLength();
685 OS << "Vector length=" << VectorLength;
686
687 dumpAPValueChildren(
688 Value, Ty,
689 [](const APValue &Value, unsigned Index) -> const APValue & {
690 return Value.getVectorElt(Index);
691 },
692 VectorLength, "element", "elements");
693 return;
694 }
696 OS << "ComplexInt ";
697 {
698 ColorScope Color(OS, ShowColors, ValueColor);
699 OS << Value.getComplexIntReal() << " + " << Value.getComplexIntImag()
700 << 'i';
701 }
702 return;
704 OS << "ComplexFloat ";
705 {
706 ColorScope Color(OS, ShowColors, ValueColor);
707 OS << GetApproxValue(Value.getComplexFloatReal()) << " + "
708 << GetApproxValue(Value.getComplexFloatImag()) << 'i';
709 }
710 return;
711 case APValue::LValue:
712 (void)Context;
713 OS << "LValue <todo>";
714 return;
715 case APValue::Array: {
716 unsigned ArraySize = Value.getArraySize();
717 unsigned NumInitializedElements = Value.getArrayInitializedElts();
718 OS << "Array size=" << ArraySize;
719
720 dumpAPValueChildren(
721 Value, Ty,
722 [](const APValue &Value, unsigned Index) -> const APValue & {
723 return Value.getArrayInitializedElt(Index);
724 },
725 NumInitializedElements, "element", "elements");
726
727 if (Value.hasArrayFiller()) {
728 AddChild("filler", [=] {
729 {
730 ColorScope Color(OS, ShowColors, ValueColor);
731 OS << ArraySize - NumInitializedElements << " x ";
732 }
733 Visit(Value.getArrayFiller(), Ty);
734 });
735 }
736
737 return;
738 }
739 case APValue::Struct: {
740 OS << "Struct";
741
742 dumpAPValueChildren(
743 Value, Ty,
744 [](const APValue &Value, unsigned Index) -> const APValue & {
745 return Value.getStructBase(Index);
746 },
747 Value.getStructNumBases(), "base", "bases");
748
749 dumpAPValueChildren(
750 Value, Ty,
751 [](const APValue &Value, unsigned Index) -> const APValue & {
752 return Value.getStructField(Index);
753 },
754 Value.getStructNumFields(), "field", "fields");
755
756 return;
757 }
758 case APValue::Union: {
759 OS << "Union";
760 {
761 ColorScope Color(OS, ShowColors, ValueColor);
762 if (const FieldDecl *FD = Value.getUnionField())
763 OS << " ." << *cast<NamedDecl>(FD);
764 }
765 // If the union value is considered to be simple, fold it into the
766 // current line to save some vertical space.
767 const APValue &UnionValue = Value.getUnionValue();
768 if (isSimpleAPValue(UnionValue)) {
769 OS << ' ';
770 Visit(UnionValue, Ty);
771 } else {
772 AddChild([=] { Visit(UnionValue, Ty); });
773 }
774
775 return;
776 }
778 OS << "MemberPointer <todo>";
779 return;
781 OS << "AddrLabelDiff <todo>";
782 return;
783 }
784 llvm_unreachable("Unknown APValue kind!");
785}
786
787void TextNodeDumper::dumpPointer(const void *Ptr) {
788 ColorScope Color(OS, ShowColors, AddressColor);
789 OS << ' ' << Ptr;
790}
791
793 if (!SM)
794 return;
795
796 ColorScope Color(OS, ShowColors, LocationColor);
797 SourceLocation SpellingLoc = SM->getSpellingLoc(Loc);
798
799 // The general format we print out is filename:line:col, but we drop pieces
800 // that haven't changed since the last loc printed.
801 PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc);
802
803 if (PLoc.isInvalid()) {
804 OS << "<invalid sloc>";
805 return;
806 }
807
808 if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) {
809 OS << PLoc.getFilename() << ':' << PLoc.getLine() << ':'
810 << PLoc.getColumn();
811 LastLocFilename = PLoc.getFilename();
812 LastLocLine = PLoc.getLine();
813 } else if (PLoc.getLine() != LastLocLine) {
814 OS << "line" << ':' << PLoc.getLine() << ':' << PLoc.getColumn();
815 LastLocLine = PLoc.getLine();
816 } else {
817 OS << "col" << ':' << PLoc.getColumn();
818 }
819}
820
822 // Can't translate locations if a SourceManager isn't available.
823 if (!SM)
824 return;
825
826 OS << " <";
828 if (R.getBegin() != R.getEnd()) {
829 OS << ", ";
830 dumpLocation(R.getEnd());
831 }
832 OS << ">";
833
834 // <t2.c:123:421[blah], t2.c:412:321>
835}
836
838 ColorScope Color(OS, ShowColors, TypeColor);
839
840 SplitQualType T_split = T.split();
841 std::string T_str = QualType::getAsString(T_split, PrintPolicy);
842 OS << "'" << T_str << "'";
843
844 if (Desugar && !T.isNull()) {
845 // If the type is sugared, also dump a (shallow) desugared type when
846 // it is visibly different.
847 SplitQualType D_split = T.getSplitDesugaredType();
848 if (T_split != D_split) {
849 std::string D_str = QualType::getAsString(D_split, PrintPolicy);
850 if (T_str != D_str)
851 OS << ":'" << QualType::getAsString(D_split, PrintPolicy) << "'";
852 }
853 }
854}
855
857 OS << ' ';
859}
860
862 if (!D) {
863 ColorScope Color(OS, ShowColors, NullColor);
864 OS << "<<<NULL>>>";
865 return;
866 }
867
868 {
869 ColorScope Color(OS, ShowColors, DeclKindNameColor);
870 OS << D->getDeclKindName();
871 }
872 dumpPointer(D);
873
874 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
875 ColorScope Color(OS, ShowColors, DeclNameColor);
876 OS << " '" << ND->getDeclName() << '\'';
877 }
878
879 if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
880 dumpType(VD->getType());
881}
882
884 if (ND->getDeclName()) {
885 ColorScope Color(OS, ShowColors, DeclNameColor);
886 OS << ' ' << ND->getDeclName();
887 }
888}
889
891 const auto AccessSpelling = getAccessSpelling(AS);
892 if (AccessSpelling.empty())
893 return;
894 OS << AccessSpelling;
895}
896
899 if (auto *BD = C.dyn_cast<BlockDecl *>())
900 dumpDeclRef(BD, "cleanup");
901 else if (auto *CLE = C.dyn_cast<CompoundLiteralExpr *>())
902 AddChild([=] {
903 OS << "cleanup ";
904 {
905 ColorScope Color(OS, ShowColors, StmtColor);
906 OS << CLE->getStmtClassName();
907 }
908 dumpPointer(CLE);
909 });
910 else
911 llvm_unreachable("unexpected cleanup type");
912}
913
916 switch (TSK) {
917 case TSK_Undeclared:
918 break;
920 OS << " implicit_instantiation";
921 break;
923 OS << " explicit_specialization";
924 break;
926 OS << " explicit_instantiation_declaration";
927 break;
929 OS << " explicit_instantiation_definition";
930 break;
931 }
932}
933
935 if (!NNS)
936 return;
937
938 AddChild([=] {
939 OS << "NestedNameSpecifier";
940
941 switch (NNS->getKind()) {
942 case NestedNameSpecifier::Identifier:
943 OS << " Identifier";
944 OS << " '" << NNS->getAsIdentifier()->getName() << "'";
945 break;
946 case NestedNameSpecifier::Namespace:
947 OS << " "; // "Namespace" is printed as the decl kind.
948 dumpBareDeclRef(NNS->getAsNamespace());
949 break;
950 case NestedNameSpecifier::NamespaceAlias:
951 OS << " "; // "NamespaceAlias" is printed as the decl kind.
952 dumpBareDeclRef(NNS->getAsNamespaceAlias());
953 break;
954 case NestedNameSpecifier::TypeSpec:
955 OS << " TypeSpec";
956 dumpType(QualType(NNS->getAsType(), 0));
957 break;
958 case NestedNameSpecifier::TypeSpecWithTemplate:
959 OS << " TypeSpecWithTemplate";
960 dumpType(QualType(NNS->getAsType(), 0));
961 break;
962 case NestedNameSpecifier::Global:
963 OS << " Global";
964 break;
965 case NestedNameSpecifier::Super:
966 OS << " Super";
967 break;
968 }
969
970 dumpNestedNameSpecifier(NNS->getPrefix());
971 });
972}
973
974void TextNodeDumper::dumpDeclRef(const Decl *D, StringRef Label) {
975 if (!D)
976 return;
977
978 AddChild([=] {
979 if (!Label.empty())
980 OS << Label << ' ';
982 });
983}
984
987 {
988 llvm::raw_svector_ostream SS(Str);
989 TA.print(PrintPolicy, SS, /*IncludeType=*/true);
990 }
991 OS << " '" << Str << "'";
992
993 if (!Context)
994 return;
995
996 if (TemplateArgument CanonTA = Context->getCanonicalTemplateArgument(TA);
997 !CanonTA.structurallyEquals(TA)) {
998 llvm::SmallString<128> CanonStr;
999 {
1000 llvm::raw_svector_ostream SS(CanonStr);
1001 CanonTA.print(PrintPolicy, SS, /*IncludeType=*/true);
1002 }
1003 if (CanonStr != Str)
1004 OS << ":'" << CanonStr << "'";
1005 }
1006}
1007
1008const char *TextNodeDumper::getCommandName(unsigned CommandID) {
1009 if (Traits)
1010 return Traits->getCommandInfo(CommandID)->Name;
1011 const comments::CommandInfo *Info =
1013 if (Info)
1014 return Info->Name;
1015 return "<not a builtin command>";
1016}
1017
1018void TextNodeDumper::printFPOptions(FPOptionsOverride FPO) {
1019#define OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
1020 if (FPO.has##NAME##Override()) \
1021 OS << " " #NAME "=" << FPO.get##NAME##Override();
1022#include "clang/Basic/FPOptions.def"
1023}
1024
1026 const comments::FullComment *) {
1027 OS << " Text=\"" << C->getText() << "\"";
1028}
1029
1032 OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
1033 switch (C->getRenderKind()) {
1035 OS << " RenderNormal";
1036 break;
1038 OS << " RenderBold";
1039 break;
1041 OS << " RenderMonospaced";
1042 break;
1044 OS << " RenderEmphasized";
1045 break;
1047 OS << " RenderAnchor";
1048 break;
1049 }
1050
1051 for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
1052 OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
1053}
1054
1057 OS << " Name=\"" << C->getTagName() << "\"";
1058 if (C->getNumAttrs() != 0) {
1059 OS << " Attrs: ";
1060 for (unsigned i = 0, e = C->getNumAttrs(); i != e; ++i) {
1061 const comments::HTMLStartTagComment::Attribute &Attr = C->getAttr(i);
1062 OS << " \"" << Attr.Name << "=\"" << Attr.Value << "\"";
1063 }
1064 }
1065 if (C->isSelfClosing())
1066 OS << " SelfClosing";
1067}
1068
1071 OS << " Name=\"" << C->getTagName() << "\"";
1072}
1073
1076 OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
1077 for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
1078 OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
1079}
1080
1083 OS << " "
1085
1086 if (C->isDirectionExplicit())
1087 OS << " explicitly";
1088 else
1089 OS << " implicitly";
1090
1091 if (C->hasParamName()) {
1092 if (C->isParamIndexValid())
1093 OS << " Param=\"" << C->getParamName(FC) << "\"";
1094 else
1095 OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
1096 }
1097
1098 if (C->isParamIndexValid() && !C->isVarArgParam())
1099 OS << " ParamIndex=" << C->getParamIndex();
1100}
1101
1104 if (C->hasParamName()) {
1105 if (C->isPositionValid())
1106 OS << " Param=\"" << C->getParamName(FC) << "\"";
1107 else
1108 OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
1109 }
1110
1111 if (C->isPositionValid()) {
1112 OS << " Position=<";
1113 for (unsigned i = 0, e = C->getDepth(); i != e; ++i) {
1114 OS << C->getIndex(i);
1115 if (i != e - 1)
1116 OS << ", ";
1117 }
1118 OS << ">";
1119 }
1120}
1121
1124 OS << " Name=\"" << getCommandName(C->getCommandID())
1125 << "\""
1126 " CloseName=\""
1127 << C->getCloseName() << "\"";
1128}
1129
1132 const comments::FullComment *) {
1133 OS << " Text=\"" << C->getText() << "\"";
1134}
1135
1138 OS << " Text=\"" << C->getText() << "\"";
1139}
1140
1142 OS << " null";
1143}
1144
1146 OS << " type";
1148}
1149
1151 const TemplateArgument &TA) {
1152 OS << " decl";
1154 dumpDeclRef(TA.getAsDecl());
1155}
1156
1158 OS << " nullptr";
1160}
1161
1163 OS << " integral";
1165}
1166
1168 AddChild(Label, [=] {
1169 {
1171 {
1172 llvm::raw_svector_ostream SS(Str);
1173 TN.print(SS, PrintPolicy);
1174 }
1175 OS << "'" << Str << "'";
1176
1177 if (Context) {
1178 if (TemplateName CanonTN = Context->getCanonicalTemplateName(TN);
1179 CanonTN != TN) {
1180 llvm::SmallString<128> CanonStr;
1181 {
1182 llvm::raw_svector_ostream SS(CanonStr);
1183 CanonTN.print(SS, PrintPolicy);
1184 }
1185 if (CanonStr != Str)
1186 OS << ":'" << CanonStr << "'";
1187 }
1188 }
1189 }
1191 });
1192}
1193
1195 switch (TN.getKind()) {
1197 AddChild([=] { Visit(TN.getAsTemplateDecl()); });
1198 return;
1200 const UsingShadowDecl *USD = TN.getAsUsingShadowDecl();
1201 AddChild([=] { Visit(USD); });
1202 AddChild("target", [=] { Visit(USD->getTargetDecl()); });
1203 return;
1204 }
1206 OS << " qualified";
1208 if (QTN->hasTemplateKeyword())
1209 OS << " keyword";
1212 return;
1213 }
1215 OS << " dependent";
1218 return;
1219 }
1221 OS << " subst";
1224 OS << " index " << STS->getIndex();
1225 if (std::optional<unsigned int> PackIndex = STS->getPackIndex())
1226 OS << " pack_index " << *PackIndex;
1227 if (const TemplateTemplateParmDecl *P = STS->getParameter())
1228 AddChild("parameter", [=] { Visit(P); });
1229 dumpDeclRef(STS->getAssociatedDecl(), "associated");
1230 dumpTemplateName(STS->getReplacement(), "replacement");
1231 return;
1232 }
1234 OS << " deduced";
1236 dumpTemplateName(DTS->getUnderlying(), "underlying");
1237 AddChild("defaults", [=] {
1238 auto [StartPos, Args] = DTS->getDefaultArguments();
1239 OS << " start " << StartPos;
1240 for (const TemplateArgument &Arg : Args)
1241 AddChild([=] { Visit(Arg, SourceRange()); });
1242 });
1243 return;
1244 }
1245 // FIXME: Implement these.
1247 OS << " overloaded";
1248 return;
1250 OS << " assumed";
1251 return;
1253 OS << " subst_pack";
1254 return;
1255 }
1256 llvm_unreachable("Unexpected TemplateName Kind");
1257}
1258
1260 OS << " template";
1263}
1264
1266 const TemplateArgument &TA) {
1267 OS << " template expansion";
1270}
1271
1273 const TemplateArgument &TA) {
1274 OS << " expr";
1276}
1277
1279 OS << " pack";
1281}
1282
1283static void dumpBasePath(raw_ostream &OS, const CastExpr *Node) {
1284 if (Node->path_empty())
1285 return;
1286
1287 OS << " (";
1288 bool First = true;
1289 for (CastExpr::path_const_iterator I = Node->path_begin(),
1290 E = Node->path_end();
1291 I != E; ++I) {
1292 const CXXBaseSpecifier *Base = *I;
1293 if (!First)
1294 OS << " -> ";
1295
1296 const auto *RD =
1297 cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl());
1298
1299 if (Base->isVirtual())
1300 OS << "virtual ";
1301 OS << RD->getName();
1302 First = false;
1303 }
1304
1305 OS << ')';
1306}
1307
1309 if (Node->hasInitStorage())
1310 OS << " has_init";
1311 if (Node->hasVarStorage())
1312 OS << " has_var";
1313 if (Node->hasElseStorage())
1314 OS << " has_else";
1315 if (Node->isConstexpr())
1316 OS << " constexpr";
1317 if (Node->isConsteval()) {
1318 OS << " ";
1319 if (Node->isNegatedConsteval())
1320 OS << "!";
1321 OS << "consteval";
1322 }
1323}
1324
1326 if (Node->hasInitStorage())
1327 OS << " has_init";
1328 if (Node->hasVarStorage())
1329 OS << " has_var";
1330}
1331
1333 if (Node->hasVarStorage())
1334 OS << " has_var";
1335}
1336
1338 OS << " '" << Node->getName() << "'";
1339 if (Node->isSideEntry())
1340 OS << " side_entry";
1341}
1342
1344 OS << " '" << Node->getLabel()->getName() << "'";
1345 dumpPointer(Node->getLabel());
1346}
1347
1349 if (Node->caseStmtIsGNURange())
1350 OS << " gnu_range";
1351}
1352
1354 if (const VarDecl *Cand = Node->getNRVOCandidate()) {
1355 OS << " nrvo_candidate(";
1356 dumpBareDeclRef(Cand);
1357 OS << ")";
1358 }
1359}
1360
1362 if (Node->isImplicit())
1363 OS << " implicit";
1364}
1365
1367 if (Node->isImplicit())
1368 OS << " implicit";
1369}
1370
1372 if (Node->hasAPValueResult())
1373 AddChild("value",
1374 [=] { Visit(Node->getAPValueResult(), Node->getType()); });
1375}
1376
1378 if (Node->usesADL())
1379 OS << " adl";
1380 if (Node->hasStoredFPFeatures())
1381 printFPOptions(Node->getFPFeatures());
1382}
1383
1385 const char *OperatorSpelling = clang::getOperatorSpelling(Node->getOperator());
1386 if (OperatorSpelling)
1387 OS << " '" << OperatorSpelling << "'";
1388
1390}
1391
1393 OS << " <";
1394 {
1395 ColorScope Color(OS, ShowColors, CastColor);
1396 OS << Node->getCastKindName();
1397 }
1398 dumpBasePath(OS, Node);
1399 OS << ">";
1400 if (Node->hasStoredFPFeatures())
1401 printFPOptions(Node->getFPFeatures());
1402}
1403
1406 if (Node->isPartOfExplicitCast())
1407 OS << " part_of_explicit_cast";
1408}
1409
1411 OS << " ";
1412 dumpBareDeclRef(Node->getDecl());
1413 dumpNestedNameSpecifier(Node->getQualifier());
1414 if (Node->getDecl() != Node->getFoundDecl()) {
1415 OS << " (";
1416 dumpBareDeclRef(Node->getFoundDecl());
1417 OS << ")";
1418 }
1419 switch (Node->isNonOdrUse()) {
1420 case NOUR_None: break;
1421 case NOUR_Unevaluated: OS << " non_odr_use_unevaluated"; break;
1422 case NOUR_Constant: OS << " non_odr_use_constant"; break;
1423 case NOUR_Discarded: OS << " non_odr_use_discarded"; break;
1424 }
1425 if (Node->isCapturedByCopyInLambdaWithExplicitObjectParameter())
1426 OS << " dependent_capture";
1427 else if (Node->refersToEnclosingVariableOrCapture())
1428 OS << " refers_to_enclosing_variable_or_capture";
1429
1430 if (Node->isImmediateEscalating())
1431 OS << " immediate-escalating";
1432}
1433
1436
1437 dumpNestedNameSpecifier(Node->getQualifier());
1438}
1439
1441 const UnresolvedLookupExpr *Node) {
1442 OS << " (";
1443 if (!Node->requiresADL())
1444 OS << "no ";
1445 OS << "ADL) = '" << Node->getName() << '\'';
1446
1447 UnresolvedLookupExpr::decls_iterator I = Node->decls_begin(),
1448 E = Node->decls_end();
1449 if (I == E)
1450 OS << " empty";
1451 for (; I != E; ++I)
1452 dumpPointer(*I);
1453}
1454
1456 {
1457 ColorScope Color(OS, ShowColors, DeclKindNameColor);
1458 OS << " " << Node->getDecl()->getDeclKindName() << "Decl";
1459 }
1460 OS << "='" << *Node->getDecl() << "'";
1461 dumpPointer(Node->getDecl());
1462 if (Node->isFreeIvar())
1463 OS << " isFreeIvar";
1464}
1465
1468 dumpType(Node->getTypeSourceInfo()->getType());
1469}
1470
1472 OS << " " << PredefinedExpr::getIdentKindName(Node->getIdentKind());
1473}
1474
1476 ColorScope Color(OS, ShowColors, ValueColor);
1477 OS << " " << Node->getValue();
1478}
1479
1481 bool isSigned = Node->getType()->isSignedIntegerType();
1482 ColorScope Color(OS, ShowColors, ValueColor);
1483 OS << " " << toString(Node->getValue(), 10, isSigned);
1484}
1485
1487 ColorScope Color(OS, ShowColors, ValueColor);
1488 OS << " " << Node->getValueAsString(/*Radix=*/10);
1489}
1490
1492 ColorScope Color(OS, ShowColors, ValueColor);
1493 OS << " " << Node->getValueAsApproximateDouble();
1494}
1495
1497 ColorScope Color(OS, ShowColors, ValueColor);
1498 OS << " ";
1499 Str->outputString(OS);
1500}
1501
1503 if (auto *Field = ILE->getInitializedFieldInUnion()) {
1504 OS << " field ";
1505 dumpBareDeclRef(Field);
1506 }
1507}
1508
1510 if (E->isResultDependent())
1511 OS << " result_dependent";
1512}
1513
1515 OS << " " << (Node->isPostfix() ? "postfix" : "prefix") << " '"
1516 << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1517 if (!Node->canOverflow())
1518 OS << " cannot overflow";
1519 if (Node->hasStoredFPFeatures())
1520 printFPOptions(Node->getStoredFPFeatures());
1521}
1522
1525 OS << " " << getTraitSpelling(Node->getKind());
1526
1527 if (Node->isArgumentType())
1528 dumpType(Node->getArgumentType());
1529}
1530
1532 OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl();
1533 dumpPointer(Node->getMemberDecl());
1534 dumpNestedNameSpecifier(Node->getQualifier());
1535 switch (Node->isNonOdrUse()) {
1536 case NOUR_None: break;
1537 case NOUR_Unevaluated: OS << " non_odr_use_unevaluated"; break;
1538 case NOUR_Constant: OS << " non_odr_use_constant"; break;
1539 case NOUR_Discarded: OS << " non_odr_use_discarded"; break;
1540 }
1541}
1542
1544 const ExtVectorElementExpr *Node) {
1545 OS << " " << Node->getAccessor().getNameStart();
1546}
1547
1549 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1550 if (Node->hasStoredFPFeatures())
1551 printFPOptions(Node->getStoredFPFeatures());
1552}
1553
1556 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
1557 << "' ComputeLHSTy=";
1558 dumpBareType(Node->getComputationLHSType());
1559 OS << " ComputeResultTy=";
1560 dumpBareType(Node->getComputationResultType());
1561 if (Node->hasStoredFPFeatures())
1562 printFPOptions(Node->getStoredFPFeatures());
1563}
1564
1566 OS << " " << Node->getLabel()->getName();
1567 dumpPointer(Node->getLabel());
1568}
1569
1571 OS << " " << Node->getCastName() << "<"
1572 << Node->getTypeAsWritten().getAsString() << ">"
1573 << " <" << Node->getCastKindName();
1574 dumpBasePath(OS, Node);
1575 OS << ">";
1576}
1577
1579 OS << " " << (Node->getValue() ? "true" : "false");
1580}
1581
1583 if (Node->isImplicit())
1584 OS << " implicit";
1585 if (Node->isCapturedByCopyInLambdaWithExplicitObjectParameter())
1586 OS << " dependent_capture";
1587 OS << " this";
1588}
1589
1591 const CXXFunctionalCastExpr *Node) {
1592 OS << " functional cast to " << Node->getTypeAsWritten().getAsString() << " <"
1593 << Node->getCastKindName() << ">";
1594 if (Node->hasStoredFPFeatures())
1595 printFPOptions(Node->getFPFeatures());
1596}
1597
1600 if (Node->hasStoredFPFeatures())
1601 printFPOptions(Node->getFPFeatures());
1602}
1603
1606 dumpType(Node->getTypeAsWritten());
1607 if (Node->isListInitialization())
1608 OS << " list";
1609}
1610
1612 CXXConstructorDecl *Ctor = Node->getConstructor();
1613 dumpType(Ctor->getType());
1614 if (Node->isElidable())
1615 OS << " elidable";
1616 if (Node->isListInitialization())
1617 OS << " list";
1618 if (Node->isStdInitListInitialization())
1619 OS << " std::initializer_list";
1620 if (Node->requiresZeroInitialization())
1621 OS << " zeroing";
1622 if (Node->isImmediateEscalating())
1623 OS << " immediate-escalating";
1624}
1625
1627 const CXXBindTemporaryExpr *Node) {
1628 OS << " (CXXTemporary";
1630 OS << ")";
1631}
1632
1634 if (Node->isGlobalNew())
1635 OS << " global";
1636 if (Node->isArray())
1637 OS << " array";
1638 if (Node->getOperatorNew()) {
1639 OS << ' ';
1640 dumpBareDeclRef(Node->getOperatorNew());
1641 }
1642 // We could dump the deallocation function used in case of error, but it's
1643 // usually not that interesting.
1644}
1645
1647 if (Node->isGlobalDelete())
1648 OS << " global";
1649 if (Node->isArrayForm())
1650 OS << " array";
1651 if (Node->getOperatorDelete()) {
1652 OS << ' ';
1653 dumpBareDeclRef(Node->getOperatorDelete());
1654 }
1655}
1656
1658 OS << " " << getTraitSpelling(Node->getTrait());
1659}
1660
1662 OS << " " << getTraitSpelling(Node->getTrait());
1663}
1664
1666 OS << " " << getTraitSpelling(Node->getTrait());
1667}
1668
1670 if (Node->hasRewrittenInit())
1671 OS << " has rewritten init";
1672}
1673
1675 if (Node->hasRewrittenInit())
1676 OS << " has rewritten init";
1677}
1678
1681 if (const ValueDecl *VD = Node->getExtendingDecl()) {
1682 OS << " extended by ";
1683 dumpBareDeclRef(VD);
1684 }
1685}
1686
1688 for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i)
1689 dumpCleanupObject(Node->getObject(i));
1690}
1691
1693 dumpPointer(Node->getPack());
1694 dumpName(Node->getPack());
1695}
1696
1699 OS << " " << (Node->isArrow() ? "->" : ".") << Node->getMember();
1700}
1701
1703 OS << " selector=";
1704 Node->getSelector().print(OS);
1705 switch (Node->getReceiverKind()) {
1707 break;
1708
1710 OS << " class=";
1711 dumpBareType(Node->getClassReceiver());
1712 break;
1713
1715 OS << " super (instance)";
1716 break;
1717
1719 OS << " super (class)";
1720 break;
1721 }
1722}
1723
1725 if (auto *BoxingMethod = Node->getBoxingMethod()) {
1726 OS << " selector=";
1727 BoxingMethod->getSelector().print(OS);
1728 }
1729}
1730
1732 if (!Node->getCatchParamDecl())
1733 OS << " catch all";
1734}
1735
1737 dumpType(Node->getEncodedType());
1738}
1739
1741 OS << " ";
1742 Node->getSelector().print(OS);
1743}
1744
1746 OS << ' ' << *Node->getProtocol();
1747}
1748
1750 if (Node->isImplicitProperty()) {
1751 OS << " Kind=MethodRef Getter=\"";
1752 if (Node->getImplicitPropertyGetter())
1753 Node->getImplicitPropertyGetter()->getSelector().print(OS);
1754 else
1755 OS << "(null)";
1756
1757 OS << "\" Setter=\"";
1758 if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
1759 Setter->getSelector().print(OS);
1760 else
1761 OS << "(null)";
1762 OS << "\"";
1763 } else {
1764 OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty()
1765 << '"';
1766 }
1767
1768 if (Node->isSuperReceiver())
1769 OS << " super";
1770
1771 OS << " Messaging=";
1772 if (Node->isMessagingGetter() && Node->isMessagingSetter())
1773 OS << "Getter&Setter";
1774 else if (Node->isMessagingGetter())
1775 OS << "Getter";
1776 else if (Node->isMessagingSetter())
1777 OS << "Setter";
1778}
1779
1781 const ObjCSubscriptRefExpr *Node) {
1782 if (Node->isArraySubscriptRefExpr())
1783 OS << " Kind=ArraySubscript GetterForArray=\"";
1784 else
1785 OS << " Kind=DictionarySubscript GetterForDictionary=\"";
1786 if (Node->getAtIndexMethodDecl())
1787 Node->getAtIndexMethodDecl()->getSelector().print(OS);
1788 else
1789 OS << "(null)";
1790
1791 if (Node->isArraySubscriptRefExpr())
1792 OS << "\" SetterForArray=\"";
1793 else
1794 OS << "\" SetterForDictionary=\"";
1795 if (Node->setAtIndexMethodDecl())
1796 Node->setAtIndexMethodDecl()->getSelector().print(OS);
1797 else
1798 OS << "(null)";
1799}
1800
1802 OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
1803}
1804
1806 OS << " ";
1807 for (unsigned I = 0, E = Node->numOfIterators(); I < E; ++I) {
1808 Visit(Node->getIteratorDecl(I));
1809 OS << " = ";
1810 const OMPIteratorExpr::IteratorRange Range = Node->getIteratorRange(I);
1811 OS << " begin ";
1812 Visit(Range.Begin);
1813 OS << " end ";
1814 Visit(Range.End);
1815 if (Range.Step) {
1816 OS << " step ";
1817 Visit(Range.Step);
1818 }
1819 }
1820}
1821
1824 OS << " ";
1825 dumpBareDeclRef(Node->getFoundDecl());
1826}
1827
1829 const RequiresExpr *Node) {
1830 if (!Node->isValueDependent())
1831 OS << (Node->isSatisfied() ? " satisfied" : " unsatisfied");
1832}
1833
1835 if (T->isSpelledAsLValue())
1836 OS << " written as lvalue reference";
1837}
1838
1840 switch (T->getSizeModifier()) {
1842 break;
1844 OS << " static";
1845 break;
1847 OS << " *";
1848 break;
1849 }
1850 OS << " " << T->getIndexTypeQualifiers().getAsString();
1851}
1852
1854 OS << " " << T->getSize();
1856}
1857
1859 OS << " ";
1860 dumpSourceRange(T->getBracketsRange());
1862}
1863
1865 const DependentSizedArrayType *T) {
1867 OS << " ";
1868 dumpSourceRange(T->getBracketsRange());
1869}
1870
1873 OS << " ";
1874 dumpLocation(T->getAttributeLoc());
1875}
1876
1878 switch (T->getVectorKind()) {
1880 break;
1882 OS << " altivec";
1883 break;
1885 OS << " altivec pixel";
1886 break;
1888 OS << " altivec bool";
1889 break;
1890 case VectorKind::Neon:
1891 OS << " neon";
1892 break;
1894 OS << " neon poly";
1895 break;
1897 OS << " fixed-length sve data vector";
1898 break;
1900 OS << " fixed-length sve predicate vector";
1901 break;
1903 OS << " fixed-length rvv data vector";
1904 break;
1909 OS << " fixed-length rvv mask vector";
1910 break;
1911 }
1912 OS << " " << T->getNumElements();
1913}
1914
1916 auto EI = T->getExtInfo();
1917 if (EI.getNoReturn())
1918 OS << " noreturn";
1919 if (EI.getProducesResult())
1920 OS << " produces_result";
1921 if (EI.getHasRegParm())
1922 OS << " regparm " << EI.getRegParm();
1923 OS << " " << FunctionType::getNameForCallConv(EI.getCC());
1924}
1925
1927 auto EPI = T->getExtProtoInfo();
1928 if (EPI.HasTrailingReturn)
1929 OS << " trailing_return";
1930 if (T->isConst())
1931 OS << " const";
1932 if (T->isVolatile())
1933 OS << " volatile";
1934 if (T->isRestrict())
1935 OS << " restrict";
1936 if (T->getExtProtoInfo().Variadic)
1937 OS << " variadic";
1938 switch (EPI.RefQualifier) {
1939 case RQ_None:
1940 break;
1941 case RQ_LValue:
1942 OS << " &";
1943 break;
1944 case RQ_RValue:
1945 OS << " &&";
1946 break;
1947 }
1948
1949 switch (EPI.ExceptionSpec.Type) {
1950 case EST_None:
1951 break;
1952 case EST_DynamicNone:
1953 OS << " exceptionspec_dynamic_none";
1954 break;
1955 case EST_Dynamic:
1956 OS << " exceptionspec_dynamic";
1957 break;
1958 case EST_MSAny:
1959 OS << " exceptionspec_ms_any";
1960 break;
1961 case EST_NoThrow:
1962 OS << " exceptionspec_nothrow";
1963 break;
1964 case EST_BasicNoexcept:
1965 OS << " exceptionspec_basic_noexcept";
1966 break;
1968 OS << " exceptionspec_dependent_noexcept";
1969 break;
1970 case EST_NoexceptFalse:
1971 OS << " exceptionspec_noexcept_false";
1972 break;
1973 case EST_NoexceptTrue:
1974 OS << " exceptionspec_noexcept_true";
1975 break;
1976 case EST_Unevaluated:
1977 OS << " exceptionspec_unevaluated";
1978 break;
1979 case EST_Uninstantiated:
1980 OS << " exceptionspec_uninstantiated";
1981 break;
1982 case EST_Unparsed:
1983 OS << " exceptionspec_unparsed";
1984 break;
1985 }
1986 if (!EPI.ExceptionSpec.Exceptions.empty()) {
1987 AddChild([=] {
1988 OS << "Exceptions:";
1989 for (unsigned I = 0, N = EPI.ExceptionSpec.Exceptions.size(); I != N;
1990 ++I) {
1991 if (I)
1992 OS << ",";
1993 dumpType(EPI.ExceptionSpec.Exceptions[I]);
1994 }
1995 });
1996 }
1997 if (EPI.ExceptionSpec.NoexceptExpr) {
1998 AddChild([=] {
1999 OS << "NoexceptExpr: ";
2000 Visit(EPI.ExceptionSpec.NoexceptExpr);
2001 });
2002 }
2003 dumpDeclRef(EPI.ExceptionSpec.SourceDecl, "ExceptionSourceDecl");
2004 dumpDeclRef(EPI.ExceptionSpec.SourceTemplate, "ExceptionSourceTemplate");
2005
2006 // FIXME: Consumed parameters.
2008}
2009
2011 dumpDeclRef(T->getDecl());
2012}
2013
2015 dumpDeclRef(T->getFoundDecl());
2016 if (!T->typeMatchesDecl())
2017 OS << " divergent";
2018}
2019
2021 dumpDeclRef(T->getDecl());
2022 if (!T->typeMatchesDecl())
2023 OS << " divergent";
2024}
2025
2027 switch (T->getUTTKind()) {
2028#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
2029 case UnaryTransformType::Enum: \
2030 OS << " " #Trait; \
2031 break;
2032#include "clang/Basic/TransformTypeTraits.def"
2033 }
2034}
2035
2037 dumpDeclRef(T->getDecl());
2038}
2039
2041 OS << " depth " << T->getDepth() << " index " << T->getIndex();
2042 if (T->isParameterPack())
2043 OS << " pack";
2044 dumpDeclRef(T->getDecl());
2045}
2046
2049 dumpDeclRef(T->getAssociatedDecl());
2050 VisitTemplateTypeParmDecl(T->getReplacedParameter());
2051 if (auto PackIndex = T->getPackIndex())
2052 OS << " pack_index " << *PackIndex;
2053}
2054
2057 dumpDeclRef(T->getAssociatedDecl());
2058 VisitTemplateTypeParmDecl(T->getReplacedParameter());
2059}
2060
2062 if (T->isDecltypeAuto())
2063 OS << " decltype(auto)";
2064 if (!T->isDeduced())
2065 OS << " undeduced";
2066 if (T->isConstrained())
2067 dumpDeclRef(T->getTypeConstraintConcept());
2068}
2069
2072 dumpTemplateName(T->getTemplateName(), "name");
2073}
2074
2077 if (T->isTypeAlias())
2078 OS << " alias";
2079 dumpTemplateName(T->getTemplateName(), "name");
2080}
2081
2083 const InjectedClassNameType *T) {
2084 dumpDeclRef(T->getDecl());
2085}
2086
2088 dumpDeclRef(T->getDecl());
2089}
2090
2092 if (auto N = T->getNumExpansions())
2093 OS << " expansions " << *N;
2094}
2095
2097 // By default, add extra Type details with no extra loc info.
2099}
2100// FIXME: override behavior for TypeLocs that have interesting location
2101// information, such as the qualifier in ElaboratedTypeLoc.
2102
2104
2106 dumpName(D);
2107 dumpType(D->getUnderlyingType());
2108 if (D->isModulePrivate())
2109 OS << " __module_private__";
2110}
2111
2113 if (D->isScoped()) {
2114 if (D->isScopedUsingClassTag())
2115 OS << " class";
2116 else
2117 OS << " struct";
2118 }
2119 dumpName(D);
2120 if (D->isModulePrivate())
2121 OS << " __module_private__";
2122 if (D->isFixed())
2123 dumpType(D->getIntegerType());
2124}
2125
2127 OS << ' ' << D->getKindName();
2128 dumpName(D);
2129 if (D->isModulePrivate())
2130 OS << " __module_private__";
2131 if (D->isCompleteDefinition())
2132 OS << " definition";
2133}
2134
2136 dumpName(D);
2137 dumpType(D->getType());
2138}
2139
2141 dumpName(D);
2142 dumpType(D->getType());
2143
2144 for (const auto *Child : D->chain())
2145 dumpDeclRef(Child);
2146}
2147
2149 dumpName(D);
2150 dumpType(D->getType());
2151 dumpTemplateSpecializationKind(D->getTemplateSpecializationKind());
2152
2153 StorageClass SC = D->getStorageClass();
2154 if (SC != SC_None)
2156 if (D->isInlineSpecified())
2157 OS << " inline";
2158 if (D->isVirtualAsWritten())
2159 OS << " virtual";
2160 if (D->isModulePrivate())
2161 OS << " __module_private__";
2162
2163 if (D->isPureVirtual())
2164 OS << " pure";
2165 if (D->isDefaulted()) {
2166 OS << " default";
2167 if (D->isDeleted())
2168 OS << "_delete";
2169 }
2170 if (D->isDeletedAsWritten())
2171 OS << " delete";
2172 if (D->isTrivial())
2173 OS << " trivial";
2174
2175 if (const StringLiteral *M = D->getDeletedMessage())
2176 AddChild("delete message", [=] { Visit(M); });
2177
2178 if (D->isIneligibleOrNotSelected())
2179 OS << (isa<CXXDestructorDecl>(D) ? " not_selected" : " ineligible");
2180
2181 if (const auto *FPT = D->getType()->getAs<FunctionProtoType>()) {
2182 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
2183 switch (EPI.ExceptionSpec.Type) {
2184 default:
2185 break;
2186 case EST_Unevaluated:
2187 OS << " noexcept-unevaluated " << EPI.ExceptionSpec.SourceDecl;
2188 break;
2189 case EST_Uninstantiated:
2190 OS << " noexcept-uninstantiated " << EPI.ExceptionSpec.SourceTemplate;
2191 break;
2192 }
2193 }
2194
2195 if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
2196 if (MD->size_overridden_methods() != 0) {
2197 auto dumpOverride = [=](const CXXMethodDecl *D) {
2198 SplitQualType T_split = D->getType().split();
2199 OS << D << " " << D->getParent()->getName() << "::" << D->getDeclName()
2200 << " '" << QualType::getAsString(T_split, PrintPolicy) << "'";
2201 };
2202
2203 AddChild([=] {
2204 auto Overrides = MD->overridden_methods();
2205 OS << "Overrides: [ ";
2206 dumpOverride(*Overrides.begin());
2207 for (const auto *Override : llvm::drop_begin(Overrides)) {
2208 OS << ", ";
2209 dumpOverride(Override);
2210 }
2211 OS << " ]";
2212 });
2213 }
2214 }
2215
2216 if (!D->isInlineSpecified() && D->isInlined()) {
2217 OS << " implicit-inline";
2218 }
2219 // Since NumParams comes from the FunctionProtoType of the FunctionDecl and
2220 // the Params are set later, it is possible for a dump during debugging to
2221 // encounter a FunctionDecl that has been created but hasn't been assigned
2222 // ParmVarDecls yet.
2223 if (!D->param_empty() && !D->param_begin())
2224 OS << " <<<NULL params x " << D->getNumParams() << ">>>";
2225
2226 if (const auto *Instance = D->getInstantiatedFromMemberFunction()) {
2227 OS << " instantiated_from";
2228 dumpPointer(Instance);
2229 }
2230}
2231
2233 const CXXDeductionGuideDecl *D) {
2235 switch (D->getDeductionCandidateKind()) {
2238 return;
2240 OS << " aggregate ";
2241 break;
2242 }
2243}
2244
2247 OS << " extended by ";
2248 dumpBareDeclRef(D->getExtendingDecl());
2249 OS << " mangling ";
2250 {
2251 ColorScope Color(OS, ShowColors, ValueColor);
2252 OS << D->getManglingNumber();
2253 }
2254}
2255
2257 dumpName(D);
2258 dumpType(D->getType());
2259 if (D->isMutable())
2260 OS << " mutable";
2261 if (D->isModulePrivate())
2262 OS << " __module_private__";
2263}
2264
2266 dumpNestedNameSpecifier(D->getQualifier());
2267 dumpName(D);
2268 if (const auto *P = dyn_cast<ParmVarDecl>(D);
2269 P && P->isExplicitObjectParameter())
2270 OS << " this";
2271
2272 dumpType(D->getType());
2273 dumpTemplateSpecializationKind(D->getTemplateSpecializationKind());
2274 StorageClass SC = D->getStorageClass();
2275 if (SC != SC_None)
2277 switch (D->getTLSKind()) {
2278 case VarDecl::TLS_None:
2279 break;
2281 OS << " tls";
2282 break;
2284 OS << " tls_dynamic";
2285 break;
2286 }
2287 if (D->isModulePrivate())
2288 OS << " __module_private__";
2289 if (D->isNRVOVariable())
2290 OS << " nrvo";
2291 if (D->isInline())
2292 OS << " inline";
2293 if (D->isConstexpr())
2294 OS << " constexpr";
2295 if (D->hasInit()) {
2296 switch (D->getInitStyle()) {
2297 case VarDecl::CInit:
2298 OS << " cinit";
2299 break;
2300 case VarDecl::CallInit:
2301 OS << " callinit";
2302 break;
2303 case VarDecl::ListInit:
2304 OS << " listinit";
2305 break;
2307 OS << " parenlistinit";
2308 }
2309 }
2310 if (D->needsDestruction(D->getASTContext()))
2311 OS << " destroyed";
2312 if (D->isParameterPack())
2313 OS << " pack";
2314
2315 if (D->hasInit()) {
2316 const Expr *E = D->getInit();
2317 // Only dump the value of constexpr VarDecls for now.
2318 if (E && !E->isValueDependent() && D->isConstexpr() &&
2319 !D->getType()->isDependentType()) {
2320 const APValue *Value = D->evaluateValue();
2321 if (Value)
2322 AddChild("value", [=] { Visit(*Value, E->getType()); });
2323 }
2324 }
2325}
2326
2328 dumpName(D);
2329 dumpType(D->getType());
2330}
2331
2333 if (D->isNothrow())
2334 OS << " nothrow";
2335}
2336
2338 OS << ' ' << D->getImportedModule()->getFullModuleName();
2339
2340 for (Decl *InitD :
2341 D->getASTContext().getModuleInitializers(D->getImportedModule()))
2342 dumpDeclRef(InitD, "initializer");
2343}
2344
2346 OS << ' ';
2347 switch (D->getCommentKind()) {
2348 case PCK_Unknown:
2349 llvm_unreachable("unexpected pragma comment kind");
2350 case PCK_Compiler:
2351 OS << "compiler";
2352 break;
2353 case PCK_ExeStr:
2354 OS << "exestr";
2355 break;
2356 case PCK_Lib:
2357 OS << "lib";
2358 break;
2359 case PCK_Linker:
2360 OS << "linker";
2361 break;
2362 case PCK_User:
2363 OS << "user";
2364 break;
2365 }
2366 StringRef Arg = D->getArg();
2367 if (!Arg.empty())
2368 OS << " \"" << Arg << "\"";
2369}
2370
2372 const PragmaDetectMismatchDecl *D) {
2373 OS << " \"" << D->getName() << "\" \"" << D->getValue() << "\"";
2374}
2375
2377 const OMPExecutableDirective *D) {
2378 if (D->isStandaloneDirective())
2379 OS << " openmp_standalone_directive";
2380}
2381
2383 const OMPDeclareReductionDecl *D) {
2384 dumpName(D);
2385 dumpType(D->getType());
2386 OS << " combiner";
2387 dumpPointer(D->getCombiner());
2388 if (const auto *Initializer = D->getInitializer()) {
2389 OS << " initializer";
2391 switch (D->getInitializerKind()) {
2393 OS << " omp_priv = ";
2394 break;
2396 OS << " omp_priv ()";
2397 break;
2399 break;
2400 }
2401 }
2402}
2403
2405 for (const auto *C : D->clauselists()) {
2406 AddChild([=] {
2407 if (!C) {
2408 ColorScope Color(OS, ShowColors, NullColor);
2409 OS << "<<<NULL>>> OMPClause";
2410 return;
2411 }
2412 {
2413 ColorScope Color(OS, ShowColors, AttrColor);
2414 StringRef ClauseName(
2415 llvm::omp::getOpenMPClauseName(C->getClauseKind()));
2416 OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
2417 << ClauseName.drop_front() << "Clause";
2418 }
2419 dumpPointer(C);
2420 dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
2421 });
2422 }
2423}
2424
2426 dumpName(D);
2427 dumpType(D->getType());
2428}
2429
2431 dumpName(D);
2432 if (D->isInline())
2433 OS << " inline";
2434 if (D->isNested())
2435 OS << " nested";
2436 if (!D->isFirstDecl())
2437 dumpDeclRef(D->getFirstDecl(), "original");
2438}
2439
2441 OS << ' ';
2442 dumpBareDeclRef(D->getNominatedNamespace());
2443}
2444
2446 dumpName(D);
2447 dumpDeclRef(D->getAliasedNamespace());
2448}
2449
2451 dumpName(D);
2452 dumpType(D->getUnderlyingType());
2453}
2454
2456 const TypeAliasTemplateDecl *D) {
2457 dumpName(D);
2458}
2459
2462 if (const auto *Instance = D->getInstantiatedFromMemberClass()) {
2463 OS << " instantiated_from";
2464 dumpPointer(Instance);
2465 }
2466 if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
2467 dumpTemplateSpecializationKind(CTSD->getSpecializationKind());
2468
2469 dumpNestedNameSpecifier(D->getQualifier());
2470
2471 if (!D->isCompleteDefinition())
2472 return;
2473
2474 AddChild([=] {
2475 {
2476 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2477 OS << "DefinitionData";
2478 }
2479#define FLAG(fn, name) \
2480 if (D->fn()) \
2481 OS << " " #name;
2482 FLAG(isParsingBaseSpecifiers, parsing_base_specifiers);
2483
2484 FLAG(isGenericLambda, generic);
2485 FLAG(isLambda, lambda);
2486
2487 FLAG(isAnonymousStructOrUnion, is_anonymous);
2488 FLAG(canPassInRegisters, pass_in_registers);
2489 FLAG(isEmpty, empty);
2490 FLAG(isAggregate, aggregate);
2491 FLAG(isStandardLayout, standard_layout);
2492 FLAG(isTriviallyCopyable, trivially_copyable);
2493 FLAG(isPOD, pod);
2494 FLAG(isTrivial, trivial);
2495 FLAG(isPolymorphic, polymorphic);
2496 FLAG(isAbstract, abstract);
2497 FLAG(isLiteral, literal);
2498
2499 FLAG(hasUserDeclaredConstructor, has_user_declared_ctor);
2500 FLAG(hasConstexprNonCopyMoveConstructor, has_constexpr_non_copy_move_ctor);
2501 FLAG(hasMutableFields, has_mutable_fields);
2502 FLAG(hasVariantMembers, has_variant_members);
2503 FLAG(allowConstDefaultInit, can_const_default_init);
2504
2505 AddChild([=] {
2506 {
2507 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2508 OS << "DefaultConstructor";
2509 }
2510 FLAG(hasDefaultConstructor, exists);
2511 FLAG(hasTrivialDefaultConstructor, trivial);
2512 FLAG(hasNonTrivialDefaultConstructor, non_trivial);
2513 FLAG(hasUserProvidedDefaultConstructor, user_provided);
2514 FLAG(hasConstexprDefaultConstructor, constexpr);
2515 FLAG(needsImplicitDefaultConstructor, needs_implicit);
2516 FLAG(defaultedDefaultConstructorIsConstexpr, defaulted_is_constexpr);
2517 });
2518
2519 AddChild([=] {
2520 {
2521 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2522 OS << "CopyConstructor";
2523 }
2524 FLAG(hasSimpleCopyConstructor, simple);
2525 FLAG(hasTrivialCopyConstructor, trivial);
2526 FLAG(hasNonTrivialCopyConstructor, non_trivial);
2527 FLAG(hasUserDeclaredCopyConstructor, user_declared);
2528 FLAG(hasCopyConstructorWithConstParam, has_const_param);
2529 FLAG(needsImplicitCopyConstructor, needs_implicit);
2530 FLAG(needsOverloadResolutionForCopyConstructor,
2531 needs_overload_resolution);
2532 if (!D->needsOverloadResolutionForCopyConstructor())
2533 FLAG(defaultedCopyConstructorIsDeleted, defaulted_is_deleted);
2534 FLAG(implicitCopyConstructorHasConstParam, implicit_has_const_param);
2535 });
2536
2537 AddChild([=] {
2538 {
2539 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2540 OS << "MoveConstructor";
2541 }
2542 FLAG(hasMoveConstructor, exists);
2543 FLAG(hasSimpleMoveConstructor, simple);
2544 FLAG(hasTrivialMoveConstructor, trivial);
2545 FLAG(hasNonTrivialMoveConstructor, non_trivial);
2546 FLAG(hasUserDeclaredMoveConstructor, user_declared);
2547 FLAG(needsImplicitMoveConstructor, needs_implicit);
2548 FLAG(needsOverloadResolutionForMoveConstructor,
2549 needs_overload_resolution);
2550 if (!D->needsOverloadResolutionForMoveConstructor())
2551 FLAG(defaultedMoveConstructorIsDeleted, defaulted_is_deleted);
2552 });
2553
2554 AddChild([=] {
2555 {
2556 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2557 OS << "CopyAssignment";
2558 }
2559 FLAG(hasSimpleCopyAssignment, simple);
2560 FLAG(hasTrivialCopyAssignment, trivial);
2561 FLAG(hasNonTrivialCopyAssignment, non_trivial);
2562 FLAG(hasCopyAssignmentWithConstParam, has_const_param);
2563 FLAG(hasUserDeclaredCopyAssignment, user_declared);
2564 FLAG(needsImplicitCopyAssignment, needs_implicit);
2565 FLAG(needsOverloadResolutionForCopyAssignment, needs_overload_resolution);
2566 FLAG(implicitCopyAssignmentHasConstParam, implicit_has_const_param);
2567 });
2568
2569 AddChild([=] {
2570 {
2571 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2572 OS << "MoveAssignment";
2573 }
2574 FLAG(hasMoveAssignment, exists);
2575 FLAG(hasSimpleMoveAssignment, simple);
2576 FLAG(hasTrivialMoveAssignment, trivial);
2577 FLAG(hasNonTrivialMoveAssignment, non_trivial);
2578 FLAG(hasUserDeclaredMoveAssignment, user_declared);
2579 FLAG(needsImplicitMoveAssignment, needs_implicit);
2580 FLAG(needsOverloadResolutionForMoveAssignment, needs_overload_resolution);
2581 });
2582
2583 AddChild([=] {
2584 {
2585 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2586 OS << "Destructor";
2587 }
2588 FLAG(hasSimpleDestructor, simple);
2589 FLAG(hasIrrelevantDestructor, irrelevant);
2590 FLAG(hasTrivialDestructor, trivial);
2591 FLAG(hasNonTrivialDestructor, non_trivial);
2592 FLAG(hasUserDeclaredDestructor, user_declared);
2593 FLAG(hasConstexprDestructor, constexpr);
2594 FLAG(needsImplicitDestructor, needs_implicit);
2595 FLAG(needsOverloadResolutionForDestructor, needs_overload_resolution);
2596 if (!D->needsOverloadResolutionForDestructor())
2597 FLAG(defaultedDestructorIsDeleted, defaulted_is_deleted);
2598 });
2599 });
2600
2601 for (const auto &I : D->bases()) {
2602 AddChild([=] {
2603 if (I.isVirtual())
2604 OS << "virtual ";
2605 dumpAccessSpecifier(I.getAccessSpecifier());
2606 dumpType(I.getType());
2607 if (I.isPackExpansion())
2608 OS << "...";
2609 });
2610 }
2611}
2612
2614 dumpName(D);
2615}
2616
2618 dumpName(D);
2619}
2620
2622 dumpName(D);
2623}
2624
2626 dumpName(D);
2627}
2628
2630 if (const auto *TC = D->getTypeConstraint()) {
2631 OS << " ";
2632 dumpBareDeclRef(TC->getNamedConcept());
2633 if (TC->getNamedConcept() != TC->getFoundDecl()) {
2634 OS << " (";
2635 dumpBareDeclRef(TC->getFoundDecl());
2636 OS << ")";
2637 }
2638 } else if (D->wasDeclaredWithTypename())
2639 OS << " typename";
2640 else
2641 OS << " class";
2642 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2643 if (D->isParameterPack())
2644 OS << " ...";
2645 dumpName(D);
2646}
2647
2649 const NonTypeTemplateParmDecl *D) {
2650 dumpType(D->getType());
2651 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2652 if (D->isParameterPack())
2653 OS << " ...";
2654 dumpName(D);
2655}
2656
2658 const TemplateTemplateParmDecl *D) {
2659 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2660 if (D->isParameterPack())
2661 OS << " ...";
2662 dumpName(D);
2663}
2664
2666 OS << ' ';
2667 if (D->getQualifier())
2668 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
2669 OS << D->getDeclName();
2670 dumpNestedNameSpecifier(D->getQualifier());
2671}
2672
2674 OS << ' ';
2675 dumpBareDeclRef(D->getEnumDecl());
2676}
2677
2680 OS << ' ';
2681 if (D->getQualifier())
2682 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
2683 OS << D->getDeclName();
2684}
2685
2687 const UnresolvedUsingValueDecl *D) {
2688 OS << ' ';
2689 if (D->getQualifier())
2690 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
2691 OS << D->getDeclName();
2692 dumpType(D->getType());
2693}
2694
2696 OS << ' ';
2697 dumpBareDeclRef(D->getTargetDecl());
2698}
2699
2702 if (D->constructsVirtualBase())
2703 OS << " virtual";
2704
2705 AddChild([=] {
2706 OS << "target ";
2707 dumpBareDeclRef(D->getTargetDecl());
2708 });
2709
2710 AddChild([=] {
2711 OS << "nominated ";
2712 dumpBareDeclRef(D->getNominatedBaseClass());
2713 OS << ' ';
2714 dumpBareDeclRef(D->getNominatedBaseClassShadowDecl());
2715 });
2716
2717 AddChild([=] {
2718 OS << "constructed ";
2719 dumpBareDeclRef(D->getConstructedBaseClass());
2720 OS << ' ';
2721 dumpBareDeclRef(D->getConstructedBaseClassShadowDecl());
2722 });
2723}
2724
2726 switch (D->getLanguage()) {
2728 OS << " C";
2729 break;
2731 OS << " C++";
2732 break;
2733 }
2734}
2735
2737 OS << ' ';
2739}
2740
2742 if (TypeSourceInfo *T = D->getFriendType())
2743 dumpType(T->getType());
2744 if (D->isPackExpansion())
2745 OS << "...";
2746}
2747
2749 dumpName(D);
2750 dumpType(D->getType());
2751 if (D->getSynthesize())
2752 OS << " synthesize";
2753
2754 switch (D->getAccessControl()) {
2755 case ObjCIvarDecl::None:
2756 OS << " none";
2757 break;
2759 OS << " private";
2760 break;
2762 OS << " protected";
2763 break;
2765 OS << " public";
2766 break;
2768 OS << " package";
2769 break;
2770 }
2771}
2772
2774 if (D->isInstanceMethod())
2775 OS << " -";
2776 else
2777 OS << " +";
2778 dumpName(D);
2779 dumpType(D->getReturnType());
2780
2781 if (D->isVariadic())
2782 OS << " variadic";
2783}
2784
2786 dumpName(D);
2787 switch (D->getVariance()) {
2789 break;
2790
2792 OS << " covariant";
2793 break;
2794
2796 OS << " contravariant";
2797 break;
2798 }
2799
2800 if (D->hasExplicitBound())
2801 OS << " bounded";
2802 dumpType(D->getUnderlyingType());
2803}
2804
2806 dumpName(D);
2807 dumpDeclRef(D->getClassInterface());
2808 dumpDeclRef(D->getImplementation());
2809 for (const auto *P : D->protocols())
2810 dumpDeclRef(P);
2811}
2812
2814 dumpName(D);
2815 dumpDeclRef(D->getClassInterface());
2816 dumpDeclRef(D->getCategoryDecl());
2817}
2818
2820 dumpName(D);
2821
2822 for (const auto *Child : D->protocols())
2823 dumpDeclRef(Child);
2824}
2825
2827 dumpName(D);
2828 dumpDeclRef(D->getSuperClass(), "super");
2829
2830 dumpDeclRef(D->getImplementation());
2831 for (const auto *Child : D->protocols())
2832 dumpDeclRef(Child);
2833}
2834
2836 const ObjCImplementationDecl *D) {
2837 dumpName(D);
2838 dumpDeclRef(D->getSuperClass(), "super");
2839 dumpDeclRef(D->getClassInterface());
2840}
2841
2843 const ObjCCompatibleAliasDecl *D) {
2844 dumpName(D);
2845 dumpDeclRef(D->getClassInterface());
2846}
2847
2849 dumpName(D);
2850 dumpType(D->getType());
2851
2852 if (D->getPropertyImplementation() == ObjCPropertyDecl::Required)
2853 OS << " required";
2854 else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional)
2855 OS << " optional";
2856
2857 ObjCPropertyAttribute::Kind Attrs = D->getPropertyAttributes();
2860 OS << " readonly";
2862 OS << " assign";
2864 OS << " readwrite";
2866 OS << " retain";
2868 OS << " copy";
2870 OS << " nonatomic";
2872 OS << " atomic";
2874 OS << " weak";
2876 OS << " strong";
2878 OS << " unsafe_unretained";
2880 OS << " class";
2882 OS << " direct";
2884 dumpDeclRef(D->getGetterMethodDecl(), "getter");
2886 dumpDeclRef(D->getSetterMethodDecl(), "setter");
2887 }
2888}
2889
2891 dumpName(D->getPropertyDecl());
2892 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize)
2893 OS << " synthesize";
2894 else
2895 OS << " dynamic";
2896 dumpDeclRef(D->getPropertyDecl());
2897 dumpDeclRef(D->getPropertyIvarDecl());
2898}
2899
2901 if (D->isVariadic())
2902 OS << " variadic";
2903
2904 if (D->capturesCXXThis())
2905 OS << " captures_this";
2906}
2907
2909 dumpName(D);
2910}
2911
2913 VisitStmt(S);
2914 if (S->hasStoredFPFeatures())
2915 printFPOptions(S->getStoredFPFeatures());
2916}
2917
2919 if (D->isCBuffer())
2920 OS << " cbuffer";
2921 else
2922 OS << " tbuffer";
2923 dumpName(D);
2924}
2925
2927 OS << (E->isInOut() ? " inout" : " out");
2928}
2929
2931 OS << " " << S->getDirectiveKind();
2932}
2934
2935 if (S->isOrphanedLoopConstruct())
2936 OS << " <orphan>";
2937 else
2938 OS << " parent: " << S->getParentComputeConstructKind();
2939}
2940
2942 const OpenACCCombinedConstruct *S) {
2943 OS << " " << S->getDirectiveKind();
2944}
2945
2947 OS << " " << S->getDirectiveKind();
2948}
2949
2951 const OpenACCEnterDataConstruct *S) {
2952 OS << " " << S->getDirectiveKind();
2953}
2954
2956 const OpenACCExitDataConstruct *S) {
2957 OS << " " << S->getDirectiveKind();
2958}
2959
2961 const OpenACCHostDataConstruct *S) {
2962 OS << " " << S->getDirectiveKind();
2963}
2964
2966 OS << " " << S->getDirectiveKind();
2967}
2969 OS << " " << S->getDirectiveKind();
2970}
2972 const OpenACCShutdownConstruct *S) {
2973 OS << " " << S->getDirectiveKind();
2974}
2976 OS << " " << S->getDirectiveKind();
2977}
2978
2980 AddChild("begin", [=] { OS << S->getStartingElementPos(); });
2981 AddChild("number of elements", [=] { OS << S->getDataElementCount(); });
2982}
2983
2985 OS << ' ' << AE->getOpAsString();
2986}
static double GetApproxValue(const llvm::APFloat &F)
Definition: APValue.cpp:622
#define V(N, I)
Definition: ASTContext.h:3443
DynTypedNode Node
#define SM(sm)
Definition: Cuda.cpp:84
static bool isTrivial(ASTContext &Ctx, const Expr *E)
Checks if the expression is constant or does not have non-trivial function calls.
const Decl * D
Expr * E
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
#define X(type, name)
Definition: Value.h:144
bool ShowColors
Definition: Logger.cpp:29
Defines the clang::Module class, which describes a module in the source code.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
static bool canPassInRegisters(Sema &S, CXXRecordDecl *D, TargetInfo::CallingConvKind CCK)
Determine whether a type is permitted to be passed or returned in registers, per C++ [class....
SourceRange Range
Definition: SemaObjC.cpp:758
SourceLocation Loc
Definition: SemaObjC.cpp:759
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static bool isSimpleAPValue(const APValue &Value)
True if the APValue Value can be folded onto the current line.
#define FLAG(fn, name)
static void dumpBasePath(raw_ostream &OS, const CastExpr *Node)
static void dumpPreviousDeclImpl(raw_ostream &OS,...)
static void dumpPreviousDecl(raw_ostream &OS, const Decl *D)
Dump the previous declaration in the redeclaration chain for a declaration, if any.
Defines enumerations for the type traits support.
C Language Family Type Representation.
std::string Label
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:188
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const
Retrieve the "canonical" template argument.
ArrayRef< Decl * > getModuleInitializers(Module *M)
Get the initializations to perform when importing a module, if any.
TemplateName getCanonicalTemplateName(TemplateName Name, bool IgnoreDeduced=false) const
Retrieves the "canonical" template name that refers to a given template.
const clang::PrintingPolicy & getPrintingPolicy() const
Definition: ASTContext.h:733
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:4421
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
Definition: ExprCXX.h:2853
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition: Type.h:3577
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Definition: Expr.h:6678
StringRef getOpAsString() const
Definition: Expr.h:6743
Attr - This represents one attribute.
Definition: Attr.h:43
attr::Kind getKind() const
Definition: Attr.h:89
bool isInherited() const
Definition: Attr.h:98
bool isImplicit() const
Returns true if the attribute has been implicitly created instead of explicitly written by the user.
Definition: Attr.h:102
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
Definition: Type.h:6556
A builtin binary operation expression such as "x + y" or "x <= y".
Definition: Expr.h:3909
StringRef getOpcodeStr() const
Definition: Expr.h:3975
A binding in a decomposition declaration.
Definition: DeclCXX.h:4125
A class which contains all the information about a particular captured value.
Definition: Decl.h:4480
Represents a block literal declaration, which is like an unnamed FunctionDecl.
Definition: Decl.h:4474
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:1491
A boolean literal, per ([C++ lex.bool] Boolean literals).
Definition: ExprCXX.h:720
Represents a call to a C++ constructor.
Definition: ExprCXX.h:1546
Represents a C++ constructor within a class.
Definition: DeclCXX.h:2553
Represents a C++ base or member initializer.
Definition: DeclCXX.h:2318
Represents a C++ deduction guide declaration.
Definition: DeclCXX.h:1967
A default argument (C++ [dcl.fct.default]).
Definition: ExprCXX.h:1268
A use of a default initializer in a constructor or in aggregate initialization.
Definition: ExprCXX.h:1375
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition: ExprCXX.h:2498
Represents a C++ member access expression where the actual member referenced could not be resolved be...
Definition: ExprCXX.h:3683
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Definition: ExprCXX.h:1817
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2078
Abstract class common to all of the C++ "named"/"keyword" casts.
Definition: ExprCXX.h:372
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition: ExprCXX.h:2241
A call to an overloaded operator written using operator syntax.
Definition: ExprCXX.h:81
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
A C++ static_cast expression (C++ [expr.static.cast]).
Definition: ExprCXX.h:433
Represents the this expression in C++.
Definition: ExprCXX.h:1152
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
Definition: ExprCXX.h:3557
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition: Expr.h:2874
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition: Decl.h:4673
CaseStmt - Represent a case statement.
Definition: Stmt.h:1828
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition: Expr.h:3547
const CXXBaseSpecifier *const * path_const_iterator
Definition: Expr.h:3614
Declaration of a class template.
Represents a 'co_await' expression.
Definition: ExprCXX.h:5191
CompoundAssignOperator - For compound assignments (e.g.
Definition: Expr.h:4171
CompoundLiteralExpr - [C99 6.5.2.5].
Definition: Expr.h:3477
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition: Stmt.h:1628
Declaration of a C++20 concept.
A reference to a concept and its template args, as it appears in the code.
Definition: ASTConcept.h:124
SourceRange getSourceRange() const LLVM_READONLY
Definition: ASTConcept.h:191
ConceptDecl * getNamedConcept() const
Definition: ASTConcept.h:199
Represents the specialization of a concept - evaluates to a prvalue of type bool.
Definition: ExprConcepts.h:42
Represents the canonical version of C arrays with a specified constant size.
Definition: Type.h:3615
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Definition: Expr.h:1077
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition: DeclCXX.h:3616
Represents a 'co_return' statement in the C++ Coroutines TS.
Definition: StmtCXX.h:473
A reference to a declared variable, function, enum, etc.
Definition: Expr.h:1265
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Definition: DeclBase.h:1050
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
Definition: DeclBase.h:645
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition: DeclBase.h:1215
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:520
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition: DeclBase.h:596
bool isParameterPack() const
Whether this declaration is a parameter pack.
Definition: DeclBase.cpp:239
@ FOK_Undeclared
A friend of a previously-undeclared entity.
Definition: DeclBase.h:1208
@ FOK_None
Not a friend object.
Definition: DeclBase.h:1206
@ FOK_Declared
A friend of a previously-declared entity.
Definition: DeclBase.h:1207
Module * getOwningModule() const
Get the module that owns this declaration (for visibility purposes).
Definition: DeclBase.h:835
bool isFirstDecl() const
True if this is the first declaration in its redeclaration chain.
Definition: DeclBase.h:1059
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
Definition: DeclBase.h:786
bool isInvalidDecl() const
Definition: DeclBase.h:591
SourceLocation getLocation() const
Definition: DeclBase.h:442
const char * getDeclKindName() const
Definition: DeclBase.cpp:142
bool isThisDeclarationReferenced() const
Whether this declaration was referenced.
Definition: DeclBase.h:624
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition: DeclBase.cpp:549
DeclContext * getDeclContext()
Definition: DeclBase.h:451
AccessSpecifier getAccess() const
Definition: DeclBase.h:510
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition: DeclBase.h:907
Kind getKind() const
Definition: DeclBase.h:445
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
Definition: DeclBase.h:430
Represents a C++17 deduced template specialization type.
Definition: Type.h:6604
TemplateName getUnderlying() const
Definition: TemplateName.h:458
DefaultArguments getDefaultArguments() const
Definition: TemplateName.h:460
A qualified reference to a name whose declaration cannot yet be resolved.
Definition: ExprCXX.h:3323
Represents an array type in C++ whose size is a value-dependent expression.
Definition: Type.h:3862
Represents an extended vector type where either the type or size is dependent.
Definition: Type.h:3960
Represents a dependent template name that cannot be resolved prior to template instantiation.
Definition: TemplateName.h:548
NestedNameSpecifier * getQualifier() const
Return the nested name specifier that qualifies this name.
Definition: TemplateName.h:604
SourceRange getSourceRange() const
For nodes which represent textual entities in the source code, return their SourceRange.
void print(llvm::raw_ostream &OS, const PrintingPolicy &PP) const
Prints the node to the given output stream.
Represents a reference to #emded data.
Definition: Expr.h:4916
An instance of this object exists for each enum constant that is defined.
Definition: Decl.h:3277
Represents an enum.
Definition: Decl.h:3847
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
Definition: ExprCXX.h:3474
llvm::PointerUnion< BlockDecl *, CompoundLiteralExpr * > CleanupObject
The type of objects that are kept in the cleanup.
Definition: ExprCXX.h:3480
This represents one expression.
Definition: Expr.h:110
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition: Expr.h:175
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
Definition: Expr.h:437
bool containsErrors() const
Whether this expression contains subexpressions which had errors, e.g.
Definition: Expr.h:245
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
Definition: Expr.h:444
QualType getType() const
Definition: Expr.h:142
An expression trait intrinsic.
Definition: ExprCXX.h:2924
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
Definition: Expr.h:6354
Represents difference between two FPOptions values.
Definition: LangOptions.h:978
Represents a member of a struct/union/class.
Definition: Decl.h:3033
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
Definition: DeclFriend.h:54
Represents a function declaration or definition.
Definition: Decl.h:1935
Represents a prototype with parameter type info, e.g.
Definition: Type.h:5102
ExtProtoInfo getExtProtoInfo() const
Definition: Type.h:5366
Declaration of a template function.
Definition: DeclTemplate.h:959
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: Type.h:4321
ExtInfo getExtInfo() const
Definition: Type.h:4655
static StringRef getNameForCallConv(CallingConv CC)
Definition: Type.cpp:3537
bool isConst() const
Definition: Type.h:4661
bool isRestrict() const
Definition: Type.h:4663
bool isVolatile() const
Definition: Type.h:4662
Represents a C11 generic selection.
Definition: Expr.h:5966
AssociationTy< true > ConstAssociation
Definition: Expr.h:6198
GotoStmt - This represents a direct goto.
Definition: Stmt.h:2889
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
Definition: Decl.h:4927
This class represents temporary values used to represent inout and out arguments in HLSL.
Definition: Expr.h:7152
IfStmt - This represents an if/then/else.
Definition: Stmt.h:2165
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition: Expr.h:3724
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Definition: Decl.h:4786
Represents a field injected from an anonymous union/struct into the parent scope.
Definition: Decl.h:3321
Describes an C or C++ initializer list.
Definition: Expr.h:5088
FieldDecl * getInitializedFieldInUnion()
If this initializes a union, specifies which field in the union to initialize.
Definition: Expr.h:5207
The injected class name of a C++ class template or class template partial specialization.
Definition: Type.h:6793
Represents the declaration of a label.
Definition: Decl.h:503
LabelStmt - Represents a label, which has a substatement.
Definition: Stmt.h:2058
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
Definition: DeclCXX.h:3247
Represents a linkage specification.
Definition: DeclCXX.h:2952
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition: ExprCXX.h:4734
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition: Expr.h:3236
Provides common interface for the Decls that cannot be redeclared, but can be merged if the same decl...
Definition: Redeclarable.h:313
Describes a module or submodule.
Definition: Module.h:115
This represents a decl that may have a name.
Definition: Decl.h:253
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition: Decl.h:319
Represents a C++ namespace alias.
Definition: DeclCXX.h:3138
Represent a C++ namespace.
Definition: Decl.h:551
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
SpecifierKind getKind() const
Determine what kind of nested name specifier is stored.
NestedNameSpecifier * getPrefix() const
Return the prefix of this nested name specifier.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Pseudo declaration for capturing expressions.
Definition: DeclOpenMP.h:383
This is a basic class for representing single OpenMP clause.
Definition: OpenMPClause.h:55
This represents '#pragma omp declare reduction ...' directive.
Definition: DeclOpenMP.h:177
This is a basic class for representing single OpenMP executable directive.
Definition: StmtOpenMP.h:266
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
Definition: ExprOpenMP.h:151
This represents '#pragma omp requires...' directive.
Definition: DeclOpenMP.h:417
Represents Objective-C's @catch statement.
Definition: StmtObjC.h:77
ObjCBoolLiteralExpr - Objective-C Boolean Literal.
Definition: ExprObjC.h:87
ObjCBoxedExpr - used for generalized expression boxing.
Definition: ExprObjC.h:127
ObjCCategoryDecl - Represents a category declaration.
Definition: DeclObjC.h:2328
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
Definition: DeclObjC.h:2544
ObjCCompatibleAliasDecl - Represents alias of a class.
Definition: DeclObjC.h:2774
ObjCEncodeExpr, used for @encode in Objective-C.
Definition: ExprObjC.h:410
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition: DeclObjC.h:2596
Represents an ObjC class declaration.
Definition: DeclObjC.h:1153
Interfaces are the core concept in Objective-C for object oriented design.
Definition: Type.h:7524
ObjCIvarDecl - Represents an ObjC instance variable.
Definition: DeclObjC.h:1951
ObjCIvarRefExpr - A reference to an ObjC instance variable.
Definition: ExprObjC.h:549
An expression that sends a message to the given Objective-C object or class.
Definition: ExprObjC.h:941
@ SuperInstance
The receiver is the instance of the superclass object.
Definition: ExprObjC.h:955
@ Instance
The receiver is an object instance.
Definition: ExprObjC.h:949
@ SuperClass
The receiver is a superclass.
Definition: ExprObjC.h:952
@ Class
The receiver is a class.
Definition: ExprObjC.h:946
ObjCMethodDecl - Represents an instance or class method declaration.
Definition: DeclObjC.h:140
Represents one property declaration in an Objective-C interface.
Definition: DeclObjC.h:730
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
Definition: DeclObjC.h:2804
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
Definition: ExprObjC.h:617
Represents an Objective-C protocol declaration.
Definition: DeclObjC.h:2083
ObjCProtocolExpr used for protocol expression in Objective-C.
Definition: ExprObjC.h:505
ObjCSelectorExpr used for @selector in Objective-C.
Definition: ExprObjC.h:455
ObjCSubscriptRefExpr - used for array and dictionary subscripting.
Definition: ExprObjC.h:840
Represents the declaration of an Objective-C type parameter.
Definition: DeclObjC.h:578
This expression type represents an asterisk in an OpenACC Size-Expr, used in the 'tile' and 'gang' cl...
Definition: Expr.h:2078
This is the base type for all OpenACC Clauses.
Definition: OpenACCClause.h:24
This is the base class for an OpenACC statement-level construct, other construct types are expected t...
Definition: StmtOpenACC.h:25
This class represents a 'loop' construct.
Definition: StmtOpenACC.h:194
Represents a pack expansion of types.
Definition: Type.h:7141
Represents a #pragma comment line.
Definition: Decl.h:146
Represents a #pragma detect_mismatch line.
Definition: Decl.h:180
[C99 6.4.2.2] - A predefined identifier such as func.
Definition: Expr.h:1991
StringRef getIdentKindName() const
Definition: Expr.h:2048
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: Type.h:929
std::string getAsString() const
Represents a template name as written in source code.
Definition: TemplateName.h:491
TemplateName getUnderlyingTemplate() const
Return the underlying template name.
Definition: TemplateName.h:526
NestedNameSpecifier * getQualifier() const
Return the nested name specifier that qualifies this name.
Definition: TemplateName.h:519
bool hasTemplateKeyword() const
Whether the template name was prefixed by the "template" keyword.
Definition: TemplateName.h:523
Represents a struct/union/class.
Definition: Decl.h:4148
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Definition: Type.h:6072
RecordDecl * getDecl() const
Definition: Type.h:6082
Provides common interface for the Decls that can be redeclared.
Definition: Redeclarable.h:84
Base for LValueReferenceType and RValueReferenceType.
Definition: Type.h:3439
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
Definition: ExprConcepts.h:502
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Definition: Stmt.h:3046
Represents an expression that computes the length of a parameter pack.
Definition: ExprCXX.h:4258
Encodes a location in the source.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
bool isValid() const
RetTy Visit(PTR(Stmt) S, ParamTys... P)
Definition: StmtVisitor.h:44
Stmt - This represents one statement.
Definition: Stmt.h:84
StringLiteral - This represents a string literal expression, e.g.
Definition: Expr.h:1778
void outputString(raw_ostream &OS) const
Definition: Expr.cpp:1209
A structure for storing the information associated with a substituted template template parameter.
Definition: TemplateName.h:408
std::optional< unsigned > getPackIndex() const
Definition: TemplateName.h:432
TemplateTemplateParmDecl * getParameter() const
unsigned getIndex() const
Returns the index of the replaced parameter in the associated declaration.
Definition: TemplateName.h:430
Decl * getAssociatedDecl() const
A template-like entity which owns the whole pattern being substituted.
Definition: TemplateName.h:426
Represents the result of substituting a set of types for a template type parameter pack.
Definition: Type.h:6464
Represents the result of substituting a type for a template type parameter.
Definition: Type.h:6383
SwitchStmt - This represents a 'switch' stmt.
Definition: Stmt.h:2415
Represents a template argument.
Definition: TemplateBase.h:61
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
Definition: TemplateBase.h:343
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.
Definition: TemplateBase.h:326
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
Definition: TemplateBase.h:350
Represents a C++ template name within the type system.
Definition: TemplateName.h:220
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...
Definition: TemplateName.h:265
@ OverloadedTemplate
A set of overloaded template declarations.
Definition: TemplateName.h:240
@ Template
A single template declaration.
Definition: TemplateName.h:237
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
Definition: TemplateName.h:252
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
Definition: TemplateName.h:256
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
Definition: TemplateName.h:261
@ DeducedTemplate
A template name that refers to another TemplateName with deduced default arguments.
Definition: TemplateName.h:269
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
Definition: TemplateName.h:248
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
Definition: TemplateName.h:244
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.
Represents a type template specialization; the template must be a class template, a type alias templa...
Definition: Type.h:6661
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
void VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node)
void VisitEnumDecl(const EnumDecl *D)
void VisitExprWithCleanups(const ExprWithCleanups *Node)
void visitInlineCommandComment(const comments::InlineCommandComment *C, const comments::FullComment *)
void VisitCXXStaticCastExpr(const CXXStaticCastExpr *Node)
void visitVerbatimBlockComment(const comments::VerbatimBlockComment *C, const comments::FullComment *)
void dumpPointer(const void *Ptr)
void VisitDeclarationTemplateArgument(const TemplateArgument &TA)
void VisitOpenACCLoopConstruct(const OpenACCLoopConstruct *S)
void VisitLinkageSpecDecl(const LinkageSpecDecl *D)
void VisitVectorType(const VectorType *T)
void VisitCoawaitExpr(const CoawaitExpr *Node)
void VisitUnaryOperator(const UnaryOperator *Node)
void dumpAccessSpecifier(AccessSpecifier AS)
void VisitHLSLOutArgExpr(const HLSLOutArgExpr *E)
void VisitDeducedTemplateSpecializationType(const DeducedTemplateSpecializationType *T)
void VisitObjCSelectorExpr(const ObjCSelectorExpr *Node)
void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *Node)
void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *Node)
void VisitPragmaCommentDecl(const PragmaCommentDecl *D)
void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr *Node)
void VisitImportDecl(const ImportDecl *D)
void VisitUsingEnumDecl(const UsingEnumDecl *D)
void VisitOMPCapturedExprDecl(const OMPCapturedExprDecl *D)
void VisitUnresolvedUsingType(const UnresolvedUsingType *T)
void VisitObjCProtocolExpr(const ObjCProtocolExpr *Node)
void VisitIntegralTemplateArgument(const TemplateArgument &TA)
void VisitObjCCategoryDecl(const ObjCCategoryDecl *D)
void VisitIndirectFieldDecl(const IndirectFieldDecl *D)
void VisitNullTemplateArgument(const TemplateArgument &TA)
void VisitPackTemplateArgument(const TemplateArgument &TA)
void VisitUsingType(const UsingType *T)
void VisitInjectedClassNameType(const InjectedClassNameType *T)
void VisitBinaryOperator(const BinaryOperator *Node)
void VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node)
void VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D)
void VisitBlockDecl(const BlockDecl *D)
void VisitCXXDeleteExpr(const CXXDeleteExpr *Node)
void VisitObjCBoxedExpr(const ObjCBoxedExpr *Node)
void VisitNullPtrTemplateArgument(const TemplateArgument &TA)
void VisitVarTemplateDecl(const VarTemplateDecl *D)
void VisitSubstTemplateTypeParmPackType(const SubstTemplateTypeParmPackType *T)
void VisitConceptSpecializationExpr(const ConceptSpecializationExpr *Node)
void VisitCXXDeductionGuideDecl(const CXXDeductionGuideDecl *D)
TextNodeDumper(raw_ostream &OS, const ASTContext &Context, bool ShowColors)
void VisitPredefinedExpr(const PredefinedExpr *Node)
void dumpType(QualType T)
void VisitObjCEncodeExpr(const ObjCEncodeExpr *Node)
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 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 Visit(const comments::Comment *C, const comments::FullComment *FC)
void dumpNestedNameSpecifier(const NestedNameSpecifier *NNS)
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 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 visitBlockCommandComment(const comments::BlockCommandComment *C, const comments::FullComment *)
void VisitExpressionTemplateArgument(const TemplateArgument &TA)
void VisitTypeAliasDecl(const TypeAliasDecl *D)
void VisitVarDecl(const VarDecl *D)
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 visitVerbatimBlockLineComment(const comments::VerbatimBlockLineComment *C, const comments::FullComment *)
void VisitOpenACCShutdownConstruct(const OpenACCShutdownConstruct *S)
void VisitFloatingLiteral(const FloatingLiteral *Node)
void VisitInitListExpr(const InitListExpr *ILE)
void VisitRequiresExpr(const RequiresExpr *Node)
void VisitVariableArrayType(const VariableArrayType *T)
void VisitGenericSelectionExpr(const GenericSelectionExpr *E)
void VisitTemplateTypeParmType(const TemplateTypeParmType *T)
void VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *Node)
void visitHTMLStartTagComment(const comments::HTMLStartTagComment *C, const comments::FullComment *)
void VisitEnumConstantDecl(const EnumConstantDecl *D)
void VisitPragmaDetectMismatchDecl(const PragmaDetectMismatchDecl *D)
void dumpTemplateSpecializationKind(TemplateSpecializationKind TSK)
void VisitAtomicExpr(const AtomicExpr *AE)
void VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D)
void VisitClassTemplateDecl(const ClassTemplateDecl *D)
void VisitBindingDecl(const BindingDecl *D)
void VisitTypedefType(const TypedefType *T)
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:3535
Declaration of an alias template.
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:153
TypeLocClass getTypeLocClass() const
Definition: TypeLoc.h:116
const Type * getTypePtr() const
Definition: TypeLoc.h:137
A container of type source information.
Definition: Type.h:7902
QualType getType() const
Return the type wrapped by this type source info.
Definition: Type.h:7913
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
Definition: ExprCXX.h:2768
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: Type.h:1828
QualType getLocallyUnqualifiedSingleStepDesugaredType() const
Pull a single level of sugar off of this locally-unqualified type.
Definition: Type.cpp:509
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
Definition: Type.h:2714
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition: Type.h:2706
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
Definition: Type.h:2361
const char * getTypeClassName() const
Definition: Type.cpp:3318
bool containsErrors() const
Whether this type is an error type.
Definition: Type.h:2700
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
Definition: Type.h:2724
bool isFromAST() const
Whether this type comes from an AST file.
Definition: Type.h:2344
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Definition: Decl.h:3514
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
Definition: Expr.h:2622
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition: Expr.h:2232
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
Definition: Expr.cpp:1401
A unary type transform, which is a type constructed from another.
Definition: Type.h:5989
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition: ExprCXX.h:3203
The iterator over UnresolvedSets.
Definition: UnresolvedSet.h:35
Represents the dependent type named by a dependently-scoped typename using declaration,...
Definition: Type.h:5667
Represents a dependent using declaration which was marked with typename.
Definition: DeclCXX.h:3977
Represents a dependent using declaration which was not marked with typename.
Definition: DeclCXX.h:3880
Represents a C++ using-declaration.
Definition: DeclCXX.h:3530
Represents C++ using-directive.
Definition: DeclCXX.h:3033
Represents a C++ using-enum-declaration.
Definition: DeclCXX.h:3731
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition: DeclCXX.h:3338
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
Definition: DeclCXX.h:3402
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:671
QualType getType() const
Definition: Decl.h:682
Kind getKind() const
Definition: Value.h:137
Represents a variable declaration or definition.
Definition: Decl.h:882
static const char * getStorageClassSpecifierString(StorageClass SC)
Return the string used to specify the storage class SC.
Definition: Decl.cpp:2110
@ ListInit
Direct list-initialization (C++11)
Definition: Decl.h:893
@ CInit
C-style initialization with assignment.
Definition: Decl.h:887
@ ParenListInit
Parenthesized list-initialization (C++20)
Definition: Decl.h:896
@ CallInit
Call-style initialization (C++98)
Definition: Decl.h:890
@ TLS_Static
TLS with a known-constant initializer.
Definition: Decl.h:905
@ TLS_Dynamic
TLS with a dynamic initializer.
Definition: Decl.h:908
@ TLS_None
Not a TLS variable.
Definition: Decl.h:902
Declaration of a variable template.
Represents a C array with a specified size that is not an integer-constant-expression.
Definition: Type.h:3808
Represents a GCC generic vector type.
Definition: Type.h:4034
WhileStmt - This represents a 'while' stmt.
Definition: Stmt.h:2611
RetTy Visit(PTR(Attr) A)
Definition: AttrVisitor.h:31
A command that has zero or more word-like arguments (number of word-like arguments depends on command...
Definition: Comment.h:604
static const CommandInfo * getBuiltinCommandInfo(StringRef Name)
const CommandInfo * getCommandInfo(StringRef Name) const
RetTy visit(PTR(Comment) C, ParamTys... P)
Any part of the comment.
Definition: Comment.h:65
A full comment attached to a declaration, contains block content.
Definition: Comment.h:1083
An opening HTML tag with attributes.
Definition: Comment.h:433
A command with word-like arguments that is considered inline content.
Definition: Comment.h:335
Doxygen \param command.
Definition: Comment.h:711
static const char * getDirectionAsString(ParamCommandPassDirection D)
Definition: Comment.cpp:191
Doxygen \tparam command, describes a template parameter.
Definition: Comment.h:793
A verbatim block command (e.
Definition: Comment.h:879
A line of text contained in a verbatim block.
Definition: Comment.h:854
A verbatim line command.
Definition: Comment.h:930
A static requirement that can be used in a requires-expression to check properties of types and expre...
Definition: ExprConcepts.h:168
RequirementKind getKind() const
Definition: ExprConcepts.h:198
bool containsUnexpandedParameterPack() const
Definition: ExprConcepts.h:218
RetTy Visit(PTR(Decl) D)
Definition: DeclVisitor.h:37
RetTy Visit(REF(TemplateArgument) TA, ParamTys... P)
The JSON file list parser is used to communicate input to InstallAPI.
static const TerminalColor NullColor
static const TerminalColor ErrorsColor
static const TerminalColor CommentColor
static const TerminalColor DeclNameColor
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
llvm::StringRef getAccessSpelling(AccessSpecifier AS)
Definition: Specifiers.h:407
static const TerminalColor AddressColor
@ PCK_ExeStr
Definition: PragmaKinds.h:19
@ PCK_Compiler
Definition: PragmaKinds.h:18
@ PCK_Linker
Definition: PragmaKinds.h:16
@ PCK_Lib
Definition: PragmaKinds.h:17
@ PCK_Unknown
Definition: PragmaKinds.h:15
@ PCK_User
Definition: PragmaKinds.h:20
@ RQ_None
No ref-qualifier was provided.
Definition: Type.h:1768
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
Definition: Type.h:1771
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
Definition: Type.h:1774
@ OK_VectorComponent
A vector component is an element or range of elements on a vector.
Definition: Specifiers.h:157
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
Definition: Specifiers.h:161
@ OK_ObjCSubscript
An Objective-C array/dictionary subscripting which reads an object or writes at the subscripted array...
Definition: Specifiers.h:166
@ OK_Ordinary
An ordinary object is located at an address in memory.
Definition: Specifiers.h:151
@ OK_BitField
A bitfield object is a bitfield on a C or C++ record.
Definition: Specifiers.h:154
@ OK_MatrixComponent
A matrix component is a single element of a matrix.
Definition: Specifiers.h:169
static const TerminalColor StmtColor
static const TerminalColor UndeserializedColor
@ Auto
'auto' clause, allowed on 'loop' directives.
@ 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.
@ 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...
@ 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'.
@ 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'.
@ 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...
@ 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.
@ 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',...
@ 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.
StorageClass
Storage classes.
Definition: Specifiers.h:248
@ SC_None
Definition: Specifiers.h:250
static const TerminalColor DeclKindNameColor
static const TerminalColor LocationColor
static const TerminalColor ValueKindColor
std::pair< IdentifierInfo *, SourceLocation > DeviceTypeArgument
static const TerminalColor CastColor
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition: Specifiers.h:135
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
Definition: Specifiers.h:144
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition: Specifiers.h:139
const char * getTraitSpelling(ExpressionTrait T) LLVM_READONLY
Return the spelling of the type trait TT. Never null.
const FunctionProtoType * T
static const TerminalColor AttrColor
static const TerminalColor TypeColor
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition: Specifiers.h:188
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
Definition: Specifiers.h:206
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
Definition: Specifiers.h:202
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
Definition: Specifiers.h:198
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
Definition: Specifiers.h:194
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
Definition: Specifiers.h:191
@ Invariant
The parameter is invariant: must match exactly.
@ Contravariant
The parameter is contravariant, e.g., X<T> is a subtype of X when the type parameter is covariant and...
@ Covariant
The parameter is covariant, e.g., X<T> is a subtype of X when the type parameter is covariant and T i...
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
@ AltiVecBool
is AltiVec 'vector bool ...'
@ SveFixedLengthData
is AArch64 SVE fixed-length data vector
@ AltiVecVector
is AltiVec vector
@ AltiVecPixel
is AltiVec 'vector Pixel'
@ Neon
is ARM Neon vector
@ Generic
not a target-specific vector type
@ RVVFixedLengthData
is RISC-V RVV fixed-length data vector
@ RVVFixedLengthMask
is RISC-V RVV fixed-length mask vector
@ NeonPoly
is ARM Neon polynomial vector
@ SveFixedLengthPredicate
is AArch64 SVE fixed-length predicate vector
static const TerminalColor ValueColor
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_DynamicNone
throw()
@ 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)
static const TerminalColor ObjectKindColor
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition: Specifiers.h:123
@ NOUR_Discarded
This name appears as a potential result of a discarded value expression.
Definition: Specifiers.h:183
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
Definition: Specifiers.h:177
@ NOUR_None
This is an odr-use.
Definition: Specifiers.h:175
@ NOUR_Constant
This name appears as a potential result of an lvalue-to-rvalue conversion that is a constant expressi...
Definition: Specifiers.h:180
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
Definition: Type.h:5171
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
Definition: Type.h:5175
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition: Type.h:5161
Extra information about a function prototype.
Definition: Type.h:5187
ExceptionSpecInfo ExceptionSpec
Definition: Type.h:5194
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: Type.h:862
Information about a single command.