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;
432 // The condition expression will be printed as a part of the 'children',
433 // but print 'clause' here so it is clear what is happening from the dump.
434 OS << " clause";
435 break;
437 OS << " clause";
438 // print the list of all GangKinds, so that there is some sort of
439 // relationship to the expressions listed afterwards.
440 auto *GC = cast<OpenACCGangClause>(C);
441
442 for (unsigned I = 0; I < GC->getNumExprs(); ++I) {
443 OS << " " << GC->getExpr(I).first;
444 }
445 break;
446 }
448 OS << " clause";
449 if (cast<OpenACCCollapseClause>(C)->hasForce())
450 OS << ": force";
451 break;
452
456 OS << " clause";
457 if (cast<OpenACCCopyInClause>(C)->isReadOnly())
458 OS << " : readonly";
459 break;
463 OS << " clause";
464 if (cast<OpenACCCopyOutClause>(C)->isZero())
465 OS << " : zero";
466 break;
470 OS << " clause";
471 if (cast<OpenACCCreateClause>(C)->isZero())
472 OS << " : zero";
473 break;
475 OS << " clause";
476 if (cast<OpenACCWaitClause>(C)->hasDevNumExpr())
477 OS << " has devnum";
478 if (cast<OpenACCWaitClause>(C)->hasQueuesTag())
479 OS << " has queues tag";
480 break;
483 OS << "(";
484 llvm::interleaveComma(
485 cast<OpenACCDeviceTypeClause>(C)->getArchitectures(), OS,
486 [&](const DeviceTypeArgument &Arch) {
487 if (Arch.first == nullptr)
488 OS << "*";
489 else
490 OS << Arch.first->getName();
491 });
492 OS << ")";
493 break;
495 OS << " clause Operator: "
496 << cast<OpenACCReductionClause>(C)->getReductionOp();
497 break;
498 default:
499 // Nothing to do here.
500 break;
501 }
502 }
503 dumpPointer(C);
504 dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
505}
506
508 const TypeSourceInfo *TSI = A.getTypeSourceInfo();
509 if (TSI) {
510 OS << "case ";
511 dumpType(TSI->getType());
512 } else {
513 OS << "default";
514 }
515
516 if (A.isSelected())
517 OS << " selected";
518}
519
521 if (!R) {
522 ColorScope Color(OS, ShowColors, NullColor);
523 OS << "<<<NULL>>> ConceptReference";
524 return;
525 }
526
527 OS << "ConceptReference";
528 dumpPointer(R);
530 OS << ' ';
532}
533
535 if (!R) {
536 ColorScope Color(OS, ShowColors, NullColor);
537 OS << "<<<NULL>>> Requirement";
538 return;
539 }
540
541 {
542 ColorScope Color(OS, ShowColors, StmtColor);
543 switch (R->getKind()) {
545 OS << "TypeRequirement";
546 break;
548 OS << "SimpleRequirement";
549 break;
551 OS << "CompoundRequirement";
552 break;
554 OS << "NestedRequirement";
555 break;
556 }
557 }
558
559 dumpPointer(R);
560
561 if (auto *ER = dyn_cast<concepts::ExprRequirement>(R)) {
562 if (ER->hasNoexceptRequirement())
563 OS << " noexcept";
564 }
565
566 if (R->isDependent())
567 OS << " dependent";
568 else
569 OS << (R->isSatisfied() ? " satisfied" : " unsatisfied");
571 OS << " contains_unexpanded_pack";
572}
573
574static double GetApproxValue(const llvm::APFloat &F) {
575 llvm::APFloat V = F;
576 bool ignored;
577 V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
578 &ignored);
579 return V.convertToDouble();
580}
581
582/// True if the \p APValue \p Value can be folded onto the current line.
583static bool isSimpleAPValue(const APValue &Value) {
584 switch (Value.getKind()) {
585 case APValue::None:
587 case APValue::Int:
588 case APValue::Float:
592 case APValue::LValue:
595 return true;
596 case APValue::Vector:
597 case APValue::Array:
598 case APValue::Struct:
599 return false;
600 case APValue::Union:
601 return isSimpleAPValue(Value.getUnionValue());
602 }
603 llvm_unreachable("unexpected APValue kind!");
604}
605
606/// Dump the children of the \p APValue \p Value.
607///
608/// \param[in] Value The \p APValue to visit
609/// \param[in] Ty The \p QualType passed to \p Visit
610///
611/// \param[in] IdxToChildFun A function mapping an \p APValue and an index
612/// to one of the child of the \p APValue
613///
614/// \param[in] NumChildren \p IdxToChildFun will be called on \p Value with
615/// the indices in the range \p [0,NumChildren(
616///
617/// \param[in] LabelSingular The label to use on a line with a single child
618/// \param[in] LabelPlurial The label to use on a line with multiple children
619void TextNodeDumper::dumpAPValueChildren(
620 const APValue &Value, QualType Ty,
621 const APValue &(*IdxToChildFun)(const APValue &, unsigned),
622 unsigned NumChildren, StringRef LabelSingular, StringRef LabelPlurial) {
623 // To save some vertical space we print up to MaxChildrenPerLine APValues
624 // considered to be simple (by isSimpleAPValue) on a single line.
625 constexpr unsigned MaxChildrenPerLine = 4;
626 unsigned I = 0;
627 while (I < NumChildren) {
628 unsigned J = I;
629 while (J < NumChildren) {
630 if (isSimpleAPValue(IdxToChildFun(Value, J)) &&
631 (J - I < MaxChildrenPerLine)) {
632 ++J;
633 continue;
634 }
635 break;
636 }
637
638 J = std::max(I + 1, J);
639
640 // Print [I,J) on a single line.
641 AddChild(J - I > 1 ? LabelPlurial : LabelSingular, [=]() {
642 for (unsigned X = I; X < J; ++X) {
643 Visit(IdxToChildFun(Value, X), Ty);
644 if (X + 1 != J)
645 OS << ", ";
646 }
647 });
648 I = J;
649 }
650}
651
653 ColorScope Color(OS, ShowColors, ValueKindColor);
654 switch (Value.getKind()) {
655 case APValue::None:
656 OS << "None";
657 return;
659 OS << "Indeterminate";
660 return;
661 case APValue::Int:
662 OS << "Int ";
663 {
664 ColorScope Color(OS, ShowColors, ValueColor);
665 OS << Value.getInt();
666 }
667 return;
668 case APValue::Float:
669 OS << "Float ";
670 {
671 ColorScope Color(OS, ShowColors, ValueColor);
672 OS << GetApproxValue(Value.getFloat());
673 }
674 return;
676 OS << "FixedPoint ";
677 {
678 ColorScope Color(OS, ShowColors, ValueColor);
679 OS << Value.getFixedPoint();
680 }
681 return;
682 case APValue::Vector: {
683 unsigned VectorLength = Value.getVectorLength();
684 OS << "Vector length=" << VectorLength;
685
686 dumpAPValueChildren(
687 Value, Ty,
688 [](const APValue &Value, unsigned Index) -> const APValue & {
689 return Value.getVectorElt(Index);
690 },
691 VectorLength, "element", "elements");
692 return;
693 }
695 OS << "ComplexInt ";
696 {
697 ColorScope Color(OS, ShowColors, ValueColor);
698 OS << Value.getComplexIntReal() << " + " << Value.getComplexIntImag()
699 << 'i';
700 }
701 return;
703 OS << "ComplexFloat ";
704 {
705 ColorScope Color(OS, ShowColors, ValueColor);
706 OS << GetApproxValue(Value.getComplexFloatReal()) << " + "
707 << GetApproxValue(Value.getComplexFloatImag()) << 'i';
708 }
709 return;
710 case APValue::LValue:
711 (void)Context;
712 OS << "LValue <todo>";
713 return;
714 case APValue::Array: {
715 unsigned ArraySize = Value.getArraySize();
716 unsigned NumInitializedElements = Value.getArrayInitializedElts();
717 OS << "Array size=" << ArraySize;
718
719 dumpAPValueChildren(
720 Value, Ty,
721 [](const APValue &Value, unsigned Index) -> const APValue & {
722 return Value.getArrayInitializedElt(Index);
723 },
724 NumInitializedElements, "element", "elements");
725
726 if (Value.hasArrayFiller()) {
727 AddChild("filler", [=] {
728 {
729 ColorScope Color(OS, ShowColors, ValueColor);
730 OS << ArraySize - NumInitializedElements << " x ";
731 }
732 Visit(Value.getArrayFiller(), Ty);
733 });
734 }
735
736 return;
737 }
738 case APValue::Struct: {
739 OS << "Struct";
740
741 dumpAPValueChildren(
742 Value, Ty,
743 [](const APValue &Value, unsigned Index) -> const APValue & {
744 return Value.getStructBase(Index);
745 },
746 Value.getStructNumBases(), "base", "bases");
747
748 dumpAPValueChildren(
749 Value, Ty,
750 [](const APValue &Value, unsigned Index) -> const APValue & {
751 return Value.getStructField(Index);
752 },
753 Value.getStructNumFields(), "field", "fields");
754
755 return;
756 }
757 case APValue::Union: {
758 OS << "Union";
759 {
760 ColorScope Color(OS, ShowColors, ValueColor);
761 if (const FieldDecl *FD = Value.getUnionField())
762 OS << " ." << *cast<NamedDecl>(FD);
763 }
764 // If the union value is considered to be simple, fold it into the
765 // current line to save some vertical space.
766 const APValue &UnionValue = Value.getUnionValue();
767 if (isSimpleAPValue(UnionValue)) {
768 OS << ' ';
769 Visit(UnionValue, Ty);
770 } else {
771 AddChild([=] { Visit(UnionValue, Ty); });
772 }
773
774 return;
775 }
777 OS << "MemberPointer <todo>";
778 return;
780 OS << "AddrLabelDiff <todo>";
781 return;
782 }
783 llvm_unreachable("Unknown APValue kind!");
784}
785
786void TextNodeDumper::dumpPointer(const void *Ptr) {
787 ColorScope Color(OS, ShowColors, AddressColor);
788 OS << ' ' << Ptr;
789}
790
792 if (!SM)
793 return;
794
795 ColorScope Color(OS, ShowColors, LocationColor);
796 SourceLocation SpellingLoc = SM->getSpellingLoc(Loc);
797
798 // The general format we print out is filename:line:col, but we drop pieces
799 // that haven't changed since the last loc printed.
800 PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc);
801
802 if (PLoc.isInvalid()) {
803 OS << "<invalid sloc>";
804 return;
805 }
806
807 if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) {
808 OS << PLoc.getFilename() << ':' << PLoc.getLine() << ':'
809 << PLoc.getColumn();
810 LastLocFilename = PLoc.getFilename();
811 LastLocLine = PLoc.getLine();
812 } else if (PLoc.getLine() != LastLocLine) {
813 OS << "line" << ':' << PLoc.getLine() << ':' << PLoc.getColumn();
814 LastLocLine = PLoc.getLine();
815 } else {
816 OS << "col" << ':' << PLoc.getColumn();
817 }
818}
819
821 // Can't translate locations if a SourceManager isn't available.
822 if (!SM)
823 return;
824
825 OS << " <";
827 if (R.getBegin() != R.getEnd()) {
828 OS << ", ";
829 dumpLocation(R.getEnd());
830 }
831 OS << ">";
832
833 // <t2.c:123:421[blah], t2.c:412:321>
834}
835
837 ColorScope Color(OS, ShowColors, TypeColor);
838
839 SplitQualType T_split = T.split();
840 std::string T_str = QualType::getAsString(T_split, PrintPolicy);
841 OS << "'" << T_str << "'";
842
843 if (Desugar && !T.isNull()) {
844 // If the type is sugared, also dump a (shallow) desugared type when
845 // it is visibly different.
846 SplitQualType D_split = T.getSplitDesugaredType();
847 if (T_split != D_split) {
848 std::string D_str = QualType::getAsString(D_split, PrintPolicy);
849 if (T_str != D_str)
850 OS << ":'" << QualType::getAsString(D_split, PrintPolicy) << "'";
851 }
852 }
853}
854
856 OS << ' ';
858}
859
861 if (!D) {
862 ColorScope Color(OS, ShowColors, NullColor);
863 OS << "<<<NULL>>>";
864 return;
865 }
866
867 {
868 ColorScope Color(OS, ShowColors, DeclKindNameColor);
869 OS << D->getDeclKindName();
870 }
871 dumpPointer(D);
872
873 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
874 ColorScope Color(OS, ShowColors, DeclNameColor);
875 OS << " '" << ND->getDeclName() << '\'';
876 }
877
878 if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
879 dumpType(VD->getType());
880}
881
883 if (ND->getDeclName()) {
884 ColorScope Color(OS, ShowColors, DeclNameColor);
885 OS << ' ' << ND->getDeclName();
886 }
887}
888
890 const auto AccessSpelling = getAccessSpelling(AS);
891 if (AccessSpelling.empty())
892 return;
893 OS << AccessSpelling;
894}
895
898 if (auto *BD = C.dyn_cast<BlockDecl *>())
899 dumpDeclRef(BD, "cleanup");
900 else if (auto *CLE = C.dyn_cast<CompoundLiteralExpr *>())
901 AddChild([=] {
902 OS << "cleanup ";
903 {
904 ColorScope Color(OS, ShowColors, StmtColor);
905 OS << CLE->getStmtClassName();
906 }
907 dumpPointer(CLE);
908 });
909 else
910 llvm_unreachable("unexpected cleanup type");
911}
912
915 switch (TSK) {
916 case TSK_Undeclared:
917 break;
919 OS << " implicit_instantiation";
920 break;
922 OS << " explicit_specialization";
923 break;
925 OS << " explicit_instantiation_declaration";
926 break;
928 OS << " explicit_instantiation_definition";
929 break;
930 }
931}
932
934 if (!NNS)
935 return;
936
937 AddChild([=] {
938 OS << "NestedNameSpecifier";
939
940 switch (NNS->getKind()) {
941 case NestedNameSpecifier::Identifier:
942 OS << " Identifier";
943 OS << " '" << NNS->getAsIdentifier()->getName() << "'";
944 break;
945 case NestedNameSpecifier::Namespace:
946 OS << " "; // "Namespace" is printed as the decl kind.
947 dumpBareDeclRef(NNS->getAsNamespace());
948 break;
949 case NestedNameSpecifier::NamespaceAlias:
950 OS << " "; // "NamespaceAlias" is printed as the decl kind.
951 dumpBareDeclRef(NNS->getAsNamespaceAlias());
952 break;
953 case NestedNameSpecifier::TypeSpec:
954 OS << " TypeSpec";
955 dumpType(QualType(NNS->getAsType(), 0));
956 break;
957 case NestedNameSpecifier::TypeSpecWithTemplate:
958 OS << " TypeSpecWithTemplate";
959 dumpType(QualType(NNS->getAsType(), 0));
960 break;
961 case NestedNameSpecifier::Global:
962 OS << " Global";
963 break;
964 case NestedNameSpecifier::Super:
965 OS << " Super";
966 break;
967 }
968
969 dumpNestedNameSpecifier(NNS->getPrefix());
970 });
971}
972
973void TextNodeDumper::dumpDeclRef(const Decl *D, StringRef Label) {
974 if (!D)
975 return;
976
977 AddChild([=] {
978 if (!Label.empty())
979 OS << Label << ' ';
981 });
982}
983
986 {
987 llvm::raw_svector_ostream SS(Str);
988 TA.print(PrintPolicy, SS, /*IncludeType=*/true);
989 }
990 OS << " '" << Str << "'";
991
992 if (!Context)
993 return;
994
995 if (TemplateArgument CanonTA = Context->getCanonicalTemplateArgument(TA);
996 !CanonTA.structurallyEquals(TA)) {
997 llvm::SmallString<128> CanonStr;
998 {
999 llvm::raw_svector_ostream SS(CanonStr);
1000 CanonTA.print(PrintPolicy, SS, /*IncludeType=*/true);
1001 }
1002 if (CanonStr != Str)
1003 OS << ":'" << CanonStr << "'";
1004 }
1005}
1006
1007const char *TextNodeDumper::getCommandName(unsigned CommandID) {
1008 if (Traits)
1009 return Traits->getCommandInfo(CommandID)->Name;
1010 const comments::CommandInfo *Info =
1012 if (Info)
1013 return Info->Name;
1014 return "<not a builtin command>";
1015}
1016
1017void TextNodeDumper::printFPOptions(FPOptionsOverride FPO) {
1018#define OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
1019 if (FPO.has##NAME##Override()) \
1020 OS << " " #NAME "=" << FPO.get##NAME##Override();
1021#include "clang/Basic/FPOptions.def"
1022}
1023
1025 const comments::FullComment *) {
1026 OS << " Text=\"" << C->getText() << "\"";
1027}
1028
1031 OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
1032 switch (C->getRenderKind()) {
1034 OS << " RenderNormal";
1035 break;
1037 OS << " RenderBold";
1038 break;
1040 OS << " RenderMonospaced";
1041 break;
1043 OS << " RenderEmphasized";
1044 break;
1046 OS << " RenderAnchor";
1047 break;
1048 }
1049
1050 for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
1051 OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
1052}
1053
1056 OS << " Name=\"" << C->getTagName() << "\"";
1057 if (C->getNumAttrs() != 0) {
1058 OS << " Attrs: ";
1059 for (unsigned i = 0, e = C->getNumAttrs(); i != e; ++i) {
1060 const comments::HTMLStartTagComment::Attribute &Attr = C->getAttr(i);
1061 OS << " \"" << Attr.Name << "=\"" << Attr.Value << "\"";
1062 }
1063 }
1064 if (C->isSelfClosing())
1065 OS << " SelfClosing";
1066}
1067
1070 OS << " Name=\"" << C->getTagName() << "\"";
1071}
1072
1075 OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
1076 for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
1077 OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
1078}
1079
1082 OS << " "
1084
1085 if (C->isDirectionExplicit())
1086 OS << " explicitly";
1087 else
1088 OS << " implicitly";
1089
1090 if (C->hasParamName()) {
1091 if (C->isParamIndexValid())
1092 OS << " Param=\"" << C->getParamName(FC) << "\"";
1093 else
1094 OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
1095 }
1096
1097 if (C->isParamIndexValid() && !C->isVarArgParam())
1098 OS << " ParamIndex=" << C->getParamIndex();
1099}
1100
1103 if (C->hasParamName()) {
1104 if (C->isPositionValid())
1105 OS << " Param=\"" << C->getParamName(FC) << "\"";
1106 else
1107 OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
1108 }
1109
1110 if (C->isPositionValid()) {
1111 OS << " Position=<";
1112 for (unsigned i = 0, e = C->getDepth(); i != e; ++i) {
1113 OS << C->getIndex(i);
1114 if (i != e - 1)
1115 OS << ", ";
1116 }
1117 OS << ">";
1118 }
1119}
1120
1123 OS << " Name=\"" << getCommandName(C->getCommandID())
1124 << "\""
1125 " CloseName=\""
1126 << C->getCloseName() << "\"";
1127}
1128
1131 const comments::FullComment *) {
1132 OS << " Text=\"" << C->getText() << "\"";
1133}
1134
1137 OS << " Text=\"" << C->getText() << "\"";
1138}
1139
1141 OS << " null";
1142}
1143
1145 OS << " type";
1147}
1148
1150 const TemplateArgument &TA) {
1151 OS << " decl";
1153 dumpDeclRef(TA.getAsDecl());
1154}
1155
1157 OS << " nullptr";
1159}
1160
1162 OS << " integral";
1164}
1165
1167 AddChild(Label, [=] {
1168 {
1170 {
1171 llvm::raw_svector_ostream SS(Str);
1172 TN.print(SS, PrintPolicy);
1173 }
1174 OS << "'" << Str << "'";
1175
1176 if (Context) {
1177 if (TemplateName CanonTN = Context->getCanonicalTemplateName(TN);
1178 CanonTN != TN) {
1179 llvm::SmallString<128> CanonStr;
1180 {
1181 llvm::raw_svector_ostream SS(CanonStr);
1182 CanonTN.print(SS, PrintPolicy);
1183 }
1184 if (CanonStr != Str)
1185 OS << ":'" << CanonStr << "'";
1186 }
1187 }
1188 }
1190 });
1191}
1192
1194 switch (TN.getKind()) {
1196 AddChild([=] { Visit(TN.getAsTemplateDecl()); });
1197 return;
1199 const UsingShadowDecl *USD = TN.getAsUsingShadowDecl();
1200 AddChild([=] { Visit(USD); });
1201 AddChild("target", [=] { Visit(USD->getTargetDecl()); });
1202 return;
1203 }
1205 OS << " qualified";
1207 if (QTN->hasTemplateKeyword())
1208 OS << " keyword";
1211 return;
1212 }
1214 OS << " dependent";
1217 return;
1218 }
1220 OS << " subst";
1223 OS << " index " << STS->getIndex();
1224 if (std::optional<unsigned int> PackIndex = STS->getPackIndex())
1225 OS << " pack_index " << *PackIndex;
1226 if (const TemplateTemplateParmDecl *P = STS->getParameter())
1227 AddChild("parameter", [=] { Visit(P); });
1228 dumpDeclRef(STS->getAssociatedDecl(), "associated");
1229 dumpTemplateName(STS->getReplacement(), "replacement");
1230 return;
1231 }
1233 OS << " deduced";
1235 dumpTemplateName(DTS->getUnderlying(), "underlying");
1236 AddChild("defaults", [=] {
1237 auto [StartPos, Args] = DTS->getDefaultArguments();
1238 OS << " start " << StartPos;
1239 for (const TemplateArgument &Arg : Args)
1240 AddChild([=] { Visit(Arg, SourceRange()); });
1241 });
1242 return;
1243 }
1244 // FIXME: Implement these.
1246 OS << " overloaded";
1247 return;
1249 OS << " assumed";
1250 return;
1252 OS << " subst_pack";
1253 return;
1254 }
1255 llvm_unreachable("Unexpected TemplateName Kind");
1256}
1257
1259 OS << " template";
1262}
1263
1265 const TemplateArgument &TA) {
1266 OS << " template expansion";
1269}
1270
1272 const TemplateArgument &TA) {
1273 OS << " expr";
1275}
1276
1278 OS << " pack";
1280}
1281
1282static void dumpBasePath(raw_ostream &OS, const CastExpr *Node) {
1283 if (Node->path_empty())
1284 return;
1285
1286 OS << " (";
1287 bool First = true;
1288 for (CastExpr::path_const_iterator I = Node->path_begin(),
1289 E = Node->path_end();
1290 I != E; ++I) {
1291 const CXXBaseSpecifier *Base = *I;
1292 if (!First)
1293 OS << " -> ";
1294
1295 const auto *RD =
1296 cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl());
1297
1298 if (Base->isVirtual())
1299 OS << "virtual ";
1300 OS << RD->getName();
1301 First = false;
1302 }
1303
1304 OS << ')';
1305}
1306
1308 if (Node->hasInitStorage())
1309 OS << " has_init";
1310 if (Node->hasVarStorage())
1311 OS << " has_var";
1312 if (Node->hasElseStorage())
1313 OS << " has_else";
1314 if (Node->isConstexpr())
1315 OS << " constexpr";
1316 if (Node->isConsteval()) {
1317 OS << " ";
1318 if (Node->isNegatedConsteval())
1319 OS << "!";
1320 OS << "consteval";
1321 }
1322}
1323
1325 if (Node->hasInitStorage())
1326 OS << " has_init";
1327 if (Node->hasVarStorage())
1328 OS << " has_var";
1329}
1330
1332 if (Node->hasVarStorage())
1333 OS << " has_var";
1334}
1335
1337 OS << " '" << Node->getName() << "'";
1338 if (Node->isSideEntry())
1339 OS << " side_entry";
1340}
1341
1343 OS << " '" << Node->getLabel()->getName() << "'";
1344 dumpPointer(Node->getLabel());
1345}
1346
1348 if (Node->caseStmtIsGNURange())
1349 OS << " gnu_range";
1350}
1351
1353 if (const VarDecl *Cand = Node->getNRVOCandidate()) {
1354 OS << " nrvo_candidate(";
1355 dumpBareDeclRef(Cand);
1356 OS << ")";
1357 }
1358}
1359
1361 if (Node->isImplicit())
1362 OS << " implicit";
1363}
1364
1366 if (Node->isImplicit())
1367 OS << " implicit";
1368}
1369
1371 if (Node->hasAPValueResult())
1372 AddChild("value",
1373 [=] { Visit(Node->getAPValueResult(), Node->getType()); });
1374}
1375
1377 if (Node->usesADL())
1378 OS << " adl";
1379 if (Node->hasStoredFPFeatures())
1380 printFPOptions(Node->getFPFeatures());
1381}
1382
1384 const char *OperatorSpelling = clang::getOperatorSpelling(Node->getOperator());
1385 if (OperatorSpelling)
1386 OS << " '" << OperatorSpelling << "'";
1387
1389}
1390
1392 OS << " <";
1393 {
1394 ColorScope Color(OS, ShowColors, CastColor);
1395 OS << Node->getCastKindName();
1396 }
1397 dumpBasePath(OS, Node);
1398 OS << ">";
1399 if (Node->hasStoredFPFeatures())
1400 printFPOptions(Node->getFPFeatures());
1401}
1402
1405 if (Node->isPartOfExplicitCast())
1406 OS << " part_of_explicit_cast";
1407}
1408
1410 OS << " ";
1411 dumpBareDeclRef(Node->getDecl());
1412 dumpNestedNameSpecifier(Node->getQualifier());
1413 if (Node->getDecl() != Node->getFoundDecl()) {
1414 OS << " (";
1415 dumpBareDeclRef(Node->getFoundDecl());
1416 OS << ")";
1417 }
1418 switch (Node->isNonOdrUse()) {
1419 case NOUR_None: break;
1420 case NOUR_Unevaluated: OS << " non_odr_use_unevaluated"; break;
1421 case NOUR_Constant: OS << " non_odr_use_constant"; break;
1422 case NOUR_Discarded: OS << " non_odr_use_discarded"; break;
1423 }
1424 if (Node->isCapturedByCopyInLambdaWithExplicitObjectParameter())
1425 OS << " dependent_capture";
1426 else if (Node->refersToEnclosingVariableOrCapture())
1427 OS << " refers_to_enclosing_variable_or_capture";
1428
1429 if (Node->isImmediateEscalating())
1430 OS << " immediate-escalating";
1431}
1432
1435
1436 dumpNestedNameSpecifier(Node->getQualifier());
1437}
1438
1440 const UnresolvedLookupExpr *Node) {
1441 OS << " (";
1442 if (!Node->requiresADL())
1443 OS << "no ";
1444 OS << "ADL) = '" << Node->getName() << '\'';
1445
1446 UnresolvedLookupExpr::decls_iterator I = Node->decls_begin(),
1447 E = Node->decls_end();
1448 if (I == E)
1449 OS << " empty";
1450 for (; I != E; ++I)
1451 dumpPointer(*I);
1452}
1453
1455 {
1456 ColorScope Color(OS, ShowColors, DeclKindNameColor);
1457 OS << " " << Node->getDecl()->getDeclKindName() << "Decl";
1458 }
1459 OS << "='" << *Node->getDecl() << "'";
1460 dumpPointer(Node->getDecl());
1461 if (Node->isFreeIvar())
1462 OS << " isFreeIvar";
1463}
1464
1467 dumpType(Node->getTypeSourceInfo()->getType());
1468}
1469
1471 OS << " " << PredefinedExpr::getIdentKindName(Node->getIdentKind());
1472}
1473
1475 ColorScope Color(OS, ShowColors, ValueColor);
1476 OS << " " << Node->getValue();
1477}
1478
1480 bool isSigned = Node->getType()->isSignedIntegerType();
1481 ColorScope Color(OS, ShowColors, ValueColor);
1482 OS << " " << toString(Node->getValue(), 10, isSigned);
1483}
1484
1486 ColorScope Color(OS, ShowColors, ValueColor);
1487 OS << " " << Node->getValueAsString(/*Radix=*/10);
1488}
1489
1491 ColorScope Color(OS, ShowColors, ValueColor);
1492 OS << " " << Node->getValueAsApproximateDouble();
1493}
1494
1496 ColorScope Color(OS, ShowColors, ValueColor);
1497 OS << " ";
1498 Str->outputString(OS);
1499}
1500
1502 if (auto *Field = ILE->getInitializedFieldInUnion()) {
1503 OS << " field ";
1504 dumpBareDeclRef(Field);
1505 }
1506}
1507
1509 if (E->isResultDependent())
1510 OS << " result_dependent";
1511}
1512
1514 OS << " " << (Node->isPostfix() ? "postfix" : "prefix") << " '"
1515 << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1516 if (!Node->canOverflow())
1517 OS << " cannot overflow";
1518 if (Node->hasStoredFPFeatures())
1519 printFPOptions(Node->getStoredFPFeatures());
1520}
1521
1524 OS << " " << getTraitSpelling(Node->getKind());
1525
1526 if (Node->isArgumentType())
1527 dumpType(Node->getArgumentType());
1528}
1529
1531 OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl();
1532 dumpPointer(Node->getMemberDecl());
1533 dumpNestedNameSpecifier(Node->getQualifier());
1534 switch (Node->isNonOdrUse()) {
1535 case NOUR_None: break;
1536 case NOUR_Unevaluated: OS << " non_odr_use_unevaluated"; break;
1537 case NOUR_Constant: OS << " non_odr_use_constant"; break;
1538 case NOUR_Discarded: OS << " non_odr_use_discarded"; break;
1539 }
1540}
1541
1543 const ExtVectorElementExpr *Node) {
1544 OS << " " << Node->getAccessor().getNameStart();
1545}
1546
1548 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1549 if (Node->hasStoredFPFeatures())
1550 printFPOptions(Node->getStoredFPFeatures());
1551}
1552
1555 OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
1556 << "' ComputeLHSTy=";
1557 dumpBareType(Node->getComputationLHSType());
1558 OS << " ComputeResultTy=";
1559 dumpBareType(Node->getComputationResultType());
1560 if (Node->hasStoredFPFeatures())
1561 printFPOptions(Node->getStoredFPFeatures());
1562}
1563
1565 OS << " " << Node->getLabel()->getName();
1566 dumpPointer(Node->getLabel());
1567}
1568
1570 OS << " " << Node->getCastName() << "<"
1571 << Node->getTypeAsWritten().getAsString() << ">"
1572 << " <" << Node->getCastKindName();
1573 dumpBasePath(OS, Node);
1574 OS << ">";
1575}
1576
1578 OS << " " << (Node->getValue() ? "true" : "false");
1579}
1580
1582 if (Node->isImplicit())
1583 OS << " implicit";
1584 if (Node->isCapturedByCopyInLambdaWithExplicitObjectParameter())
1585 OS << " dependent_capture";
1586 OS << " this";
1587}
1588
1590 const CXXFunctionalCastExpr *Node) {
1591 OS << " functional cast to " << Node->getTypeAsWritten().getAsString() << " <"
1592 << Node->getCastKindName() << ">";
1593 if (Node->hasStoredFPFeatures())
1594 printFPOptions(Node->getFPFeatures());
1595}
1596
1599 if (Node->hasStoredFPFeatures())
1600 printFPOptions(Node->getFPFeatures());
1601}
1602
1605 dumpType(Node->getTypeAsWritten());
1606 if (Node->isListInitialization())
1607 OS << " list";
1608}
1609
1611 CXXConstructorDecl *Ctor = Node->getConstructor();
1612 dumpType(Ctor->getType());
1613 if (Node->isElidable())
1614 OS << " elidable";
1615 if (Node->isListInitialization())
1616 OS << " list";
1617 if (Node->isStdInitListInitialization())
1618 OS << " std::initializer_list";
1619 if (Node->requiresZeroInitialization())
1620 OS << " zeroing";
1621 if (Node->isImmediateEscalating())
1622 OS << " immediate-escalating";
1623}
1624
1626 const CXXBindTemporaryExpr *Node) {
1627 OS << " (CXXTemporary";
1629 OS << ")";
1630}
1631
1633 if (Node->isGlobalNew())
1634 OS << " global";
1635 if (Node->isArray())
1636 OS << " array";
1637 if (Node->getOperatorNew()) {
1638 OS << ' ';
1639 dumpBareDeclRef(Node->getOperatorNew());
1640 }
1641 // We could dump the deallocation function used in case of error, but it's
1642 // usually not that interesting.
1643}
1644
1646 if (Node->isGlobalDelete())
1647 OS << " global";
1648 if (Node->isArrayForm())
1649 OS << " array";
1650 if (Node->getOperatorDelete()) {
1651 OS << ' ';
1652 dumpBareDeclRef(Node->getOperatorDelete());
1653 }
1654}
1655
1657 OS << " " << getTraitSpelling(Node->getTrait());
1658}
1659
1661 OS << " " << getTraitSpelling(Node->getTrait());
1662}
1663
1665 OS << " " << getTraitSpelling(Node->getTrait());
1666}
1667
1669 if (Node->hasRewrittenInit())
1670 OS << " has rewritten init";
1671}
1672
1674 if (Node->hasRewrittenInit())
1675 OS << " has rewritten init";
1676}
1677
1680 if (const ValueDecl *VD = Node->getExtendingDecl()) {
1681 OS << " extended by ";
1682 dumpBareDeclRef(VD);
1683 }
1684}
1685
1687 for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i)
1688 dumpCleanupObject(Node->getObject(i));
1689}
1690
1692 dumpPointer(Node->getPack());
1693 dumpName(Node->getPack());
1694}
1695
1698 OS << " " << (Node->isArrow() ? "->" : ".") << Node->getMember();
1699}
1700
1702 OS << " selector=";
1703 Node->getSelector().print(OS);
1704 switch (Node->getReceiverKind()) {
1706 break;
1707
1709 OS << " class=";
1710 dumpBareType(Node->getClassReceiver());
1711 break;
1712
1714 OS << " super (instance)";
1715 break;
1716
1718 OS << " super (class)";
1719 break;
1720 }
1721}
1722
1724 if (auto *BoxingMethod = Node->getBoxingMethod()) {
1725 OS << " selector=";
1726 BoxingMethod->getSelector().print(OS);
1727 }
1728}
1729
1731 if (!Node->getCatchParamDecl())
1732 OS << " catch all";
1733}
1734
1736 dumpType(Node->getEncodedType());
1737}
1738
1740 OS << " ";
1741 Node->getSelector().print(OS);
1742}
1743
1745 OS << ' ' << *Node->getProtocol();
1746}
1747
1749 if (Node->isImplicitProperty()) {
1750 OS << " Kind=MethodRef Getter=\"";
1751 if (Node->getImplicitPropertyGetter())
1752 Node->getImplicitPropertyGetter()->getSelector().print(OS);
1753 else
1754 OS << "(null)";
1755
1756 OS << "\" Setter=\"";
1757 if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
1758 Setter->getSelector().print(OS);
1759 else
1760 OS << "(null)";
1761 OS << "\"";
1762 } else {
1763 OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty()
1764 << '"';
1765 }
1766
1767 if (Node->isSuperReceiver())
1768 OS << " super";
1769
1770 OS << " Messaging=";
1771 if (Node->isMessagingGetter() && Node->isMessagingSetter())
1772 OS << "Getter&Setter";
1773 else if (Node->isMessagingGetter())
1774 OS << "Getter";
1775 else if (Node->isMessagingSetter())
1776 OS << "Setter";
1777}
1778
1780 const ObjCSubscriptRefExpr *Node) {
1781 if (Node->isArraySubscriptRefExpr())
1782 OS << " Kind=ArraySubscript GetterForArray=\"";
1783 else
1784 OS << " Kind=DictionarySubscript GetterForDictionary=\"";
1785 if (Node->getAtIndexMethodDecl())
1786 Node->getAtIndexMethodDecl()->getSelector().print(OS);
1787 else
1788 OS << "(null)";
1789
1790 if (Node->isArraySubscriptRefExpr())
1791 OS << "\" SetterForArray=\"";
1792 else
1793 OS << "\" SetterForDictionary=\"";
1794 if (Node->setAtIndexMethodDecl())
1795 Node->setAtIndexMethodDecl()->getSelector().print(OS);
1796 else
1797 OS << "(null)";
1798}
1799
1801 OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
1802}
1803
1805 OS << " ";
1806 for (unsigned I = 0, E = Node->numOfIterators(); I < E; ++I) {
1807 Visit(Node->getIteratorDecl(I));
1808 OS << " = ";
1809 const OMPIteratorExpr::IteratorRange Range = Node->getIteratorRange(I);
1810 OS << " begin ";
1811 Visit(Range.Begin);
1812 OS << " end ";
1813 Visit(Range.End);
1814 if (Range.Step) {
1815 OS << " step ";
1816 Visit(Range.Step);
1817 }
1818 }
1819}
1820
1823 OS << " ";
1824 dumpBareDeclRef(Node->getFoundDecl());
1825}
1826
1828 const RequiresExpr *Node) {
1829 if (!Node->isValueDependent())
1830 OS << (Node->isSatisfied() ? " satisfied" : " unsatisfied");
1831}
1832
1834 if (T->isSpelledAsLValue())
1835 OS << " written as lvalue reference";
1836}
1837
1839 switch (T->getSizeModifier()) {
1841 break;
1843 OS << " static";
1844 break;
1846 OS << " *";
1847 break;
1848 }
1849 OS << " " << T->getIndexTypeQualifiers().getAsString();
1850}
1851
1853 OS << " " << T->getSize();
1855}
1856
1858 OS << " ";
1859 dumpSourceRange(T->getBracketsRange());
1861}
1862
1864 const DependentSizedArrayType *T) {
1866 OS << " ";
1867 dumpSourceRange(T->getBracketsRange());
1868}
1869
1872 OS << " ";
1873 dumpLocation(T->getAttributeLoc());
1874}
1875
1877 switch (T->getVectorKind()) {
1879 break;
1881 OS << " altivec";
1882 break;
1884 OS << " altivec pixel";
1885 break;
1887 OS << " altivec bool";
1888 break;
1889 case VectorKind::Neon:
1890 OS << " neon";
1891 break;
1893 OS << " neon poly";
1894 break;
1896 OS << " fixed-length sve data vector";
1897 break;
1899 OS << " fixed-length sve predicate vector";
1900 break;
1902 OS << " fixed-length rvv data vector";
1903 break;
1908 OS << " fixed-length rvv mask vector";
1909 break;
1910 }
1911 OS << " " << T->getNumElements();
1912}
1913
1915 auto EI = T->getExtInfo();
1916 if (EI.getNoReturn())
1917 OS << " noreturn";
1918 if (EI.getProducesResult())
1919 OS << " produces_result";
1920 if (EI.getHasRegParm())
1921 OS << " regparm " << EI.getRegParm();
1922 OS << " " << FunctionType::getNameForCallConv(EI.getCC());
1923}
1924
1926 auto EPI = T->getExtProtoInfo();
1927 if (EPI.HasTrailingReturn)
1928 OS << " trailing_return";
1929 if (T->isConst())
1930 OS << " const";
1931 if (T->isVolatile())
1932 OS << " volatile";
1933 if (T->isRestrict())
1934 OS << " restrict";
1935 if (T->getExtProtoInfo().Variadic)
1936 OS << " variadic";
1937 switch (EPI.RefQualifier) {
1938 case RQ_None:
1939 break;
1940 case RQ_LValue:
1941 OS << " &";
1942 break;
1943 case RQ_RValue:
1944 OS << " &&";
1945 break;
1946 }
1947
1948 switch (EPI.ExceptionSpec.Type) {
1949 case EST_None:
1950 break;
1951 case EST_DynamicNone:
1952 OS << " exceptionspec_dynamic_none";
1953 break;
1954 case EST_Dynamic:
1955 OS << " exceptionspec_dynamic";
1956 break;
1957 case EST_MSAny:
1958 OS << " exceptionspec_ms_any";
1959 break;
1960 case EST_NoThrow:
1961 OS << " exceptionspec_nothrow";
1962 break;
1963 case EST_BasicNoexcept:
1964 OS << " exceptionspec_basic_noexcept";
1965 break;
1967 OS << " exceptionspec_dependent_noexcept";
1968 break;
1969 case EST_NoexceptFalse:
1970 OS << " exceptionspec_noexcept_false";
1971 break;
1972 case EST_NoexceptTrue:
1973 OS << " exceptionspec_noexcept_true";
1974 break;
1975 case EST_Unevaluated:
1976 OS << " exceptionspec_unevaluated";
1977 break;
1978 case EST_Uninstantiated:
1979 OS << " exceptionspec_uninstantiated";
1980 break;
1981 case EST_Unparsed:
1982 OS << " exceptionspec_unparsed";
1983 break;
1984 }
1985 if (!EPI.ExceptionSpec.Exceptions.empty()) {
1986 AddChild([=] {
1987 OS << "Exceptions:";
1988 for (unsigned I = 0, N = EPI.ExceptionSpec.Exceptions.size(); I != N;
1989 ++I) {
1990 if (I)
1991 OS << ",";
1992 dumpType(EPI.ExceptionSpec.Exceptions[I]);
1993 }
1994 });
1995 }
1996 if (EPI.ExceptionSpec.NoexceptExpr) {
1997 AddChild([=] {
1998 OS << "NoexceptExpr: ";
1999 Visit(EPI.ExceptionSpec.NoexceptExpr);
2000 });
2001 }
2002 dumpDeclRef(EPI.ExceptionSpec.SourceDecl, "ExceptionSourceDecl");
2003 dumpDeclRef(EPI.ExceptionSpec.SourceTemplate, "ExceptionSourceTemplate");
2004
2005 // FIXME: Consumed parameters.
2007}
2008
2010 dumpDeclRef(T->getDecl());
2011}
2012
2014 dumpDeclRef(T->getFoundDecl());
2015 if (!T->typeMatchesDecl())
2016 OS << " divergent";
2017}
2018
2020 dumpDeclRef(T->getDecl());
2021 if (!T->typeMatchesDecl())
2022 OS << " divergent";
2023}
2024
2026 switch (T->getUTTKind()) {
2027#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
2028 case UnaryTransformType::Enum: \
2029 OS << " " #Trait; \
2030 break;
2031#include "clang/Basic/TransformTypeTraits.def"
2032 }
2033}
2034
2036 dumpDeclRef(T->getDecl());
2037}
2038
2040 OS << " depth " << T->getDepth() << " index " << T->getIndex();
2041 if (T->isParameterPack())
2042 OS << " pack";
2043 dumpDeclRef(T->getDecl());
2044}
2045
2048 dumpDeclRef(T->getAssociatedDecl());
2049 VisitTemplateTypeParmDecl(T->getReplacedParameter());
2050 if (auto PackIndex = T->getPackIndex())
2051 OS << " pack_index " << *PackIndex;
2052}
2053
2056 dumpDeclRef(T->getAssociatedDecl());
2057 VisitTemplateTypeParmDecl(T->getReplacedParameter());
2058}
2059
2061 if (T->isDecltypeAuto())
2062 OS << " decltype(auto)";
2063 if (!T->isDeduced())
2064 OS << " undeduced";
2065 if (T->isConstrained())
2066 dumpDeclRef(T->getTypeConstraintConcept());
2067}
2068
2071 dumpTemplateName(T->getTemplateName(), "name");
2072}
2073
2076 if (T->isTypeAlias())
2077 OS << " alias";
2078 dumpTemplateName(T->getTemplateName(), "name");
2079}
2080
2082 const InjectedClassNameType *T) {
2083 dumpDeclRef(T->getDecl());
2084}
2085
2087 dumpDeclRef(T->getDecl());
2088}
2089
2091 if (auto N = T->getNumExpansions())
2092 OS << " expansions " << *N;
2093}
2094
2096 // By default, add extra Type details with no extra loc info.
2098}
2099// FIXME: override behavior for TypeLocs that have interesting location
2100// information, such as the qualifier in ElaboratedTypeLoc.
2101
2103
2105 dumpName(D);
2106 dumpType(D->getUnderlyingType());
2107 if (D->isModulePrivate())
2108 OS << " __module_private__";
2109}
2110
2112 if (D->isScoped()) {
2113 if (D->isScopedUsingClassTag())
2114 OS << " class";
2115 else
2116 OS << " struct";
2117 }
2118 dumpName(D);
2119 if (D->isModulePrivate())
2120 OS << " __module_private__";
2121 if (D->isFixed())
2122 dumpType(D->getIntegerType());
2123}
2124
2126 OS << ' ' << D->getKindName();
2127 dumpName(D);
2128 if (D->isModulePrivate())
2129 OS << " __module_private__";
2130 if (D->isCompleteDefinition())
2131 OS << " definition";
2132}
2133
2135 dumpName(D);
2136 dumpType(D->getType());
2137}
2138
2140 dumpName(D);
2141 dumpType(D->getType());
2142
2143 for (const auto *Child : D->chain())
2144 dumpDeclRef(Child);
2145}
2146
2148 dumpName(D);
2149 dumpType(D->getType());
2150 dumpTemplateSpecializationKind(D->getTemplateSpecializationKind());
2151
2152 StorageClass SC = D->getStorageClass();
2153 if (SC != SC_None)
2155 if (D->isInlineSpecified())
2156 OS << " inline";
2157 if (D->isVirtualAsWritten())
2158 OS << " virtual";
2159 if (D->isModulePrivate())
2160 OS << " __module_private__";
2161
2162 if (D->isPureVirtual())
2163 OS << " pure";
2164 if (D->isDefaulted()) {
2165 OS << " default";
2166 if (D->isDeleted())
2167 OS << "_delete";
2168 }
2169 if (D->isDeletedAsWritten())
2170 OS << " delete";
2171 if (D->isTrivial())
2172 OS << " trivial";
2173
2174 if (const StringLiteral *M = D->getDeletedMessage())
2175 AddChild("delete message", [=] { Visit(M); });
2176
2177 if (D->isIneligibleOrNotSelected())
2178 OS << (isa<CXXDestructorDecl>(D) ? " not_selected" : " ineligible");
2179
2180 if (const auto *FPT = D->getType()->getAs<FunctionProtoType>()) {
2181 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
2182 switch (EPI.ExceptionSpec.Type) {
2183 default:
2184 break;
2185 case EST_Unevaluated:
2186 OS << " noexcept-unevaluated " << EPI.ExceptionSpec.SourceDecl;
2187 break;
2188 case EST_Uninstantiated:
2189 OS << " noexcept-uninstantiated " << EPI.ExceptionSpec.SourceTemplate;
2190 break;
2191 }
2192 }
2193
2194 if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
2195 if (MD->size_overridden_methods() != 0) {
2196 auto dumpOverride = [=](const CXXMethodDecl *D) {
2197 SplitQualType T_split = D->getType().split();
2198 OS << D << " " << D->getParent()->getName() << "::" << D->getDeclName()
2199 << " '" << QualType::getAsString(T_split, PrintPolicy) << "'";
2200 };
2201
2202 AddChild([=] {
2203 auto Overrides = MD->overridden_methods();
2204 OS << "Overrides: [ ";
2205 dumpOverride(*Overrides.begin());
2206 for (const auto *Override : llvm::drop_begin(Overrides)) {
2207 OS << ", ";
2208 dumpOverride(Override);
2209 }
2210 OS << " ]";
2211 });
2212 }
2213 }
2214
2215 if (!D->isInlineSpecified() && D->isInlined()) {
2216 OS << " implicit-inline";
2217 }
2218 // Since NumParams comes from the FunctionProtoType of the FunctionDecl and
2219 // the Params are set later, it is possible for a dump during debugging to
2220 // encounter a FunctionDecl that has been created but hasn't been assigned
2221 // ParmVarDecls yet.
2222 if (!D->param_empty() && !D->param_begin())
2223 OS << " <<<NULL params x " << D->getNumParams() << ">>>";
2224
2225 if (const auto *Instance = D->getInstantiatedFromMemberFunction()) {
2226 OS << " instantiated_from";
2227 dumpPointer(Instance);
2228 }
2229}
2230
2232 const CXXDeductionGuideDecl *D) {
2234 switch (D->getDeductionCandidateKind()) {
2237 return;
2239 OS << " aggregate ";
2240 break;
2241 }
2242}
2243
2246 OS << " extended by ";
2247 dumpBareDeclRef(D->getExtendingDecl());
2248 OS << " mangling ";
2249 {
2250 ColorScope Color(OS, ShowColors, ValueColor);
2251 OS << D->getManglingNumber();
2252 }
2253}
2254
2256 dumpName(D);
2257 dumpType(D->getType());
2258 if (D->isMutable())
2259 OS << " mutable";
2260 if (D->isModulePrivate())
2261 OS << " __module_private__";
2262}
2263
2265 dumpNestedNameSpecifier(D->getQualifier());
2266 dumpName(D);
2267 if (const auto *P = dyn_cast<ParmVarDecl>(D);
2268 P && P->isExplicitObjectParameter())
2269 OS << " this";
2270
2271 dumpType(D->getType());
2272 dumpTemplateSpecializationKind(D->getTemplateSpecializationKind());
2273 StorageClass SC = D->getStorageClass();
2274 if (SC != SC_None)
2276 switch (D->getTLSKind()) {
2277 case VarDecl::TLS_None:
2278 break;
2280 OS << " tls";
2281 break;
2283 OS << " tls_dynamic";
2284 break;
2285 }
2286 if (D->isModulePrivate())
2287 OS << " __module_private__";
2288 if (D->isNRVOVariable())
2289 OS << " nrvo";
2290 if (D->isInline())
2291 OS << " inline";
2292 if (D->isConstexpr())
2293 OS << " constexpr";
2294 if (D->hasInit()) {
2295 switch (D->getInitStyle()) {
2296 case VarDecl::CInit:
2297 OS << " cinit";
2298 break;
2299 case VarDecl::CallInit:
2300 OS << " callinit";
2301 break;
2302 case VarDecl::ListInit:
2303 OS << " listinit";
2304 break;
2306 OS << " parenlistinit";
2307 }
2308 }
2309 if (D->needsDestruction(D->getASTContext()))
2310 OS << " destroyed";
2311 if (D->isParameterPack())
2312 OS << " pack";
2313
2314 if (D->hasInit()) {
2315 const Expr *E = D->getInit();
2316 // Only dump the value of constexpr VarDecls for now.
2317 if (E && !E->isValueDependent() && D->isConstexpr() &&
2318 !D->getType()->isDependentType()) {
2319 const APValue *Value = D->evaluateValue();
2320 if (Value)
2321 AddChild("value", [=] { Visit(*Value, E->getType()); });
2322 }
2323 }
2324}
2325
2327 dumpName(D);
2328 dumpType(D->getType());
2329}
2330
2332 if (D->isNothrow())
2333 OS << " nothrow";
2334}
2335
2337 OS << ' ' << D->getImportedModule()->getFullModuleName();
2338
2339 for (Decl *InitD :
2340 D->getASTContext().getModuleInitializers(D->getImportedModule()))
2341 dumpDeclRef(InitD, "initializer");
2342}
2343
2345 OS << ' ';
2346 switch (D->getCommentKind()) {
2347 case PCK_Unknown:
2348 llvm_unreachable("unexpected pragma comment kind");
2349 case PCK_Compiler:
2350 OS << "compiler";
2351 break;
2352 case PCK_ExeStr:
2353 OS << "exestr";
2354 break;
2355 case PCK_Lib:
2356 OS << "lib";
2357 break;
2358 case PCK_Linker:
2359 OS << "linker";
2360 break;
2361 case PCK_User:
2362 OS << "user";
2363 break;
2364 }
2365 StringRef Arg = D->getArg();
2366 if (!Arg.empty())
2367 OS << " \"" << Arg << "\"";
2368}
2369
2371 const PragmaDetectMismatchDecl *D) {
2372 OS << " \"" << D->getName() << "\" \"" << D->getValue() << "\"";
2373}
2374
2376 const OMPExecutableDirective *D) {
2377 if (D->isStandaloneDirective())
2378 OS << " openmp_standalone_directive";
2379}
2380
2382 const OMPDeclareReductionDecl *D) {
2383 dumpName(D);
2384 dumpType(D->getType());
2385 OS << " combiner";
2386 dumpPointer(D->getCombiner());
2387 if (const auto *Initializer = D->getInitializer()) {
2388 OS << " initializer";
2390 switch (D->getInitializerKind()) {
2392 OS << " omp_priv = ";
2393 break;
2395 OS << " omp_priv ()";
2396 break;
2398 break;
2399 }
2400 }
2401}
2402
2404 for (const auto *C : D->clauselists()) {
2405 AddChild([=] {
2406 if (!C) {
2407 ColorScope Color(OS, ShowColors, NullColor);
2408 OS << "<<<NULL>>> OMPClause";
2409 return;
2410 }
2411 {
2412 ColorScope Color(OS, ShowColors, AttrColor);
2413 StringRef ClauseName(
2414 llvm::omp::getOpenMPClauseName(C->getClauseKind()));
2415 OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
2416 << ClauseName.drop_front() << "Clause";
2417 }
2418 dumpPointer(C);
2419 dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
2420 });
2421 }
2422}
2423
2425 dumpName(D);
2426 dumpType(D->getType());
2427}
2428
2430 dumpName(D);
2431 if (D->isInline())
2432 OS << " inline";
2433 if (D->isNested())
2434 OS << " nested";
2435 if (!D->isFirstDecl())
2436 dumpDeclRef(D->getFirstDecl(), "original");
2437}
2438
2440 OS << ' ';
2441 dumpBareDeclRef(D->getNominatedNamespace());
2442}
2443
2445 dumpName(D);
2446 dumpDeclRef(D->getAliasedNamespace());
2447}
2448
2450 dumpName(D);
2451 dumpType(D->getUnderlyingType());
2452}
2453
2455 const TypeAliasTemplateDecl *D) {
2456 dumpName(D);
2457}
2458
2461 if (const auto *Instance = D->getInstantiatedFromMemberClass()) {
2462 OS << " instantiated_from";
2463 dumpPointer(Instance);
2464 }
2465 if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
2466 dumpTemplateSpecializationKind(CTSD->getSpecializationKind());
2467
2468 dumpNestedNameSpecifier(D->getQualifier());
2469
2470 if (!D->isCompleteDefinition())
2471 return;
2472
2473 AddChild([=] {
2474 {
2475 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2476 OS << "DefinitionData";
2477 }
2478#define FLAG(fn, name) \
2479 if (D->fn()) \
2480 OS << " " #name;
2481 FLAG(isParsingBaseSpecifiers, parsing_base_specifiers);
2482
2483 FLAG(isGenericLambda, generic);
2484 FLAG(isLambda, lambda);
2485
2486 FLAG(isAnonymousStructOrUnion, is_anonymous);
2487 FLAG(canPassInRegisters, pass_in_registers);
2488 FLAG(isEmpty, empty);
2489 FLAG(isAggregate, aggregate);
2490 FLAG(isStandardLayout, standard_layout);
2491 FLAG(isTriviallyCopyable, trivially_copyable);
2492 FLAG(isPOD, pod);
2493 FLAG(isTrivial, trivial);
2494 FLAG(isPolymorphic, polymorphic);
2495 FLAG(isAbstract, abstract);
2496 FLAG(isLiteral, literal);
2497
2498 FLAG(hasUserDeclaredConstructor, has_user_declared_ctor);
2499 FLAG(hasConstexprNonCopyMoveConstructor, has_constexpr_non_copy_move_ctor);
2500 FLAG(hasMutableFields, has_mutable_fields);
2501 FLAG(hasVariantMembers, has_variant_members);
2502 FLAG(allowConstDefaultInit, can_const_default_init);
2503
2504 AddChild([=] {
2505 {
2506 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2507 OS << "DefaultConstructor";
2508 }
2509 FLAG(hasDefaultConstructor, exists);
2510 FLAG(hasTrivialDefaultConstructor, trivial);
2511 FLAG(hasNonTrivialDefaultConstructor, non_trivial);
2512 FLAG(hasUserProvidedDefaultConstructor, user_provided);
2513 FLAG(hasConstexprDefaultConstructor, constexpr);
2514 FLAG(needsImplicitDefaultConstructor, needs_implicit);
2515 FLAG(defaultedDefaultConstructorIsConstexpr, defaulted_is_constexpr);
2516 });
2517
2518 AddChild([=] {
2519 {
2520 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2521 OS << "CopyConstructor";
2522 }
2523 FLAG(hasSimpleCopyConstructor, simple);
2524 FLAG(hasTrivialCopyConstructor, trivial);
2525 FLAG(hasNonTrivialCopyConstructor, non_trivial);
2526 FLAG(hasUserDeclaredCopyConstructor, user_declared);
2527 FLAG(hasCopyConstructorWithConstParam, has_const_param);
2528 FLAG(needsImplicitCopyConstructor, needs_implicit);
2529 FLAG(needsOverloadResolutionForCopyConstructor,
2530 needs_overload_resolution);
2531 if (!D->needsOverloadResolutionForCopyConstructor())
2532 FLAG(defaultedCopyConstructorIsDeleted, defaulted_is_deleted);
2533 FLAG(implicitCopyConstructorHasConstParam, implicit_has_const_param);
2534 });
2535
2536 AddChild([=] {
2537 {
2538 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2539 OS << "MoveConstructor";
2540 }
2541 FLAG(hasMoveConstructor, exists);
2542 FLAG(hasSimpleMoveConstructor, simple);
2543 FLAG(hasTrivialMoveConstructor, trivial);
2544 FLAG(hasNonTrivialMoveConstructor, non_trivial);
2545 FLAG(hasUserDeclaredMoveConstructor, user_declared);
2546 FLAG(needsImplicitMoveConstructor, needs_implicit);
2547 FLAG(needsOverloadResolutionForMoveConstructor,
2548 needs_overload_resolution);
2549 if (!D->needsOverloadResolutionForMoveConstructor())
2550 FLAG(defaultedMoveConstructorIsDeleted, defaulted_is_deleted);
2551 });
2552
2553 AddChild([=] {
2554 {
2555 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2556 OS << "CopyAssignment";
2557 }
2558 FLAG(hasSimpleCopyAssignment, simple);
2559 FLAG(hasTrivialCopyAssignment, trivial);
2560 FLAG(hasNonTrivialCopyAssignment, non_trivial);
2561 FLAG(hasCopyAssignmentWithConstParam, has_const_param);
2562 FLAG(hasUserDeclaredCopyAssignment, user_declared);
2563 FLAG(needsImplicitCopyAssignment, needs_implicit);
2564 FLAG(needsOverloadResolutionForCopyAssignment, needs_overload_resolution);
2565 FLAG(implicitCopyAssignmentHasConstParam, implicit_has_const_param);
2566 });
2567
2568 AddChild([=] {
2569 {
2570 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2571 OS << "MoveAssignment";
2572 }
2573 FLAG(hasMoveAssignment, exists);
2574 FLAG(hasSimpleMoveAssignment, simple);
2575 FLAG(hasTrivialMoveAssignment, trivial);
2576 FLAG(hasNonTrivialMoveAssignment, non_trivial);
2577 FLAG(hasUserDeclaredMoveAssignment, user_declared);
2578 FLAG(needsImplicitMoveAssignment, needs_implicit);
2579 FLAG(needsOverloadResolutionForMoveAssignment, needs_overload_resolution);
2580 });
2581
2582 AddChild([=] {
2583 {
2584 ColorScope Color(OS, ShowColors, DeclKindNameColor);
2585 OS << "Destructor";
2586 }
2587 FLAG(hasSimpleDestructor, simple);
2588 FLAG(hasIrrelevantDestructor, irrelevant);
2589 FLAG(hasTrivialDestructor, trivial);
2590 FLAG(hasNonTrivialDestructor, non_trivial);
2591 FLAG(hasUserDeclaredDestructor, user_declared);
2592 FLAG(hasConstexprDestructor, constexpr);
2593 FLAG(needsImplicitDestructor, needs_implicit);
2594 FLAG(needsOverloadResolutionForDestructor, needs_overload_resolution);
2595 if (!D->needsOverloadResolutionForDestructor())
2596 FLAG(defaultedDestructorIsDeleted, defaulted_is_deleted);
2597 });
2598 });
2599
2600 for (const auto &I : D->bases()) {
2601 AddChild([=] {
2602 if (I.isVirtual())
2603 OS << "virtual ";
2604 dumpAccessSpecifier(I.getAccessSpecifier());
2605 dumpType(I.getType());
2606 if (I.isPackExpansion())
2607 OS << "...";
2608 });
2609 }
2610}
2611
2613 dumpName(D);
2614}
2615
2617 dumpName(D);
2618}
2619
2621 dumpName(D);
2622}
2623
2625 dumpName(D);
2626}
2627
2629 if (const auto *TC = D->getTypeConstraint()) {
2630 OS << " ";
2631 dumpBareDeclRef(TC->getNamedConcept());
2632 if (TC->getNamedConcept() != TC->getFoundDecl()) {
2633 OS << " (";
2634 dumpBareDeclRef(TC->getFoundDecl());
2635 OS << ")";
2636 }
2637 } else if (D->wasDeclaredWithTypename())
2638 OS << " typename";
2639 else
2640 OS << " class";
2641 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2642 if (D->isParameterPack())
2643 OS << " ...";
2644 dumpName(D);
2645}
2646
2648 const NonTypeTemplateParmDecl *D) {
2649 dumpType(D->getType());
2650 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2651 if (D->isParameterPack())
2652 OS << " ...";
2653 dumpName(D);
2654}
2655
2657 const TemplateTemplateParmDecl *D) {
2658 OS << " depth " << D->getDepth() << " index " << D->getIndex();
2659 if (D->isParameterPack())
2660 OS << " ...";
2661 dumpName(D);
2662}
2663
2665 OS << ' ';
2666 if (D->getQualifier())
2667 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
2668 OS << D->getDeclName();
2669 dumpNestedNameSpecifier(D->getQualifier());
2670}
2671
2673 OS << ' ';
2674 dumpBareDeclRef(D->getEnumDecl());
2675}
2676
2679 OS << ' ';
2680 if (D->getQualifier())
2681 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
2682 OS << D->getDeclName();
2683}
2684
2686 const UnresolvedUsingValueDecl *D) {
2687 OS << ' ';
2688 if (D->getQualifier())
2689 D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
2690 OS << D->getDeclName();
2691 dumpType(D->getType());
2692}
2693
2695 OS << ' ';
2696 dumpBareDeclRef(D->getTargetDecl());
2697}
2698
2701 if (D->constructsVirtualBase())
2702 OS << " virtual";
2703
2704 AddChild([=] {
2705 OS << "target ";
2706 dumpBareDeclRef(D->getTargetDecl());
2707 });
2708
2709 AddChild([=] {
2710 OS << "nominated ";
2711 dumpBareDeclRef(D->getNominatedBaseClass());
2712 OS << ' ';
2713 dumpBareDeclRef(D->getNominatedBaseClassShadowDecl());
2714 });
2715
2716 AddChild([=] {
2717 OS << "constructed ";
2718 dumpBareDeclRef(D->getConstructedBaseClass());
2719 OS << ' ';
2720 dumpBareDeclRef(D->getConstructedBaseClassShadowDecl());
2721 });
2722}
2723
2725 switch (D->getLanguage()) {
2727 OS << " C";
2728 break;
2730 OS << " C++";
2731 break;
2732 }
2733}
2734
2736 OS << ' ';
2738}
2739
2741 if (TypeSourceInfo *T = D->getFriendType())
2742 dumpType(T->getType());
2743 if (D->isPackExpansion())
2744 OS << "...";
2745}
2746
2748 dumpName(D);
2749 dumpType(D->getType());
2750 if (D->getSynthesize())
2751 OS << " synthesize";
2752
2753 switch (D->getAccessControl()) {
2754 case ObjCIvarDecl::None:
2755 OS << " none";
2756 break;
2758 OS << " private";
2759 break;
2761 OS << " protected";
2762 break;
2764 OS << " public";
2765 break;
2767 OS << " package";
2768 break;
2769 }
2770}
2771
2773 if (D->isInstanceMethod())
2774 OS << " -";
2775 else
2776 OS << " +";
2777 dumpName(D);
2778 dumpType(D->getReturnType());
2779
2780 if (D->isVariadic())
2781 OS << " variadic";
2782}
2783
2785 dumpName(D);
2786 switch (D->getVariance()) {
2788 break;
2789
2791 OS << " covariant";
2792 break;
2793
2795 OS << " contravariant";
2796 break;
2797 }
2798
2799 if (D->hasExplicitBound())
2800 OS << " bounded";
2801 dumpType(D->getUnderlyingType());
2802}
2803
2805 dumpName(D);
2806 dumpDeclRef(D->getClassInterface());
2807 dumpDeclRef(D->getImplementation());
2808 for (const auto *P : D->protocols())
2809 dumpDeclRef(P);
2810}
2811
2813 dumpName(D);
2814 dumpDeclRef(D->getClassInterface());
2815 dumpDeclRef(D->getCategoryDecl());
2816}
2817
2819 dumpName(D);
2820
2821 for (const auto *Child : D->protocols())
2822 dumpDeclRef(Child);
2823}
2824
2826 dumpName(D);
2827 dumpDeclRef(D->getSuperClass(), "super");
2828
2829 dumpDeclRef(D->getImplementation());
2830 for (const auto *Child : D->protocols())
2831 dumpDeclRef(Child);
2832}
2833
2835 const ObjCImplementationDecl *D) {
2836 dumpName(D);
2837 dumpDeclRef(D->getSuperClass(), "super");
2838 dumpDeclRef(D->getClassInterface());
2839}
2840
2842 const ObjCCompatibleAliasDecl *D) {
2843 dumpName(D);
2844 dumpDeclRef(D->getClassInterface());
2845}
2846
2848 dumpName(D);
2849 dumpType(D->getType());
2850
2851 if (D->getPropertyImplementation() == ObjCPropertyDecl::Required)
2852 OS << " required";
2853 else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional)
2854 OS << " optional";
2855
2856 ObjCPropertyAttribute::Kind Attrs = D->getPropertyAttributes();
2859 OS << " readonly";
2861 OS << " assign";
2863 OS << " readwrite";
2865 OS << " retain";
2867 OS << " copy";
2869 OS << " nonatomic";
2871 OS << " atomic";
2873 OS << " weak";
2875 OS << " strong";
2877 OS << " unsafe_unretained";
2879 OS << " class";
2881 OS << " direct";
2883 dumpDeclRef(D->getGetterMethodDecl(), "getter");
2885 dumpDeclRef(D->getSetterMethodDecl(), "setter");
2886 }
2887}
2888
2890 dumpName(D->getPropertyDecl());
2891 if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize)
2892 OS << " synthesize";
2893 else
2894 OS << " dynamic";
2895 dumpDeclRef(D->getPropertyDecl());
2896 dumpDeclRef(D->getPropertyIvarDecl());
2897}
2898
2900 if (D->isVariadic())
2901 OS << " variadic";
2902
2903 if (D->capturesCXXThis())
2904 OS << " captures_this";
2905}
2906
2908 dumpName(D);
2909}
2910
2912 VisitStmt(S);
2913 if (S->hasStoredFPFeatures())
2914 printFPOptions(S->getStoredFPFeatures());
2915}
2916
2918 if (D->isCBuffer())
2919 OS << " cbuffer";
2920 else
2921 OS << " tbuffer";
2922 dumpName(D);
2923}
2924
2926 OS << (E->isInOut() ? " inout" : " out");
2927}
2928
2930 OS << " " << S->getDirectiveKind();
2931}
2933
2934 if (S->isOrphanedLoopConstruct())
2935 OS << " <orphan>";
2936 else
2937 OS << " parent: " << S->getParentComputeConstructKind();
2938}
2939
2941 const OpenACCCombinedConstruct *S) {
2942 OS << " " << S->getDirectiveKind();
2943}
2944
2946 OS << " " << S->getDirectiveKind();
2947}
2948
2950 const OpenACCEnterDataConstruct *S) {
2951 OS << " " << S->getDirectiveKind();
2952}
2953
2955 const OpenACCExitDataConstruct *S) {
2956 OS << " " << S->getDirectiveKind();
2957}
2958
2960 const OpenACCHostDataConstruct *S) {
2961 OS << " " << S->getDirectiveKind();
2962}
2963
2965 OS << " " << S->getDirectiveKind();
2966}
2968 OS << " " << S->getDirectiveKind();
2969}
2971 const OpenACCShutdownConstruct *S) {
2972 OS << " " << S->getDirectiveKind();
2973}
2974
2976 AddChild("begin", [=] { OS << S->getStartingElementPos(); });
2977 AddChild("number of elements", [=] { OS << S->getDataElementCount(); });
2978}
2979
2981 OS << ' ' << AE->getOpAsString();
2982}
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:1838
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:1638
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:2899
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:2175
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:2068
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:3056
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:2425
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 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:2621
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',...
@ 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.