25#include "llvm/ADT/StringExtras.h"
26#include "llvm/Support/raw_ostream.h"
30 class DeclPrinter :
public DeclVisitor<DeclPrinter> {
32 PrintingPolicy Policy;
33 const ASTContext &Context;
35 bool PrintInstantiation;
38 raw_ostream&
Indent(
unsigned Indentation);
39 void ProcessDeclGroup(SmallVectorImpl<Decl*>& Decls);
42 void PrintConstructorInitializers(CXXConstructorDecl *CDecl,
52 void PrintObjCTypeParams(ObjCTypeParamList *Params);
53 void PrintOpenACCRoutineOnLambda(Decl *D);
55 void printVarDeclSpecifiers(VarDecl *D);
56 void printVarInitializer(VarDecl *D);
59 DeclPrinter(raw_ostream &Out,
const PrintingPolicy &Policy,
60 const ASTContext &Context,
unsigned Indentation = 0,
61 bool PrintInstantiation =
false)
62 : Out(Out), Policy(Policy), Context(Context), Indentation(Indentation),
63 PrintInstantiation(PrintInstantiation) {}
65 void VisitDeclContext(DeclContext *DC,
bool Indent =
true);
67 void VisitTranslationUnitDecl(TranslationUnitDecl *D);
68 void VisitTypedefDecl(TypedefDecl *D);
69 void VisitTypeAliasDecl(TypeAliasDecl *D);
70 void VisitEnumDecl(EnumDecl *D);
71 void VisitRecordDecl(RecordDecl *D);
72 void VisitEnumConstantDecl(EnumConstantDecl *D);
73 void VisitEmptyDecl(EmptyDecl *D);
74 void VisitFunctionDecl(FunctionDecl *D);
75 void VisitFriendDecl(FriendDecl *D);
76 void VisitFriendTemplateDecl(FriendTemplateDecl *D);
77 void VisitFieldDecl(FieldDecl *D);
78 void VisitVarDecl(VarDecl *D);
79 void VisitDecompositionDecl(DecompositionDecl *D);
80 void VisitLabelDecl(LabelDecl *D);
81 void VisitParmVarDecl(ParmVarDecl *D);
82 void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);
83 void VisitTopLevelStmtDecl(TopLevelStmtDecl *D);
84 void VisitImportDecl(ImportDecl *D);
85 void VisitStaticAssertDecl(StaticAssertDecl *D);
86 void VisitNamespaceDecl(NamespaceDecl *D);
87 void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
88 void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
89 void VisitCXXRecordDecl(CXXRecordDecl *D);
90 void VisitLinkageSpecDecl(LinkageSpecDecl *D);
91 void VisitTemplateDecl(
const TemplateDecl *D);
92 void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
93 void VisitClassTemplateDecl(ClassTemplateDecl *D);
94 void VisitExplicitInstantiationDecl(ExplicitInstantiationDecl *D);
95 void VisitClassTemplateSpecializationDecl(
96 ClassTemplateSpecializationDecl *D);
97 void VisitClassTemplatePartialSpecializationDecl(
98 ClassTemplatePartialSpecializationDecl *D);
99 void VisitObjCMethodDecl(ObjCMethodDecl *D);
100 void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
101 void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
102 void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
103 void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
104 void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
105 void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
106 void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
107 void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
108 void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
109 void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
110 void VisitUsingDecl(UsingDecl *D);
111 void VisitUsingEnumDecl(UsingEnumDecl *D);
112 void VisitUsingShadowDecl(UsingShadowDecl *D);
113 void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D);
114 void VisitOMPAllocateDecl(OMPAllocateDecl *D);
115 void VisitOMPRequiresDecl(OMPRequiresDecl *D);
116 void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D);
117 void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D);
118 void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D);
119 void VisitTemplateTypeParmDecl(
const TemplateTypeParmDecl *TTP);
120 void VisitNonTypeTemplateParmDecl(
const NonTypeTemplateParmDecl *NTTP);
121 void VisitTemplateTemplateParmDecl(
const TemplateTemplateParmDecl *);
122 void VisitHLSLBufferDecl(HLSLBufferDecl *D);
123 void VisitCXXExpansionStmtDecl(
const CXXExpansionStmtDecl *D);
125 void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D);
126 void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D);
128 void printTemplateParameters(
const TemplateParameterList *Params,
129 bool OmitTemplateKW =
false);
130 void printTemplateArguments(ArrayRef<TemplateArgument> Args,
131 const TemplateParameterList *Params);
132 void printTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
133 const TemplateParameterList *Params);
135 std::optional<std::string>
136 prettyPrintAttributes(
const Decl *D,
137 AttrPosAsWritten Pos = AttrPosAsWritten::Default);
139 void prettyPrintPragmas(Decl *D);
140 void printDeclType(QualType
T, StringRef DeclName,
bool Pack =
false);
145 bool PrintInstantiation)
const {
150 unsigned Indentation,
bool PrintInstantiation)
const {
151 DeclPrinter Printer(Out, Policy,
getASTContext(), Indentation,
153 Printer.Visit(
const_cast<Decl*
>(
this));
157 bool OmitTemplateKW)
const {
158 print(Out, Context, Context.getPrintingPolicy(), OmitTemplateKW);
163 bool OmitTemplateKW)
const {
164 DeclPrinter Printer(Out, Policy, Context);
165 Printer.printTemplateParameters(
this, OmitTemplateKW);
171 while (!BaseType->isSpecifierType()) {
173 BaseType = PTy->getPointeeType();
176 BaseType = OPT->getPointeeType();
178 BaseType = BPy->getPointeeType();
179 else if (
const ArrayType *ATy = dyn_cast<ArrayType>(BaseType))
180 BaseType = ATy->getElementType();
182 BaseType = FTy->getReturnType();
184 BaseType = VTy->getElementType();
186 BaseType = RTy->getPointeeType();
187 else if (
const AutoType *ATy = BaseType->getAs<AutoType>())
188 BaseType = ATy->getDeducedType();
190 BaseType = PTy->desugar();
200 return TDD->getUnderlyingType();
201 if (
ValueDecl* VD = dyn_cast<ValueDecl>(D))
202 return VD->getType();
208 unsigned Indentation) {
210 (*Begin)->print(Out, Policy, Indentation);
214 Decl** End = Begin + NumDecls;
221 for ( ; Begin != End; ++Begin) {
229 (*Begin)->print(Out, SubPolicy, Indentation);
241 Printer.VisitDeclContext(
const_cast<DeclContext *
>(
this),
false);
244raw_ostream& DeclPrinter::Indent(
unsigned Indentation) {
245 for (
unsigned i = 0; i != Indentation; ++i)
256 return DeclPrinter::AttrPosAsWritten::Left;
258 if (
C.getSourceManager().isBeforeInTranslationUnit(ALoc, DLoc))
259 return DeclPrinter::AttrPosAsWritten::Left;
261 return DeclPrinter::AttrPosAsWritten::Right;
264std::optional<std::string>
265DeclPrinter::prettyPrintAttributes(
const Decl *D,
266 AttrPosAsWritten Pos ) {
271 llvm::raw_string_ostream AOut(AttrStr);
272 llvm::ListSeparator LS(
" ");
274 if (A->isInherited() || A->isImplicit())
279 switch (A->getKind()) {
281#define PRAGMA_SPELLING_ATTR(X) case attr::X:
282#include "clang/Basic/AttrList.inc"
286 assert(APos != AttrPosAsWritten::Default &&
287 "Default not a valid for an attribute location");
288 if (Pos == AttrPosAsWritten::Default || Pos == APos) {
290 A->printPretty(AOut, Policy);
300void DeclPrinter::PrintOpenACCRoutineOnLambda(
Decl *D) {
302 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
303 if (
const auto *
Init = VD->getInit())
305 :
Init->getType()->getAsCXXRecordDecl();
306 }
else if (
const auto *FD = dyn_cast<FieldDecl>(D)) {
308 FD->getType().isNull() ?
nullptr : FD->getType()->getAsCXXRecordDecl();
315 for (
auto *A :
Call->specific_attrs<OpenACCRoutineDeclAttr>()) {
316 A->printPretty(Out, Policy);
322void DeclPrinter::prettyPrintPragmas(
Decl *D) {
326 PrintOpenACCRoutineOnLambda(D);
330 for (
auto *A : Attrs) {
331 switch (A->getKind()) {
333#define PRAGMA_SPELLING_ATTR(X) case attr::X:
334#include "clang/Basic/AttrList.inc"
335 A->printPretty(Out, Policy);
345void DeclPrinter::printDeclType(
QualType T, StringRef DeclName,
bool Pack) {
349 if (
auto *PET =
T->getAs<PackExpansionType>()) {
351 T = PET->getPattern();
353 T.print(Out, Policy, (Pack ?
"..." :
"") + DeclName, Indentation);
366 if (AccessSpelling.empty())
367 llvm_unreachable(
"No access specifier!");
368 Out << AccessSpelling;
372 std::string &Proto) {
373 bool HasInitializerList =
false;
374 for (
const auto *BMInitializer : CDecl->
inits()) {
375 if (BMInitializer->isInClassMemberInitializer())
377 if (!BMInitializer->isWritten())
380 if (!HasInitializerList) {
384 HasInitializerList =
true;
388 if (BMInitializer->isAnyMemberInitializer()) {
389 FieldDecl *FD = BMInitializer->getAnyMember();
391 }
else if (BMInitializer->isDelegatingInitializer()) {
397 if (
Expr *
Init = BMInitializer->getInit()) {
404 Init = Tmp->getSubExpr();
408 Expr *SimpleInit =
nullptr;
409 Expr **Args =
nullptr;
410 unsigned NumArgs = 0;
412 Args = ParenList->getExprs();
413 NumArgs = ParenList->getNumExprs();
415 dyn_cast<CXXConstructExpr>(
Init)) {
416 Args = Construct->getArgs();
417 NumArgs = Construct->getNumArgs();
422 SimpleInit->
printPretty(Out,
nullptr, Policy, Indentation,
"\n",
425 for (
unsigned I = 0; I != NumArgs; ++I) {
426 assert(Args[I] !=
nullptr &&
"Expected non-null Expr");
432 Args[I]->
printPretty(Out,
nullptr, Policy, Indentation,
"\n",
443 if (BMInitializer->isPackExpansion())
474 if (
auto FD = dyn_cast<FunctionDecl>(*D))
495 if (!Decls.empty() && !CurDeclType.
isNull() &&
498 if (
const auto *TT = dyn_cast_or_null<TagType>(BaseType);
499 TT && TT->isTagOwned()) {
500 if (TT->getDecl() == Decls[0]) {
509 ProcessDeclGroup(Decls);
531 const char *Terminator =
nullptr;
535 Terminator =
nullptr;
537 Terminator =
nullptr;
539 Terminator =
nullptr;
540 else if (
auto FD = dyn_cast<FunctionDecl>(*D)) {
541 if (FD->doesThisDeclarationHaveABody() && !FD->isDefaulted())
542 Terminator =
nullptr;
545 }
else if (
auto TD = dyn_cast<FunctionTemplateDecl>(*D)) {
546 if (TD->getTemplatedDecl()->doesThisDeclarationHaveABody())
547 Terminator =
nullptr;
553 Terminator =
nullptr;
575 if (D->
hasAttr<OMPDeclareTargetDeclAttr>())
576 Out <<
"#pragma omp end declare target\n";
580 ProcessDeclGroup(Decls);
587 VisitDeclContext(D,
false);
590void DeclPrinter::VisitTypedefDecl(
TypedefDecl *D) {
595 Out <<
"__module_private__ ";
600 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
601 Out <<
' ' << *Attrs;
605 Out <<
"using " << *D;
606 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
607 Out <<
' ' << *Attrs;
611void DeclPrinter::VisitEnumDecl(
EnumDecl *D) {
613 Out <<
"__module_private__ ";
622 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
623 Out <<
' ' << *Attrs;
638void DeclPrinter::VisitRecordDecl(
RecordDecl *D) {
640 Out <<
"__module_private__ ";
643 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
644 Out <<
' ' << *Attrs;
649 if (D->isCompleteDefinition()) {
658 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
659 Out <<
' ' << *Attrs;
662 Init->printPretty(Out,
nullptr, Policy, Indentation,
"\n", &Context);
669 std::string Proto =
"explicit";
670 llvm::raw_string_ostream EOut(Proto);
684 prettyPrintPragmas(D);
685 if (std::optional<std::string> Attrs =
686 prettyPrintAttributes(D, AttrPosAsWritten::Left))
687 Out << *Attrs <<
' ';
691 Out <<
"template<> ";
694 printTemplateParameters(TPL);
707 llvm_unreachable(
"invalid for functions");
724 SubPolicy.SuppressSpecifiers =
false;
727 if (Policy.FullyQualifiedName) {
730 llvm::raw_string_ostream
OS(Proto);
739 llvm::raw_string_ostream POut(Proto);
740 DeclPrinter TArgPrinter(POut, SubPolicy, Context, Indentation);
742 if (TArgAsWritten && !Policy.PrintAsCanonical)
743 TArgPrinter.printTemplateArguments(TArgAsWritten->arguments(),
nullptr);
746 TArgPrinter.printTemplateArguments(TArgs->asArray(),
nullptr);
750 while (
const ParenType *PT = dyn_cast<ParenType>(Ty)) {
751 Proto =
'(' + Proto +
')';
752 Ty = PT->getInnerType();
758 FT = dyn_cast<FunctionProtoType>(AFT);
762 llvm::raw_string_ostream POut(Proto);
763 DeclPrinter ParamPrinter(POut, SubPolicy, Context, Indentation);
764 for (
unsigned i = 0, e = D->
getNumParams(); i != e; ++i) {
778 for (
unsigned i = 0, e = D->
getNumParams(); i != e; ++i) {
791 Proto +=
" volatile";
793 Proto +=
" restrict";
820 Proto +=
" noexcept";
823 llvm::raw_string_ostream EOut(Proto);
825 Indentation,
"\n", &Context);
832 PrintConstructorInitializers(CDecl, Proto);
837 Out << Proto <<
" -> ";
840 AFT->getReturnType().print(Out, Policy, Proto);
851 TrailingRequiresClause.ConstraintExpr->printPretty(
852 Out,
nullptr, SubPolicy, Indentation,
"\n", &Context);
855 Ty.
print(Out, Policy, Proto);
858 if (std::optional<std::string> Attrs =
859 prettyPrintAttributes(D, AttrPosAsWritten::Right))
860 Out <<
' ' << *Attrs;
868 M->outputString(Out);
879 DeclPrinter ParamPrinter(Out, SubPolicy, Context, Indentation);
881 for (
unsigned i = 0, e = D->
getNumParams(); i != e; ++i) {
899void DeclPrinter::VisitFriendDecl(
FriendDecl *D) {
902 Out << TSI->getType().getAsString(Policy);
905 VisitFunctionDecl(FD);
909 VisitFunctionTemplateDecl(FTD);
913 VisitRedeclarableTemplateDecl(CTD);
922 printTemplateParameters(TPL);
931 Out << CTD->getTemplatedDecl()->getKindName() <<
' ';
932 TN.
print(Out, Policy,
941void DeclPrinter::VisitFieldDecl(
FieldDecl *D) {
942 prettyPrintPragmas(D);
947 Out <<
"__module_private__ ";
950 stream(Policy, D->
getName(), Indentation);
964 Init->printPretty(Out,
nullptr, Policy, Indentation,
"\n", &Context);
966 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
967 Out <<
' ' << *Attrs;
970void DeclPrinter::VisitLabelDecl(
LabelDecl *D) {
974void DeclPrinter::printVarDeclSpecifiers(
VarDecl *D) {
975 prettyPrintPragmas(D);
977 if (std::optional<std::string> Attrs =
978 prettyPrintAttributes(D, AttrPosAsWritten::Left))
979 Out << *Attrs <<
' ';
981 if (
const auto *Param = dyn_cast<ParmVarDecl>(D);
982 Param && Param->isExplicitObjectParameter())
1001 Out <<
"_Thread_local ";
1004 Out <<
"thread_local ";
1009 Out <<
"__module_private__ ";
1012 Out <<
"constexpr ";
1013 T.removeLocalConst();
1025void DeclPrinter::VisitVarDecl(
VarDecl *D) {
1026 printVarDeclSpecifiers(D);
1028 if (std::optional<std::string> Attrs =
1029 prettyPrintAttributes(D, AttrPosAsWritten::Right))
1030 Out <<
' ' << *Attrs;
1032 printVarInitializer(D);
1035void DeclPrinter::printVarInitializer(
VarDecl *D) {
1038 bool ImplicitInit =
false;
1041 ImplicitInit =
true;
1043 dyn_cast<CXXConstructExpr>(
Init->IgnoreImplicit())) {
1045 !Construct->isListInitialization()) {
1046 ImplicitInit = Construct->getNumArgs() == 0 ||
1047 Construct->getArg(0)->isDefaultArgument();
1050 if (!ImplicitInit) {
1057 SubPolicy.SuppressSpecifiers =
false;
1058 Init->printPretty(Out,
nullptr, SubPolicy, Indentation,
"\n", &Context);
1066 printVarDeclSpecifiers(D);
1069 llvm::ListSeparator LS;
1072 if (B->isParameterPack())
1074 Out << B->getName();
1075 if (std::optional<std::string> Attrs =
1076 prettyPrintAttributes(B, AttrPosAsWritten::Right))
1077 Out <<
' ' << *Attrs;
1081 printVarInitializer(D);
1084void DeclPrinter::VisitParmVarDecl(
ParmVarDecl *D) {
1100void DeclPrinter::VisitImportDecl(
ImportDecl *D) {
1106 Out <<
"static_assert(";
1111 E->printPretty(Out,
nullptr, Policy, Indentation,
"\n", &Context);
1123 Out <<
"namespace ";
1128 VisitDeclContext(D);
1133 Out <<
"using namespace ";
1139 Out <<
"namespace " << *D <<
" = ";
1144void DeclPrinter::VisitEmptyDecl(
EmptyDecl *D) {
1145 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
1152 Out <<
"__module_private__ ";
1156 if (std::optional<std::string> Attrs =
1157 prettyPrintAttributes(D, AttrPosAsWritten::Left))
1158 Out << *Attrs <<
' ';
1164 if (
auto *S = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
1166 S->getSpecializedTemplate()->getTemplateParameters();
1168 S->getTemplateArgsAsWritten();
1169 if (TArgAsWritten && !Policy.PrintAsCanonical)
1170 printTemplateArguments(TArgAsWritten->
arguments(), TParams);
1172 printTemplateArguments(S->getTemplateArgs().asArray(), TParams);
1176 if (std::optional<std::string> Attrs =
1177 prettyPrintAttributes(D, AttrPosAsWritten::Right))
1178 Out <<
' ' << *Attrs;
1180 if (D->isCompleteDefinition()) {
1183 if (D->getNumBases()) {
1186 BaseEnd = D->bases_end(); Base != BaseEnd; ++Base) {
1187 if (Base != D->bases_begin())
1190 if (
Base->isVirtual())
1198 Out <<
Base->getType().getAsString(Policy);
1200 if (
Base->isPackExpansion())
1212 VisitDeclContext(D);
1224 "unknown language in linkage specification");
1228 Out <<
"extern \"" << l <<
"\" ";
1231 VisitDeclContext(D);
1238 bool OmitTemplateKW) {
1245 if (!OmitTemplateKW)
1249 bool NeedComma =
false;
1250 for (
const Decl *Param : *Params) {
1251 if (Param->isImplicit())
1259 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
1260 VisitTemplateTypeParmDecl(TTP);
1261 }
else if (
auto NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
1262 VisitNonTypeTemplateParmDecl(NTTP);
1263 }
else if (
auto TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
1264 VisitTemplateTemplateParmDecl(TTPD);
1270 if (
const Expr *RequiresClause = Params->getRequiresClause()) {
1271 Out <<
" requires ";
1272 RequiresClause->printPretty(Out,
nullptr, Policy, Indentation,
"\n",
1276 if (!OmitTemplateKW)
1283 for (
size_t I = 0, E = Args.size(); I < E; ++I) {
1287 Args[I].print(Policy, Out,
true);
1289 Args[I].print(Policy, Out,
1291 Policy, Params, I));
1299 for (
size_t I = 0, E = Args.size(); I < E; ++I) {
1303 Args[I].getArgument().print(Policy, Out,
true);
1305 Args[I].getArgument().print(
1313void DeclPrinter::VisitTemplateDecl(
const TemplateDecl *D) {
1317 dyn_cast<TemplateTemplateParmDecl>(D)) {
1318 switch (TTP->templateParameterKind()) {
1326 if (TTP->wasDeclaredWithTypename())
1333 if (TTP->isParameterPack())
1335 else if (TTP->getDeclName())
1338 if (TTP->getDeclName()) {
1339 if (Policy.CleanUglifiedParameters && TTP->getIdentifier())
1340 Out << TTP->getIdentifier()->deuglifiedName();
1342 Out << TTP->getDeclName();
1346 else if (
const auto *
Concept = dyn_cast<ConceptDecl>(D)) {
1347 Out <<
"concept " <<
Concept->getName() <<
" = " ;
1348 Concept->getConstraintExpr()->printPretty(Out,
nullptr, Policy, Indentation,
1358 printTemplateParameters(TPL);
1359 VisitRedeclarableTemplateDecl(D);
1363 Out <<
"#pragma omp end declare target\n";
1367 if (PrintInstantiation &&
1371 if (PrevDecl->
isDefined(Def) && Def != PrevDecl)
1378 prettyPrintPragmas(I);
1385 VisitRedeclarableTemplateDecl(D);
1387 if (PrintInstantiation) {
1408 llvm::raw_string_ostream NameOS(Name);
1414 for (
unsigned I = 0; I < *NumArgs; ++I)
1416 printTemplateArgumentList(NameOS, Args, Policy);
1419 if (
auto *RD = dyn_cast<RecordDecl>(Spec)) {
1420 Out << RD->getKindName() <<
" " << Name;
1421 }
else if (
auto *FD = dyn_cast<FunctionDecl>(Spec)) {
1422 FD->getReturnType().
print(Out, Policy);
1423 Out <<
" " << Name <<
"(";
1424 llvm::ListSeparator LS;
1427 P->print(Out, Policy);
1429 if (FD->isVariadic()) {
1435 TSI->getType().print(Out, Policy, Name);
1437 llvm_unreachable(
"unexpected specialization kind");
1441void DeclPrinter::VisitClassTemplateSpecializationDecl(
1443 Out <<
"template<> ";
1444 VisitCXXRecordDecl(D);
1447void DeclPrinter::VisitClassTemplatePartialSpecializationDecl(
1450 VisitCXXRecordDecl(D);
1455 Indentation,
"\n", &Context);
1462void DeclPrinter::PrintObjCMethodType(
ASTContext &Ctx,
1479 if (
auto nullability = AttributedType::stripOuterNullability(
T))
1489 unsigned First =
true;
1490 for (
auto *Param : *Params) {
1497 switch (Param->getVariance()) {
1502 Out <<
"__covariant ";
1506 Out <<
"__contravariant ";
1510 Out << Param->getDeclName();
1512 if (Param->hasExplicitBound()) {
1513 Out <<
" : " << Param->getUnderlyingType().getAsString(Policy);
1530 std::string::size_type pos, lastPos = 0;
1533 pos =
name.find_first_of(
':', lastPos);
1536 Out <<
name.substr(lastPos, pos - lastPos) <<
':';
1538 PI->getObjCDeclQualifier(),
1550 if (std::optional<std::string> Attrs = prettyPrintAttributes(OMD))
1551 Out <<
' ' << *Attrs;
1566 bool eolnOut =
false;
1568 Out <<
"@implementation " << I <<
" : " << *SID;
1570 Out <<
"@implementation " << I;
1576 for (
const auto *I : OID->
ivars()) {
1577 Indent() << I->getASTContext().getUnqualifiedObjCPointerType(I->getType()).
1582 }
else if (SID || !OID->
decls().empty()) {
1586 VisitDeclContext(OID,
false);
1597 Out <<
"@class " << I;
1600 PrintObjCTypeParams(TypeParams);
1606 bool eolnOut =
false;
1607 if (std::optional<std::string> Attrs = prettyPrintAttributes(OID))
1608 Out << *Attrs <<
"\n";
1610 Out <<
"@interface " << I;
1613 PrintObjCTypeParams(TypeParams);
1621 if (!Protocols.
empty()) {
1623 E = Protocols.
end(); I != E; ++I)
1624 Out << (I == Protocols.
begin() ?
'<' :
',') << **I;
1632 for (
const auto *I : OID->
ivars()) {
1633 Indent() << I->getASTContext()
1634 .getUnqualifiedObjCPointerType(I->getType())
1635 .getAsString(Policy) <<
' ' << *I <<
";\n";
1639 }
else if (SID || !OID->
decls().empty()) {
1644 VisitDeclContext(OID,
false);
1653 Out <<
"@protocol " << *PID <<
";\n";
1658 if (!Protocols.
empty()) {
1659 Out <<
"@protocol " << *PID;
1661 E = Protocols.
end(); I != E; ++I)
1662 Out << (I == Protocols.
begin() ?
'<' :
',') << **I;
1665 Out <<
"@protocol " << *PID <<
'\n';
1666 VisitDeclContext(PID,
false);
1671 Out <<
"@implementation ";
1675 Out <<
"<<error-type>>";
1676 Out <<
'(' << *PID <<
")\n";
1678 VisitDeclContext(PID,
false);
1684 Out <<
"@interface ";
1688 Out <<
"<<error-type>>";
1690 PrintObjCTypeParams(TypeParams);
1692 Out <<
"(" << *PID <<
")\n";
1693 if (PID->ivar_size() > 0) {
1696 for (
const auto *I : PID->ivars())
1697 Indent() << I->getASTContext().getUnqualifiedObjCPointerType(I->getType()).
1703 VisitDeclContext(PID,
false);
1710 Out <<
"@compatibility_alias " << *AID
1725 Out <<
"@required\n";
1727 Out <<
"@optional\n";
1736 Out << (first ?
"" :
", ") <<
"class";
1741 Out << (first ?
"" :
", ") <<
"direct";
1747 Out << (first ?
"" :
", ") <<
"nonatomic";
1751 Out << (first ?
"" :
", ") <<
"atomic";
1756 Out << (first ?
"" :
", ") <<
"assign";
1760 Out << (first ?
"" :
", ") <<
"retain";
1765 Out << (first ?
"" :
", ") <<
"strong";
1769 Out << (first ?
"" :
", ") <<
"copy";
1773 Out << (first ?
"" :
", ") <<
"weak";
1778 Out << (first ?
"" :
", ") <<
"unsafe_unretained";
1784 Out << (first ?
"" :
", ") <<
"readwrite";
1788 Out << (first ?
"" :
", ") <<
"readonly";
1793 Out << (first ?
"" :
", ") <<
"getter = ";
1798 Out << (first ?
"" :
", ") <<
"setter = ";
1805 if (
auto nullability = AttributedType::stripOuterNullability(
T)) {
1809 Out << (first ?
"" :
", ") <<
"null_resettable";
1811 Out << (first ?
"" :
", ")
1823 Out <<
' ' << TypeStr;
1824 if (!StringRef(TypeStr).ends_with(
"*"))
1833 Out <<
"@synthesize ";
1841void DeclPrinter::VisitUsingDecl(
UsingDecl *D) {
1850 for (
const auto *Shadow : D->
shadows()) {
1851 if (
const auto *ConstructorShadow =
1852 dyn_cast<ConstructorUsingShadowDecl>(Shadow)) {
1853 assert(Shadow->getDeclContext() == ConstructorShadow->getDeclContext());
1854 Out << *ConstructorShadow->getNominatedBaseClass();
1867 Out <<
"using typename ";
1884 Out <<
"#pragma omp threadprivate";
1905 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
1906 Out <<
' ' << *Attrs;
1909 VisitDeclContext(D);
1914 Out <<
"#pragma omp allocate";
1926 OMPClausePrinter Printer(Out, Policy,
1936 Out <<
"#pragma omp requires ";
1938 OMPClausePrinter Printer(Out, Policy,
1947 Out <<
"#pragma omp declare reduction (";
1949 const char *OpName =
1951 assert(OpName &&
"not an overloaded operator");
1963 Out <<
" initializer(";
1969 Out <<
"omp_priv = ";
1974 Init->printPretty(Out,
nullptr, Policy, 0,
"\n", &Context);
1984 Out <<
"#pragma omp declare mapper (";
1992 OMPClausePrinter Printer(Out, Policy,
2008 TC->print(Out, Policy);
2033void DeclPrinter::VisitNonTypeTemplateParmDecl(
2038 Policy.CleanUglifiedParameters ? II->deuglifiedName() : II->getName();
2048void DeclPrinter::VisitTemplateTemplateParmDecl(
2050 VisitTemplateDecl(TTPD);
2060 Out <<
"#pragma acc declare";
2064 Printer.VisitClauseList(D->
clauses());
2070 Out <<
"#pragma acc routine";
2087 Printer.VisitClauseList(D->
clauses());
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
static DeclPrinter::AttrPosAsWritten getPosAsWritten(const Attr *A, const Decl *D)
static QualType getDeclType(Decl *D)
static QualType GetBaseType(QualType T)
static void printExplicitSpecifier(ExplicitSpecifier ES, llvm::raw_ostream &Out, PrintingPolicy &Policy, unsigned Indentation, const ASTContext &Context)
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::Module class, which describes a module in the source code.
Defines the SourceManager interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const LangOptions & getLangOpts() const
const clang::PrintingPolicy & getPrintingPolicy() const
QualType getUnqualifiedObjCPointerType(QualType type) const
getUnqualifiedObjCPointerType - Returns version of Objective-C pointer type with lifetime qualifier r...
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Attr - This represents one attribute.
SourceLocation getLoc() const
shadow_range shadows() const
A binding in a decomposition declaration.
Represents a call to a C++ constructor.
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
Represents a C++ deduction guide declaration.
TemplateDecl * getDeducedTemplate() const
Get the template for which this guide performs deduction.
Represents a C++26 expansion statement declaration.
CXXExpansionStmtPattern * getExpansionPattern()
Represents a C++ struct/union/class.
CXXBaseSpecifier * base_class_iterator
Iterator that traverses the base classes of a class.
bool isLambda() const
Determine whether this class describes a lambda function object.
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
Declaration of a class template.
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary class pattern.
spec_range specializations() const
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a class template specialization, which refers to a class template with a given set of temp...
decl_iterator - Iterates through the declarations stored within this context.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isTranslationUnit() const
DeclContext(Decl::Kind K)
void dumpDeclContext() const
decl_iterator decls_end() const
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
decl_iterator decls_begin() const
A simple visitor class that helps create declaration visitors.
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
ObjCDeclQualifier
ObjCDeclQualifier - 'Qualifiers' written next to the return and parameter types in method declaration...
@ OBJC_TQ_CSNullability
The nullability qualifier is set when the nullability of the result or parameter was expressed via a ...
bool isInvalidDecl() const
SourceLocation getLocation() const
static void printGroup(Decl **Begin, unsigned NumDecls, raw_ostream &Out, const PrintingPolicy &Policy, unsigned Indentation=0)
AccessSpecifier getAccess() const
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
std::string getAsString() const
Retrieve the human-readable string for this name.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NameKind getNameKind() const
Determine what kind of name this is.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
ArrayRef< BindingDecl * > bindings() const
Represents an empty-declaration.
An instance of this object exists for each enum constant that is defined.
const Expr * getInitExpr() const
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Represents an explicit instantiation of a template entity in source code.
TypeSourceInfo * getTypeAsWritten() const
The declared type (return type or variable type) for function / variable templates.
std::optional< unsigned > getNumTemplateArgs() const
Returns the number of explicit template arguments, or std::nullopt if this entity has no template arg...
TemplateArgumentLoc getTemplateArg(unsigned I) const
bool isExternTemplate() const
NamedDecl * getSpecialization() const
NestedNameSpecifierLoc getQualifierLoc() const
Returns the qualifier regardless of where it is stored.
Store information needed for an explicit specifier.
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(const FunctionDecl *Function)
bool isSpecified() const
Determine if the declaration had an explicit specifier of any kind.
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool isBitField() const
Determines whether this field is a bitfield.
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
const Expr * getAsmStringExpr() const
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
virtual NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
bool isPackExpansion() const
Declaration of a friend template.
TemplateName getFriendTemplateName() const
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
Represents a function declaration or definition.
const ParmVarDecl * getParamDecl(unsigned i) const
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
bool isImmediateFunction() const
StringLiteral * getDeletedMessage() const
Get the message that indicates why this function was deleted.
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool hasWrittenPrototype() const
Whether this function has a written prototype.
bool hasPrototype() const
Whether this function has a prototype, either because one was explicitly written or because it was "i...
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
bool isConstexprSpecified() const
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isDeletedAsWritten() const
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
DeclarationNameInfo getNameInfo() const
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
const ASTTemplateArgumentListInfo * getTemplateSpecializationArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
QualType getExceptionType(unsigned i) const
Return the ith exception type, where 0 <= i < getNumExceptions().
unsigned getNumExceptions() const
Return the number of types in the exception specification.
bool hasDynamicExceptionSpec() const
Return whether this function has a dynamic (throw) exception spec.
bool isVariadic() const
Whether this function prototype is variadic.
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
spec_range specializations() const
FunctionType - C99 6.7.5.3 - Function Declarators.
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
One of these records is kept for each identifier that is lexed.
StringRef deuglifiedName() const
If the identifier is an "uglified" reserved name, return a cleaned form.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Module * getImportedModule() const
Retrieve the module that was imported by the import declaration.
Represents the declaration of a label.
llvm::omp::Version getOpenMPVersion() const
Return the OpenMP version.
Represents a linkage specification.
LinkageSpecLanguageIDs getLanguage() const
Return the language specified by this linkage specification.
bool hasBraces() const
Determines whether this linkage specification had braces in its syntactic form.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
This represents a decl that may have a name.
bool isModulePrivate() const
Whether this declaration was marked as being private to the module in which it was defined.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
std::string getQualifiedNameAsString() const
std::string getNameAsString() const
Get a human-readable name for the declaration, even if it is one of the special kinds of names (C++ c...
void printQualifiedName(raw_ostream &OS) const
Returns a human-readable qualified name for this declaration, like A::B::i, for i being member of nam...
virtual void printName(raw_ostream &OS, const PrintingPolicy &Policy) const
Pretty-print the unqualified name of this declaration.
Represents a C++ namespace alias.
NamespaceBaseDecl * getAliasedNamespace() const
Retrieve the namespace that this alias refers to, which may either be a NamespaceDecl or a NamespaceA...
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of the namespace.
Represent a C++ namespace.
bool isInline() const
Returns true if this is an inline namespace declaration.
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false, bool PrintFinalScopeResOp=true) const
Print this nested name specifier to the given output stream.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
This represents 'pragma omp allocate ...' directive.
bool varlist_empty() const
bool clauselist_empty() const
varlist_iterator varlist_begin()
MutableArrayRef< Expr * >::iterator varlist_iterator
clauselist_range clauselists()
varlist_iterator varlist_end()
Pseudo declaration for capturing expressions.
This is a basic class for representing single OpenMP clause.
This represents 'pragma omp declare mapper ...' directive.
clauselist_range clauselists()
DeclarationName getVarName()
Get the name of the variable declared in the mapper.
bool clauselist_empty() const
This represents 'pragma omp declare reduction ...' directive.
Expr * getInitializer()
Get initializer expression (if specified) of the declare reduction construct.
Expr * getCombiner()
Get combiner expression of the declare reduction construct.
OMPDeclareReductionInitKind getInitializerKind() const
Get initializer kind.
This represents 'pragma omp requires...' directive.
clauselist_iterator clauselist_begin()
bool clauselist_empty() const
clauselist_iterator clauselist_end()
This represents 'pragma omp threadprivate ...' directive.
MutableArrayRef< Expr * >::iterator varlist_iterator
bool varlist_empty() const
varlist_iterator varlist_end()
varlist_iterator varlist_begin()
ObjCCategoryDecl - Represents a category declaration.
ObjCInterfaceDecl * getClassInterface()
ObjCTypeParamList * getTypeParamList() const
Retrieve the type parameter list associated with this category or extension.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCCompatibleAliasDecl - Represents alias of a class.
const ObjCInterfaceDecl * getClassInterface() const
const ObjCInterfaceDecl * getClassInterface() const
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
std::string getNameAsString() const
Get the name of the class associated with this interface.
unsigned ivar_size() const
const ObjCInterfaceDecl * getSuperClass() const
Represents an ObjC class declaration.
unsigned ivar_size() const
ObjCTypeParamList * getTypeParamListAsWritten() const
Retrieve the type parameters written on this particular declaration of the class.
bool isThisDeclarationADefinition() const
Determine whether this particular declaration of this class is actually also a definition.
const ObjCProtocolList & getReferencedProtocols() const
const ObjCObjectType * getSuperClassType() const
Retrieve the superclass type.
ObjCInterfaceDecl * getSuperClass() const
ObjCList - This is a simple template class used to hold various lists of decls etc,...
ObjCMethodDecl - Represents an instance or class method declaration.
ObjCDeclQualifier getObjCDeclQualifier() const
ArrayRef< ParmVarDecl * > parameters() const
Stmt * getBody() const override
Retrieve the body of this method, if it has one.
Selector getSelector() const
bool isInstanceMethod() const
QualType getReturnType() const
Represents a pointer to an Objective C object.
Represents one property declaration in an Objective-C interface.
Selector getSetterName() const
Selector getGetterName() const
ObjCPropertyAttribute::Kind getPropertyAttributes() const
PropertyControl getPropertyImplementation() const
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
ObjCIvarDecl * getPropertyIvarDecl() const
Kind getPropertyImplementation() const
ObjCPropertyDecl * getPropertyDecl() const
Represents an Objective-C protocol declaration.
bool isThisDeclarationADefinition() const
Determine whether this particular declaration is also the definition.
const ObjCProtocolList & getReferencedProtocols() const
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
ArrayRef< const OpenACCClause * > clauses() const
const Expr * getFunctionReference() const
Sugar for parentheses used when specifying types.
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
StreamedQualTypeHelper stream(const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Represents a struct/union/class.
Base for LValueReferenceType and RValueReferenceType.
std::string getAsString() const
Derive the full selector name (e.g.
void print(llvm::raw_ostream &OS) const
Prints the full selector name (e.g. "foo:bar:").
Encodes a location in the source.
Represents a C++11 static_assert declaration.
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
void printPrettyControlled(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
StringLiteral - This represents a string literal expression, e.g.
StringRef getKindName() const
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
A template argument list.
const TemplateArgument & getArgument() const
void print(const PrintingPolicy &Policy, raw_ostream &Out, bool IncludeType) const
Print this template argument to the given output stream.
The base class of all kinds of template declarations (e.g., class, function, etc.).
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
bool isNull() const
Determine whether this template name is NULL.
void print(raw_ostream &OS, const PrintingPolicy &Policy, Qualified Qual=Qualified::AsWritten) const
Print the template name.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
void print(raw_ostream &Out, const ASTContext &Context, bool OmitTemplateKW=false) const
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
Declaration of a template type parameter.
bool wasDeclaredWithTypename() const
Whether this template type parameter was declared with the 'typename' keyword.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
const TypeConstraint * getTypeConstraint() const
Returns the type constraint associated with this template parameter (if any).
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
bool isParameterPack() const
Returns whether this is a parameter pack.
A declaration that models statements at global scope.
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
const T * getAs() const
Member-template getAs<specific type>'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Base class for declarations which introduce a typedef-name.
TypeSourceInfo * getTypeSourceInfo() const
Represents a dependent using declaration which was marked with typename.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Represents a dependent using declaration which was not marked with typename.
bool isAccessDeclaration() const
Return true if it is a C++03 access declaration (no 'using').
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Represents a C++ using-declaration.
bool hasTypename() const
Return true if the using declaration has 'typename'.
bool isAccessDeclaration() const
Return true if it is a C++03 access declaration (no 'using').
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Represents C++ using-directive.
NamedDecl * getNominatedNamespaceAsWritten()
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of the namespace.
Represents a C++ using-enum-declaration.
EnumDecl * getEnumDecl() const
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
InitializationStyle getInitStyle() const
The style of initialization for this declaration.
static const char * getStorageClassSpecifierString(StorageClass SC)
Return the string used to specify the storage class SC.
@ CInit
C-style initialization with assignment.
@ CallInit
Call-style initialization (C++98)
bool isCXXForRangeDecl() const
Determine whether this variable is the for-range-declaration in a C++0x for-range statement.
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Represents a GCC generic vector type.
@ kind_nullability
Indicates that the nullability of the type was spelled with a property attribute rather than a type q...
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
Top level wrappers for InstallAPI frontend operations.
bool isa(CodeGen::Address addr)
llvm::StringRef getAccessSpelling(AccessSpecifier AS)
@ Unspecified
Whether values of this type can be null is (explicitly) unspecified.
@ ICIS_ListInit
Direct list-initialization.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
StorageClass
Storage classes.
@ TSCS_thread_local
C++11 thread_local.
@ TSCS__Thread_local
C11 _Thread_local.
@ TSCS___thread
GNU __thread.
raw_ostream & Indent(raw_ostream &Out, const unsigned int Space, bool IsDot)
@ Default
Set to the current date and time.
llvm::StringRef getNullabilitySpelling(NullabilityKind kind, bool isContextSensitive=false)
Retrieve the spelling of the given nullability kind.
const FunctionProtoType * T
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType)
@ Concept
The name was classified as a concept name.
@ TNK_Var_template
The name refers to a variable template whose specialization produces a variable.
@ TNK_Concept_template
The name refers to a concept.
llvm::StringRef getAsString(SyncScope S)
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ 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.
U cast(CodeGen::Address addr)
@ EST_MSAny
Microsoft throw(...) extension.
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
ArrayRef< TemplateArgumentLoc > arguments() const
void printName(raw_ostream &OS, PrintingPolicy Policy) const
printName - Print the human-readable name to a stream.
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressDeclAttributes
Whether to suppress attributes in decl printing.
unsigned PolishForDeclaration
When true, do certain refinement needed for producing proper declaration tag; such as,...
unsigned SuppressSpecifiers
Whether we should suppress printing of the actual specifiers for the given type or declaration.
unsigned SuppressScope
Suppresses printing of scope specifiers.
unsigned Indentation
The number of spaces to use to indent each line.
unsigned SuppressInitializers
Suppress printing of variable initializers.
unsigned TerseOutput
Provide a 'terse' output.