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);
56 DeclPrinter(raw_ostream &Out,
const PrintingPolicy &Policy,
57 const ASTContext &Context,
unsigned Indentation = 0,
58 bool PrintInstantiation =
false)
59 : Out(Out), Policy(Policy), Context(Context), Indentation(Indentation),
60 PrintInstantiation(PrintInstantiation) {}
62 void VisitDeclContext(DeclContext *DC,
bool Indent =
true);
64 void VisitTranslationUnitDecl(TranslationUnitDecl *D);
65 void VisitTypedefDecl(TypedefDecl *D);
66 void VisitTypeAliasDecl(TypeAliasDecl *D);
67 void VisitEnumDecl(EnumDecl *D);
68 void VisitRecordDecl(RecordDecl *D);
69 void VisitEnumConstantDecl(EnumConstantDecl *D);
70 void VisitEmptyDecl(EmptyDecl *D);
71 void VisitFunctionDecl(FunctionDecl *D);
72 void VisitFriendDecl(FriendDecl *D);
73 void VisitFieldDecl(FieldDecl *D);
74 void VisitVarDecl(VarDecl *D);
75 void VisitLabelDecl(LabelDecl *D);
76 void VisitParmVarDecl(ParmVarDecl *D);
77 void VisitFileScopeAsmDecl(FileScopeAsmDecl *D);
78 void VisitTopLevelStmtDecl(TopLevelStmtDecl *D);
79 void VisitImportDecl(ImportDecl *D);
80 void VisitStaticAssertDecl(StaticAssertDecl *D);
81 void VisitNamespaceDecl(NamespaceDecl *D);
82 void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
83 void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
84 void VisitCXXRecordDecl(CXXRecordDecl *D);
85 void VisitLinkageSpecDecl(LinkageSpecDecl *D);
86 void VisitTemplateDecl(
const TemplateDecl *D);
87 void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
88 void VisitClassTemplateDecl(ClassTemplateDecl *D);
89 void VisitClassTemplateSpecializationDecl(
90 ClassTemplateSpecializationDecl *D);
91 void VisitClassTemplatePartialSpecializationDecl(
92 ClassTemplatePartialSpecializationDecl *D);
93 void VisitObjCMethodDecl(ObjCMethodDecl *D);
94 void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
95 void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
96 void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
97 void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
98 void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
99 void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
100 void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
101 void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
102 void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
103 void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
104 void VisitUsingDecl(UsingDecl *D);
105 void VisitUsingEnumDecl(UsingEnumDecl *D);
106 void VisitUsingShadowDecl(UsingShadowDecl *D);
107 void VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl *D);
108 void VisitOMPAllocateDecl(OMPAllocateDecl *D);
109 void VisitOMPRequiresDecl(OMPRequiresDecl *D);
110 void VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl *D);
111 void VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D);
112 void VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D);
113 void VisitTemplateTypeParmDecl(
const TemplateTypeParmDecl *TTP);
114 void VisitNonTypeTemplateParmDecl(
const NonTypeTemplateParmDecl *NTTP);
115 void VisitTemplateTemplateParmDecl(
const TemplateTemplateParmDecl *);
116 void VisitHLSLBufferDecl(HLSLBufferDecl *D);
118 void VisitOpenACCDeclareDecl(OpenACCDeclareDecl *D);
119 void VisitOpenACCRoutineDecl(OpenACCRoutineDecl *D);
121 void printTemplateParameters(
const TemplateParameterList *Params,
122 bool OmitTemplateKW =
false);
123 void printTemplateArguments(ArrayRef<TemplateArgument> Args,
124 const TemplateParameterList *Params);
125 void printTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
126 const TemplateParameterList *Params);
128 std::optional<std::string>
129 prettyPrintAttributes(
const Decl *D,
130 AttrPosAsWritten Pos = AttrPosAsWritten::Default);
132 void prettyPrintPragmas(Decl *D);
133 void printDeclType(QualType
T, StringRef DeclName,
bool Pack =
false);
138 bool PrintInstantiation)
const {
143 unsigned Indentation,
bool PrintInstantiation)
const {
144 DeclPrinter Printer(Out, Policy,
getASTContext(), Indentation,
146 Printer.Visit(
const_cast<Decl*
>(
this));
150 bool OmitTemplateKW)
const {
151 print(Out, Context, Context.getPrintingPolicy(), OmitTemplateKW);
156 bool OmitTemplateKW)
const {
157 DeclPrinter Printer(Out, Policy, Context);
158 Printer.printTemplateParameters(
this, OmitTemplateKW);
164 while (!BaseType->isSpecifierType()) {
166 BaseType = PTy->getPointeeType();
169 BaseType = OPT->getPointeeType();
171 BaseType = BPy->getPointeeType();
172 else if (
const ArrayType *ATy = dyn_cast<ArrayType>(BaseType))
173 BaseType = ATy->getElementType();
175 BaseType = FTy->getReturnType();
177 BaseType = VTy->getElementType();
179 BaseType = RTy->getPointeeType();
180 else if (
const AutoType *ATy = BaseType->getAs<AutoType>())
181 BaseType = ATy->getDeducedType();
183 BaseType = PTy->desugar();
193 return TDD->getUnderlyingType();
194 if (
ValueDecl* VD = dyn_cast<ValueDecl>(D))
195 return VD->getType();
201 unsigned Indentation) {
203 (*Begin)->print(Out, Policy, Indentation);
207 Decl** End = Begin + NumDecls;
214 for ( ; Begin != End; ++Begin) {
222 (*Begin)->print(Out, SubPolicy, Indentation);
234 Printer.VisitDeclContext(
const_cast<DeclContext *
>(
this),
false);
237raw_ostream& DeclPrinter::Indent(
unsigned Indentation) {
238 for (
unsigned i = 0; i != Indentation; ++i)
249 return DeclPrinter::AttrPosAsWritten::Left;
251 if (
C.getSourceManager().isBeforeInTranslationUnit(ALoc, DLoc))
252 return DeclPrinter::AttrPosAsWritten::Left;
254 return DeclPrinter::AttrPosAsWritten::Right;
257std::optional<std::string>
258DeclPrinter::prettyPrintAttributes(
const Decl *D,
259 AttrPosAsWritten Pos ) {
264 llvm::raw_string_ostream AOut(AttrStr);
265 llvm::ListSeparator LS(
" ");
267 if (A->isInherited() || A->isImplicit())
272 switch (A->getKind()) {
274#define PRAGMA_SPELLING_ATTR(X) case attr::X:
275#include "clang/Basic/AttrList.inc"
279 assert(APos != AttrPosAsWritten::Default &&
280 "Default not a valid for an attribute location");
281 if (Pos == AttrPosAsWritten::Default || Pos == APos) {
283 A->printPretty(AOut, Policy);
293void DeclPrinter::PrintOpenACCRoutineOnLambda(
Decl *D) {
295 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
296 if (
const auto *
Init = VD->getInit())
298 :
Init->getType()->getAsCXXRecordDecl();
299 }
else if (
const auto *FD = dyn_cast<FieldDecl>(D)) {
301 FD->getType().isNull() ?
nullptr : FD->getType()->getAsCXXRecordDecl();
308 for (
auto *A :
Call->specific_attrs<OpenACCRoutineDeclAttr>()) {
309 A->printPretty(Out, Policy);
315void DeclPrinter::prettyPrintPragmas(
Decl *D) {
319 PrintOpenACCRoutineOnLambda(D);
323 for (
auto *A : Attrs) {
324 switch (A->getKind()) {
326#define PRAGMA_SPELLING_ATTR(X) case attr::X:
327#include "clang/Basic/AttrList.inc"
328 A->printPretty(Out, Policy);
338void DeclPrinter::printDeclType(
QualType T, StringRef DeclName,
bool Pack) {
342 if (
auto *PET =
T->getAs<PackExpansionType>()) {
344 T = PET->getPattern();
346 T.print(Out, Policy, (Pack ?
"..." :
"") + DeclName, Indentation);
359 if (AccessSpelling.empty())
360 llvm_unreachable(
"No access specifier!");
361 Out << AccessSpelling;
365 std::string &Proto) {
366 bool HasInitializerList =
false;
367 for (
const auto *BMInitializer : CDecl->
inits()) {
368 if (BMInitializer->isInClassMemberInitializer())
370 if (!BMInitializer->isWritten())
373 if (!HasInitializerList) {
377 HasInitializerList =
true;
381 if (BMInitializer->isAnyMemberInitializer()) {
382 FieldDecl *FD = BMInitializer->getAnyMember();
384 }
else if (BMInitializer->isDelegatingInitializer()) {
390 if (
Expr *
Init = BMInitializer->getInit()) {
397 Init = Tmp->getSubExpr();
401 Expr *SimpleInit =
nullptr;
402 Expr **Args =
nullptr;
403 unsigned NumArgs = 0;
405 Args = ParenList->getExprs();
406 NumArgs = ParenList->getNumExprs();
408 dyn_cast<CXXConstructExpr>(
Init)) {
409 Args = Construct->getArgs();
410 NumArgs = Construct->getNumArgs();
415 SimpleInit->
printPretty(Out,
nullptr, Policy, Indentation,
"\n",
418 for (
unsigned I = 0; I != NumArgs; ++I) {
419 assert(Args[I] !=
nullptr &&
"Expected non-null Expr");
425 Args[I]->
printPretty(Out,
nullptr, Policy, Indentation,
"\n",
436 if (BMInitializer->isPackExpansion())
467 if (
auto FD = dyn_cast<FunctionDecl>(*D))
485 if (!Decls.empty() && !CurDeclType.
isNull()) {
487 if (
const auto *TT = dyn_cast_or_null<TagType>(BaseType);
488 TT && TT->isTagOwned()) {
489 if (TT->getDecl() == Decls[0]) {
498 ProcessDeclGroup(Decls);
520 const char *Terminator =
nullptr;
524 Terminator =
nullptr;
526 Terminator =
nullptr;
528 Terminator =
nullptr;
529 else if (
auto FD = dyn_cast<FunctionDecl>(*D)) {
530 if (FD->doesThisDeclarationHaveABody() && !FD->isDefaulted())
531 Terminator =
nullptr;
534 }
else if (
auto TD = dyn_cast<FunctionTemplateDecl>(*D)) {
535 if (TD->getTemplatedDecl()->doesThisDeclarationHaveABody())
536 Terminator =
nullptr;
542 Terminator =
nullptr;
564 if (D->
hasAttr<OMPDeclareTargetDeclAttr>())
565 Out <<
"#pragma omp end declare target\n";
569 ProcessDeclGroup(Decls);
576 VisitDeclContext(D,
false);
579void DeclPrinter::VisitTypedefDecl(
TypedefDecl *D) {
584 Out <<
"__module_private__ ";
589 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
590 Out <<
' ' << *Attrs;
594 Out <<
"using " << *D;
595 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
596 Out <<
' ' << *Attrs;
600void DeclPrinter::VisitEnumDecl(
EnumDecl *D) {
602 Out <<
"__module_private__ ";
611 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
612 Out <<
' ' << *Attrs;
627void DeclPrinter::VisitRecordDecl(
RecordDecl *D) {
629 Out <<
"__module_private__ ";
632 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
633 Out <<
' ' << *Attrs;
638 if (D->isCompleteDefinition()) {
647 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
648 Out <<
' ' << *Attrs;
651 Init->printPretty(Out,
nullptr, Policy, Indentation,
"\n", &Context);
658 std::string Proto =
"explicit";
659 llvm::raw_string_ostream EOut(Proto);
673 prettyPrintPragmas(D);
674 if (std::optional<std::string> Attrs =
675 prettyPrintAttributes(D, AttrPosAsWritten::Left))
676 Out << *Attrs <<
' ';
680 Out <<
"template<> ";
683 I < NumTemplateParams; ++I)
697 llvm_unreachable(
"invalid for functions");
714 SubPolicy.SuppressSpecifiers =
false;
720 llvm::raw_string_ostream
OS(Proto);
729 llvm::raw_string_ostream POut(Proto);
730 DeclPrinter TArgPrinter(POut, SubPolicy, Context, Indentation);
733 TArgPrinter.printTemplateArguments(TArgAsWritten->arguments(),
nullptr);
736 TArgPrinter.printTemplateArguments(TArgs->asArray(),
nullptr);
740 while (
const ParenType *PT = dyn_cast<ParenType>(Ty)) {
741 Proto =
'(' + Proto +
')';
742 Ty = PT->getInnerType();
748 FT = dyn_cast<FunctionProtoType>(AFT);
752 llvm::raw_string_ostream POut(Proto);
753 DeclPrinter ParamPrinter(POut, SubPolicy, Context, Indentation);
754 for (
unsigned i = 0, e = D->
getNumParams(); i != e; ++i) {
768 for (
unsigned i = 0, e = D->
getNumParams(); i != e; ++i) {
781 Proto +=
" volatile";
783 Proto +=
" restrict";
810 Proto +=
" noexcept";
813 llvm::raw_string_ostream EOut(Proto);
815 Indentation,
"\n", &Context);
822 PrintConstructorInitializers(CDecl, Proto);
827 Out << Proto <<
" -> ";
830 AFT->getReturnType().print(Out, Policy, Proto);
841 TrailingRequiresClause.ConstraintExpr->printPretty(
842 Out,
nullptr, SubPolicy, Indentation,
"\n", &Context);
845 Ty.
print(Out, Policy, Proto);
848 if (std::optional<std::string> Attrs =
849 prettyPrintAttributes(D, AttrPosAsWritten::Right))
850 Out <<
' ' << *Attrs;
858 M->outputString(Out);
869 DeclPrinter ParamPrinter(Out, SubPolicy, Context, Indentation);
871 for (
unsigned i = 0, e = D->
getNumParams(); i != e; ++i) {
889void DeclPrinter::VisitFriendDecl(
FriendDecl *D) {
892 for (
unsigned i = 0; i < NumTPLists; ++i)
895 Out << TSI->getType().getAsString(Policy);
900 VisitFunctionDecl(FD);
905 VisitFunctionTemplateDecl(FTD);
910 VisitRedeclarableTemplateDecl(CTD);
917void DeclPrinter::VisitFieldDecl(
FieldDecl *D) {
918 prettyPrintPragmas(D);
923 Out <<
"__module_private__ ";
926 stream(Policy, D->
getName(), Indentation);
940 Init->printPretty(Out,
nullptr, Policy, Indentation,
"\n", &Context);
942 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
943 Out <<
' ' << *Attrs;
946void DeclPrinter::VisitLabelDecl(
LabelDecl *D) {
950void DeclPrinter::VisitVarDecl(
VarDecl *D) {
951 prettyPrintPragmas(D);
953 if (std::optional<std::string> Attrs =
954 prettyPrintAttributes(D, AttrPosAsWritten::Left))
955 Out << *Attrs <<
' ';
957 if (
const auto *Param = dyn_cast<ParmVarDecl>(D);
958 Param && Param->isExplicitObjectParameter())
977 Out <<
"_Thread_local ";
980 Out <<
"thread_local ";
985 Out <<
"__module_private__ ";
989 T.removeLocalConst();
998 if (std::optional<std::string> Attrs =
999 prettyPrintAttributes(D, AttrPosAsWritten::Right))
1000 Out <<
' ' << *Attrs;
1004 bool ImplicitInit =
false;
1007 ImplicitInit =
true;
1009 dyn_cast<CXXConstructExpr>(
Init->IgnoreImplicit())) {
1011 !Construct->isListInitialization()) {
1012 ImplicitInit = Construct->getNumArgs() == 0 ||
1013 Construct->getArg(0)->isDefaultArgument();
1016 if (!ImplicitInit) {
1023 SubPolicy.SuppressSpecifiers =
false;
1024 Init->printPretty(Out,
nullptr, SubPolicy, Indentation,
"\n", &Context);
1031void DeclPrinter::VisitParmVarDecl(
ParmVarDecl *D) {
1047void DeclPrinter::VisitImportDecl(
ImportDecl *D) {
1053 Out <<
"static_assert(";
1058 E->printPretty(Out,
nullptr, Policy, Indentation,
"\n", &Context);
1070 Out <<
"namespace ";
1075 VisitDeclContext(D);
1080 Out <<
"using namespace ";
1086 Out <<
"namespace " << *D <<
" = ";
1091void DeclPrinter::VisitEmptyDecl(
EmptyDecl *D) {
1092 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
1099 Out <<
"__module_private__ ";
1103 if (std::optional<std::string> Attrs =
1104 prettyPrintAttributes(D, AttrPosAsWritten::Left))
1105 Out << *Attrs <<
' ';
1111 if (
auto *S = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
1113 S->getSpecializedTemplate()->getTemplateParameters();
1115 S->getTemplateArgsAsWritten();
1117 printTemplateArguments(TArgAsWritten->
arguments(), TParams);
1119 printTemplateArguments(S->getTemplateArgs().asArray(), TParams);
1123 if (std::optional<std::string> Attrs =
1124 prettyPrintAttributes(D, AttrPosAsWritten::Right))
1125 Out <<
' ' << *Attrs;
1127 if (D->isCompleteDefinition()) {
1130 if (D->getNumBases()) {
1133 BaseEnd = D->bases_end(); Base != BaseEnd; ++Base) {
1134 if (Base != D->bases_begin())
1137 if (
Base->isVirtual())
1145 Out <<
Base->getType().getAsString(Policy);
1147 if (
Base->isPackExpansion())
1159 VisitDeclContext(D);
1171 "unknown language in linkage specification");
1175 Out <<
"extern \"" << l <<
"\" ";
1178 VisitDeclContext(D);
1185 bool OmitTemplateKW) {
1192 if (!OmitTemplateKW)
1196 bool NeedComma =
false;
1197 for (
const Decl *Param : *Params) {
1198 if (Param->isImplicit())
1206 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
1207 VisitTemplateTypeParmDecl(TTP);
1208 }
else if (
auto NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
1209 VisitNonTypeTemplateParmDecl(NTTP);
1210 }
else if (
auto TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
1211 VisitTemplateTemplateParmDecl(TTPD);
1217 if (
const Expr *RequiresClause = Params->getRequiresClause()) {
1218 Out <<
" requires ";
1219 RequiresClause->printPretty(Out,
nullptr, Policy, Indentation,
"\n",
1223 if (!OmitTemplateKW)
1230 for (
size_t I = 0, E = Args.size(); I < E; ++I) {
1234 Args[I].print(Policy, Out,
true);
1236 Args[I].print(Policy, Out,
1238 Policy, Params, I));
1246 for (
size_t I = 0, E = Args.size(); I < E; ++I) {
1250 Args[I].getArgument().print(Policy, Out,
true);
1252 Args[I].getArgument().print(
1260void DeclPrinter::VisitTemplateDecl(
const TemplateDecl *D) {
1264 dyn_cast<TemplateTemplateParmDecl>(D)) {
1265 if (TTP->wasDeclaredWithTypename())
1270 if (TTP->isParameterPack())
1272 else if (TTP->getDeclName())
1275 if (TTP->getDeclName()) {
1277 Out << TTP->getIdentifier()->deuglifiedName();
1279 Out << TTP->getDeclName();
1283 else if (
const auto *
Concept = dyn_cast<ConceptDecl>(D)) {
1284 Out <<
"concept " <<
Concept->getName() <<
" = " ;
1285 Concept->getConstraintExpr()->printPretty(Out,
nullptr, Policy, Indentation,
1295 I < NumTemplateParams; ++I)
1298 VisitRedeclarableTemplateDecl(D);
1302 Out <<
"#pragma omp end declare target\n";
1306 if (PrintInstantiation &&
1310 if (PrevDecl->
isDefined(Def) && Def != PrevDecl)
1317 prettyPrintPragmas(I);
1324 VisitRedeclarableTemplateDecl(D);
1326 if (PrintInstantiation) {
1338void DeclPrinter::VisitClassTemplateSpecializationDecl(
1340 Out <<
"template<> ";
1341 VisitCXXRecordDecl(D);
1344void DeclPrinter::VisitClassTemplatePartialSpecializationDecl(
1347 VisitCXXRecordDecl(D);
1354void DeclPrinter::PrintObjCMethodType(
ASTContext &Ctx,
1371 if (
auto nullability = AttributedType::stripOuterNullability(
T))
1381 unsigned First =
true;
1382 for (
auto *Param : *Params) {
1389 switch (Param->getVariance()) {
1394 Out <<
"__covariant ";
1398 Out <<
"__contravariant ";
1402 Out << Param->getDeclName();
1404 if (Param->hasExplicitBound()) {
1405 Out <<
" : " << Param->getUnderlyingType().getAsString(Policy);
1422 std::string::size_type pos, lastPos = 0;
1425 pos =
name.find_first_of(
':', lastPos);
1428 Out <<
name.substr(lastPos, pos - lastPos) <<
':';
1430 PI->getObjCDeclQualifier(),
1442 if (std::optional<std::string> Attrs = prettyPrintAttributes(OMD))
1443 Out <<
' ' << *Attrs;
1458 bool eolnOut =
false;
1460 Out <<
"@implementation " << I <<
" : " << *SID;
1462 Out <<
"@implementation " << I;
1468 for (
const auto *I : OID->
ivars()) {
1469 Indent() << I->getASTContext().getUnqualifiedObjCPointerType(I->getType()).
1474 }
else if (SID || !OID->
decls().empty()) {
1478 VisitDeclContext(OID,
false);
1489 Out <<
"@class " << I;
1492 PrintObjCTypeParams(TypeParams);
1498 bool eolnOut =
false;
1499 if (std::optional<std::string> Attrs = prettyPrintAttributes(OID))
1500 Out << *Attrs <<
"\n";
1502 Out <<
"@interface " << I;
1505 PrintObjCTypeParams(TypeParams);
1513 if (!Protocols.
empty()) {
1515 E = Protocols.
end(); I != E; ++I)
1516 Out << (I == Protocols.
begin() ?
'<' :
',') << **I;
1524 for (
const auto *I : OID->
ivars()) {
1525 Indent() << I->getASTContext()
1526 .getUnqualifiedObjCPointerType(I->getType())
1527 .getAsString(Policy) <<
' ' << *I <<
";\n";
1531 }
else if (SID || !OID->
decls().empty()) {
1536 VisitDeclContext(OID,
false);
1545 Out <<
"@protocol " << *PID <<
";\n";
1550 if (!Protocols.
empty()) {
1551 Out <<
"@protocol " << *PID;
1553 E = Protocols.
end(); I != E; ++I)
1554 Out << (I == Protocols.
begin() ?
'<' :
',') << **I;
1557 Out <<
"@protocol " << *PID <<
'\n';
1558 VisitDeclContext(PID,
false);
1563 Out <<
"@implementation ";
1567 Out <<
"<<error-type>>";
1568 Out <<
'(' << *PID <<
")\n";
1570 VisitDeclContext(PID,
false);
1576 Out <<
"@interface ";
1580 Out <<
"<<error-type>>";
1582 PrintObjCTypeParams(TypeParams);
1584 Out <<
"(" << *PID <<
")\n";
1585 if (PID->ivar_size() > 0) {
1588 for (
const auto *I : PID->ivars())
1589 Indent() << I->getASTContext().getUnqualifiedObjCPointerType(I->getType()).
1595 VisitDeclContext(PID,
false);
1602 Out <<
"@compatibility_alias " << *AID
1617 Out <<
"@required\n";
1619 Out <<
"@optional\n";
1628 Out << (first ?
"" :
", ") <<
"class";
1633 Out << (first ?
"" :
", ") <<
"direct";
1639 Out << (first ?
"" :
", ") <<
"nonatomic";
1643 Out << (first ?
"" :
", ") <<
"atomic";
1648 Out << (first ?
"" :
", ") <<
"assign";
1652 Out << (first ?
"" :
", ") <<
"retain";
1657 Out << (first ?
"" :
", ") <<
"strong";
1661 Out << (first ?
"" :
", ") <<
"copy";
1665 Out << (first ?
"" :
", ") <<
"weak";
1670 Out << (first ?
"" :
", ") <<
"unsafe_unretained";
1676 Out << (first ?
"" :
", ") <<
"readwrite";
1680 Out << (first ?
"" :
", ") <<
"readonly";
1685 Out << (first ?
"" :
", ") <<
"getter = ";
1690 Out << (first ?
"" :
", ") <<
"setter = ";
1697 if (
auto nullability = AttributedType::stripOuterNullability(
T)) {
1701 Out << (first ?
"" :
", ") <<
"null_resettable";
1703 Out << (first ?
"" :
", ")
1715 Out <<
' ' << TypeStr;
1716 if (!StringRef(TypeStr).ends_with(
"*"))
1725 Out <<
"@synthesize ";
1733void DeclPrinter::VisitUsingDecl(
UsingDecl *D) {
1742 for (
const auto *Shadow : D->
shadows()) {
1743 if (
const auto *ConstructorShadow =
1744 dyn_cast<ConstructorUsingShadowDecl>(Shadow)) {
1745 assert(Shadow->getDeclContext() == ConstructorShadow->getDeclContext());
1746 Out << *ConstructorShadow->getNominatedBaseClass();
1759 Out <<
"using typename ";
1776 Out <<
"#pragma omp threadprivate";
1797 if (std::optional<std::string> Attrs = prettyPrintAttributes(D))
1798 Out <<
' ' << *Attrs;
1801 VisitDeclContext(D);
1806 Out <<
"#pragma omp allocate";
1818 OMPClausePrinter Printer(Out, Policy, Context.
getLangOpts().OpenMP);
1827 Out <<
"#pragma omp requires ";
1829 OMPClausePrinter Printer(Out, Policy, Context.
getLangOpts().OpenMP);
1837 Out <<
"#pragma omp declare reduction (";
1839 const char *OpName =
1841 assert(OpName &&
"not an overloaded operator");
1853 Out <<
" initializer(";
1859 Out <<
"omp_priv = ";
1864 Init->printPretty(Out,
nullptr, Policy, 0,
"\n", &Context);
1874 Out <<
"#pragma omp declare mapper (";
1882 OMPClausePrinter Printer(Out, Policy, Context.
getLangOpts().OpenMP);
1897 TC->print(Out, Policy);
1922void DeclPrinter::VisitNonTypeTemplateParmDecl(
1937void DeclPrinter::VisitTemplateTemplateParmDecl(
1939 VisitTemplateDecl(TTPD);
1949 Out <<
"#pragma acc declare";
1953 Printer.VisitClauseList(D->
clauses());
1959 Out <<
"#pragma acc routine";
1976 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
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++ 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.
TemplateParameterList * getTemplateParameterList(unsigned index) const
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
unsigned getNumTemplateParameterLists() const
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
TypeSourceInfo * getTypeSourceInfo() 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.
Store information needed for an explicit specifier.
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(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,...
unsigned getFriendTypeNumTemplateParameterLists() const
TemplateParameterList * getFriendTypeTemplateParameterList(unsigned N) const
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
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.
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.
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.
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,...
The JSON file list parser is used to communicate input to InstallAPI.
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)
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.
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 FullyQualifiedName
When true, print the fully qualified name of function declarations.
unsigned PolishForDeclaration
When true, do certain refinement needed for producing proper declaration tag; such as,...
unsigned CleanUglifiedParameters
Whether to strip underscores when printing reserved parameter names.
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.
unsigned PrintAsCanonical
Whether to print entities as written or canonically.