35#include "llvm/ADT/ArrayRef.h"
36#include "llvm/ADT/DenseMap.h"
37#include "llvm/ADT/SmallString.h"
38#include "llvm/ADT/StringRef.h"
39#include "llvm/ADT/Twine.h"
40#include "llvm/Support/Compiler.h"
41#include "llvm/Support/ErrorHandling.h"
42#include "llvm/Support/SaveAndRestore.h"
43#include "llvm/Support/raw_ostream.h"
53class IncludeStrongLifetimeRAII {
54 PrintingPolicy &Policy;
58 explicit IncludeStrongLifetimeRAII(PrintingPolicy &Policy)
59 : Policy(Policy), Old(Policy.SuppressStrongLifetime) {
60 if (!Policy.SuppressLifetimeQualifiers)
61 Policy.SuppressStrongLifetime =
false;
64 ~IncludeStrongLifetimeRAII() { Policy.SuppressStrongLifetime = Old; }
67class ParamPolicyRAII {
68 PrintingPolicy &Policy;
72 explicit ParamPolicyRAII(PrintingPolicy &Policy)
73 : Policy(Policy), Old(Policy.SuppressSpecifiers) {
74 Policy.SuppressSpecifiers =
false;
77 ~ParamPolicyRAII() { Policy.SuppressSpecifiers = Old; }
80class DefaultTemplateArgsPolicyRAII {
81 PrintingPolicy &Policy;
85 explicit DefaultTemplateArgsPolicyRAII(PrintingPolicy &Policy)
86 : Policy(Policy), Old(Policy.SuppressDefaultTemplateArgs) {
87 Policy.SuppressDefaultTemplateArgs =
false;
90 ~DefaultTemplateArgsPolicyRAII() { Policy.SuppressDefaultTemplateArgs = Old; }
93class ElaboratedTypePolicyRAII {
94 PrintingPolicy &Policy;
95 bool SuppressTagKeyword;
99 explicit ElaboratedTypePolicyRAII(PrintingPolicy &Policy) : Policy(Policy) {
100 SuppressTagKeyword = Policy.SuppressTagKeyword;
101 SuppressScope = Policy.SuppressScope;
102 Policy.SuppressTagKeyword =
true;
103 Policy.SuppressScope =
true;
106 ~ElaboratedTypePolicyRAII() {
107 Policy.SuppressTagKeyword = SuppressTagKeyword;
108 Policy.SuppressScope = SuppressScope;
113 PrintingPolicy Policy;
114 unsigned Indentation;
115 bool HasEmptyPlaceHolder =
false;
116 bool InsideCCAttribute =
false;
119 explicit TypePrinter(
const PrintingPolicy &Policy,
unsigned Indentation = 0)
120 : Policy(Policy), Indentation(Indentation) {}
122 void print(
const Type *ty, Qualifiers qs, raw_ostream &OS,
123 StringRef PlaceHolder);
124 void print(QualType
T, raw_ostream &OS, StringRef PlaceHolder);
126 static bool canPrefixQualifiers(
const Type *
T,
bool &NeedARCStrongQualifier);
127 void spaceBeforePlaceHolder(raw_ostream &OS);
128 void printTypeSpec(NamedDecl *D, raw_ostream &OS);
129 void printTemplateId(
const TemplateSpecializationType *
T, raw_ostream &OS,
132 void printBefore(QualType
T, raw_ostream &OS);
133 void printAfter(QualType
T, raw_ostream &OS);
134 void printTagType(
const TagType *
T, raw_ostream &OS);
135 void printFunctionAfter(
const FunctionType::ExtInfo &Info, raw_ostream &OS);
136#define ABSTRACT_TYPE(CLASS, PARENT)
137#define TYPE(CLASS, PARENT) \
138 void print##CLASS##Before(const CLASS##Type *T, raw_ostream &OS); \
139 void print##CLASS##After(const CLASS##Type *T, raw_ostream &OS);
140#include "clang/AST/TypeNodes.inc"
150 bool HasRestrictKeyword) {
151 bool appendSpace =
false;
157 if (appendSpace) OS <<
' ';
162 if (appendSpace) OS <<
' ';
163 if (HasRestrictKeyword) {
171void TypePrinter::spaceBeforePlaceHolder(raw_ostream &OS) {
172 if (!HasEmptyPlaceHolder)
178 if (Policy.PrintAsCanonical)
183void TypePrinter::print(QualType t, raw_ostream &OS, StringRef PlaceHolder) {
188void TypePrinter::print(
const Type *
T, Qualifiers Quals, raw_ostream &OS,
189 StringRef PlaceHolder) {
195 SaveAndRestore PHVal(HasEmptyPlaceHolder, PlaceHolder.empty());
197 printBefore(
T, Quals, OS);
199 printAfter(
T, Quals, OS);
202bool TypePrinter::canPrefixQualifiers(
const Type *
T,
203 bool &NeedARCStrongQualifier) {
209 bool CanPrefixQualifiers =
false;
210 NeedARCStrongQualifier =
false;
211 const Type *UnderlyingType =
T;
212 if (
const auto *AT = dyn_cast<AutoType>(
T))
213 UnderlyingType = AT->desugar().getTypePtr();
214 if (
const auto *Subst = dyn_cast<SubstTemplateTypeParmType>(
T))
215 UnderlyingType = Subst->getReplacementType().getTypePtr();
222 case Type::UnresolvedUsing:
225 case Type::TypeOfExpr:
228 case Type::UnaryTransform:
231 case Type::TemplateTypeParm:
232 case Type::SubstTemplateTypeParmPack:
233 case Type::SubstBuiltinTemplatePack:
234 case Type::DeducedTemplateSpecialization:
235 case Type::TemplateSpecialization:
236 case Type::InjectedClassName:
237 case Type::DependentName:
238 case Type::ObjCObject:
239 case Type::ObjCTypeParam:
240 case Type::ObjCInterface:
244 case Type::DependentBitInt:
245 case Type::OverflowBehavior:
246 case Type::BTFTagAttributed:
247 case Type::HLSLAttributedResource:
248 case Type::HLSLInlineSpirv:
249 case Type::PredefinedSugar:
250 CanPrefixQualifiers =
true;
253 case Type::ObjCObjectPointer:
258 case Type::VariableArray:
259 case Type::DependentSizedArray:
260 NeedARCStrongQualifier =
true;
263 case Type::ConstantArray:
264 case Type::IncompleteArray:
265 return canPrefixQualifiers(
267 NeedARCStrongQualifier);
271 case Type::ArrayParameter:
273 case Type::BlockPointer:
274 case Type::LValueReference:
275 case Type::RValueReference:
276 case Type::MemberPointer:
277 case Type::DependentAddressSpace:
278 case Type::DependentVector:
279 case Type::DependentSizedExtVector:
281 case Type::ExtVector:
282 case Type::ConstantMatrix:
283 case Type::DependentSizedMatrix:
284 case Type::FunctionProto:
285 case Type::FunctionNoProto:
287 case Type::PackExpansion:
288 case Type::SubstTemplateTypeParm:
289 case Type::MacroQualified:
290 case Type::CountAttributed:
291 case Type::LateParsedAttr:
292 CanPrefixQualifiers =
false;
295 case Type::Attributed: {
299 CanPrefixQualifiers = AttrTy->getAttrKind() == attr::AddressSpace;
302 case Type::PackIndexing: {
303 return canPrefixQualifiers(
305 NeedARCStrongQualifier);
309 return CanPrefixQualifiers;
312void TypePrinter::printBefore(QualType
T, raw_ostream &OS) {
317 Qualifiers Quals =
Split.Quals;
318 if (
const auto *Subst = dyn_cast<SubstTemplateTypeParmType>(
Split.Ty))
319 Quals -= QualType(Subst, 0).getQualifiers();
321 printBefore(
Split.Ty, Quals, OS);
326void TypePrinter::printBefore(
const Type *
T,Qualifiers Quals, raw_ostream &OS) {
330 SaveAndRestore PrevPHIsEmpty(HasEmptyPlaceHolder);
334 bool CanPrefixQualifiers =
false;
335 bool NeedARCStrongQualifier =
false;
336 CanPrefixQualifiers = canPrefixQualifiers(
T, NeedARCStrongQualifier);
338 if (CanPrefixQualifiers && !Quals.
empty()) {
339 if (NeedARCStrongQualifier) {
340 IncludeStrongLifetimeRAII Strong(Policy);
341 Quals.
print(OS, Policy,
true);
343 Quals.
print(OS, Policy,
true);
347 bool hasAfterQuals =
false;
348 if (!CanPrefixQualifiers && !Quals.
empty()) {
351 HasEmptyPlaceHolder =
false;
355#define ABSTRACT_TYPE(CLASS, PARENT)
356#define TYPE(CLASS, PARENT) case Type::CLASS: \
357 print##CLASS##Before(cast<CLASS##Type>(T), OS); \
359#include "clang/AST/TypeNodes.inc"
363 if (NeedARCStrongQualifier) {
364 IncludeStrongLifetimeRAII Strong(Policy);
365 Quals.
print(OS, Policy, !PrevPHIsEmpty.get());
367 Quals.
print(OS, Policy, !PrevPHIsEmpty.get());
372void TypePrinter::printAfter(QualType t, raw_ostream &OS) {
374 printAfter(split.
Ty, split.
Quals, OS);
379void TypePrinter::printAfter(
const Type *
T, Qualifiers Quals, raw_ostream &OS) {
381#define ABSTRACT_TYPE(CLASS, PARENT)
382#define TYPE(CLASS, PARENT) case Type::CLASS: \
383 print##CLASS##After(cast<CLASS##Type>(T), OS); \
385#include "clang/AST/TypeNodes.inc"
389void TypePrinter::printBuiltinBefore(
const BuiltinType *
T, raw_ostream &OS) {
390 OS <<
T->getName(Policy);
391 spaceBeforePlaceHolder(OS);
394void TypePrinter::printBuiltinAfter(
const BuiltinType *
T, raw_ostream &OS) {}
396void TypePrinter::printComplexBefore(
const ComplexType *
T, raw_ostream &OS) {
398 printBefore(
T->getElementType(), OS);
401void TypePrinter::printComplexAfter(
const ComplexType *
T, raw_ostream &OS) {
402 printAfter(
T->getElementType(), OS);
405void TypePrinter::printPointerBefore(
const PointerType *
T, raw_ostream &OS) {
406 IncludeStrongLifetimeRAII Strong(Policy);
407 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
416void TypePrinter::printPointerAfter(
const PointerType *
T, raw_ostream &OS) {
417 IncludeStrongLifetimeRAII Strong(Policy);
418 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
426void TypePrinter::printBlockPointerBefore(
const BlockPointerType *
T,
428 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
433void TypePrinter::printBlockPointerAfter(
const BlockPointerType *
T,
435 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
447void TypePrinter::printLValueReferenceBefore(
const LValueReferenceType *
T,
449 IncludeStrongLifetimeRAII Strong(Policy);
450 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
452 printBefore(Inner, OS);
460void TypePrinter::printLValueReferenceAfter(
const LValueReferenceType *
T,
462 IncludeStrongLifetimeRAII Strong(Policy);
463 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
469 printAfter(Inner, OS);
472void TypePrinter::printRValueReferenceBefore(
const RValueReferenceType *
T,
474 IncludeStrongLifetimeRAII Strong(Policy);
475 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
477 printBefore(Inner, OS);
485void TypePrinter::printRValueReferenceAfter(
const RValueReferenceType *
T,
487 IncludeStrongLifetimeRAII Strong(Policy);
488 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
494 printAfter(Inner, OS);
497void TypePrinter::printMemberPointerBefore(
const MemberPointerType *
T,
499 IncludeStrongLifetimeRAII Strong(Policy);
500 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
506 T->getQualifier().print(OS, Policy);
510void TypePrinter::printMemberPointerAfter(
const MemberPointerType *
T,
512 IncludeStrongLifetimeRAII Strong(Policy);
513 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
521void TypePrinter::printConstantArrayBefore(
const ConstantArrayType *
T,
523 IncludeStrongLifetimeRAII Strong(Policy);
524 printBefore(
T->getElementType(), OS);
527void TypePrinter::printConstantArrayAfter(
const ConstantArrayType *
T,
530 if (
T->getIndexTypeQualifiers().hasQualifiers()) {
536 if (
T->getSizeModifier() == ArraySizeModifier::Static)
539 OS <<
T->getZExtSize() <<
']';
540 printAfter(
T->getElementType(), OS);
543void TypePrinter::printIncompleteArrayBefore(
const IncompleteArrayType *
T,
545 IncludeStrongLifetimeRAII Strong(Policy);
546 printBefore(
T->getElementType(), OS);
549void TypePrinter::printIncompleteArrayAfter(
const IncompleteArrayType *
T,
552 printAfter(
T->getElementType(), OS);
555void TypePrinter::printVariableArrayBefore(
const VariableArrayType *
T,
557 IncludeStrongLifetimeRAII Strong(Policy);
558 printBefore(
T->getElementType(), OS);
561void TypePrinter::printVariableArrayAfter(
const VariableArrayType *
T,
564 if (
T->getIndexTypeQualifiers().hasQualifiers()) {
569 if (
T->getSizeModifier() == ArraySizeModifier::Static)
571 else if (
T->getSizeModifier() == ArraySizeModifier::Star)
574 if (
T->getSizeExpr())
575 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
578 printAfter(
T->getElementType(), OS);
581void TypePrinter::printAdjustedBefore(
const AdjustedType *
T, raw_ostream &OS) {
584 printBefore(
T->getAdjustedType(), OS);
587void TypePrinter::printAdjustedAfter(
const AdjustedType *
T, raw_ostream &OS) {
588 printAfter(
T->getAdjustedType(), OS);
591void TypePrinter::printDecayedBefore(
const DecayedType *
T, raw_ostream &OS) {
593 printAdjustedBefore(
T, OS);
596void TypePrinter::printArrayParameterAfter(
const ArrayParameterType *
T,
598 printConstantArrayAfter(
T, OS);
601void TypePrinter::printArrayParameterBefore(
const ArrayParameterType *
T,
603 printConstantArrayBefore(
T, OS);
606void TypePrinter::printDecayedAfter(
const DecayedType *
T, raw_ostream &OS) {
607 printAdjustedAfter(
T, OS);
610void TypePrinter::printDependentSizedArrayBefore(
611 const DependentSizedArrayType *
T,
613 IncludeStrongLifetimeRAII Strong(Policy);
614 printBefore(
T->getElementType(), OS);
617void TypePrinter::printDependentSizedArrayAfter(
618 const DependentSizedArrayType *
T,
621 if (
T->getSizeExpr())
622 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
624 printAfter(
T->getElementType(), OS);
627void TypePrinter::printDependentAddressSpaceBefore(
628 const DependentAddressSpaceType *
T, raw_ostream &OS) {
632void TypePrinter::printDependentAddressSpaceAfter(
633 const DependentAddressSpaceType *
T, raw_ostream &OS) {
634 OS <<
" __attribute__((address_space(";
635 if (
T->getAddrSpaceExpr())
636 T->getAddrSpaceExpr()->printPretty(OS,
nullptr, Policy);
641void TypePrinter::printDependentSizedExtVectorBefore(
642 const DependentSizedExtVectorType *
T, raw_ostream &OS) {
645 print(
T->getElementType(), OS, StringRef());
647 if (
T->getSizeExpr())
648 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
650 spaceBeforePlaceHolder(OS);
652 printBefore(
T->getElementType(), OS);
656void TypePrinter::printDependentSizedExtVectorAfter(
657 const DependentSizedExtVectorType *
T, raw_ostream &OS) {
661 OS <<
" __attribute__((ext_vector_type(";
662 if (
T->getSizeExpr())
663 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
665 printAfter(
T->getElementType(), OS);
668void TypePrinter::printVectorBefore(
const VectorType *
T, raw_ostream &OS) {
669 switch (
T->getVectorKind()) {
670 case VectorKind::AltiVecPixel:
671 OS <<
"__vector __pixel ";
673 case VectorKind::AltiVecBool:
674 OS <<
"__vector __bool ";
675 printBefore(
T->getElementType(), OS);
677 case VectorKind::AltiVecVector:
679 printBefore(
T->getElementType(), OS);
681 case VectorKind::Neon:
682 OS <<
"__attribute__((neon_vector_type("
683 <<
T->getNumElements() <<
"))) ";
684 printBefore(
T->getElementType(), OS);
686 case VectorKind::NeonPoly:
687 OS <<
"__attribute__((neon_polyvector_type(" <<
688 T->getNumElements() <<
"))) ";
689 printBefore(
T->getElementType(), OS);
691 case VectorKind::Generic: {
694 OS <<
"__attribute__((__vector_size__("
695 <<
T->getNumElements()
697 print(
T->getElementType(), OS, StringRef());
699 printBefore(
T->getElementType(), OS);
702 case VectorKind::SveFixedLengthData:
703 case VectorKind::SveFixedLengthPredicate:
706 OS <<
"__attribute__((__arm_sve_vector_bits__(";
708 if (
T->getVectorKind() == VectorKind::SveFixedLengthPredicate)
711 OS <<
T->getNumElements() * 8;
713 OS <<
T->getNumElements();
716 print(
T->getElementType(), OS, StringRef());
719 printBefore(
T->getElementType(), OS);
723 "unexpected vector kind");
726 OS <<
"__attribute__((__riscv_rvv_vector_bits__(";
731 OS <<
T->getNumElements();
733 print(
T->getElementType(), OS, StringRef());
738 printBefore(
T->getElementType(), OS);
743void TypePrinter::printVectorAfter(
const VectorType *
T, raw_ostream &OS) {
744 printAfter(
T->getElementType(), OS);
747void TypePrinter::printDependentVectorBefore(
748 const DependentVectorType *
T, raw_ostream &OS) {
749 switch (
T->getVectorKind()) {
750 case VectorKind::AltiVecPixel:
751 OS <<
"__vector __pixel ";
753 case VectorKind::AltiVecBool:
754 OS <<
"__vector __bool ";
755 printBefore(
T->getElementType(), OS);
757 case VectorKind::AltiVecVector:
759 printBefore(
T->getElementType(), OS);
761 case VectorKind::Neon:
762 OS <<
"__attribute__((neon_vector_type(";
763 if (
T->getSizeExpr())
764 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
766 printBefore(
T->getElementType(), OS);
768 case VectorKind::NeonPoly:
769 OS <<
"__attribute__((neon_polyvector_type(";
770 if (
T->getSizeExpr())
771 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
773 printBefore(
T->getElementType(), OS);
775 case VectorKind::Generic: {
778 OS <<
"__attribute__((__vector_size__(";
779 if (
T->getSizeExpr())
780 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
782 print(
T->getElementType(), OS, StringRef());
784 printBefore(
T->getElementType(), OS);
787 case VectorKind::SveFixedLengthData:
788 case VectorKind::SveFixedLengthPredicate:
791 OS <<
"__attribute__((__arm_sve_vector_bits__(";
792 if (
T->getSizeExpr()) {
793 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
794 if (
T->getVectorKind() == VectorKind::SveFixedLengthPredicate)
799 print(
T->getElementType(), OS, StringRef());
804 printBefore(
T->getElementType(), OS);
808 "unexpected vector kind");
811 OS <<
"__attribute__((__riscv_rvv_vector_bits__(";
812 if (
T->getSizeExpr()) {
813 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
815 print(
T->getElementType(), OS, StringRef());
820 printBefore(
T->getElementType(), OS);
825void TypePrinter::printDependentVectorAfter(
826 const DependentVectorType *
T, raw_ostream &OS) {
827 printAfter(
T->getElementType(), OS);
830void TypePrinter::printExtVectorBefore(
const ExtVectorType *
T,
834 print(
T->getElementType(), OS, StringRef());
835 OS <<
", " <<
T->getNumElements() <<
">";
836 spaceBeforePlaceHolder(OS);
838 printBefore(
T->getElementType(), OS);
842void TypePrinter::printExtVectorAfter(
const ExtVectorType *
T, raw_ostream &OS) {
846 printAfter(
T->getElementType(), OS);
847 OS <<
" __attribute__((ext_vector_type(";
848 OS <<
T->getNumElements();
853 OS <<
T->getNumRows() <<
", " <<
T->getNumColumns();
859 TP.print(
T->getElementType(), OS, StringRef());
863 TP.spaceBeforePlaceHolder(OS);
871 TP.printBefore(
T->getElementType(), OS);
872 OS <<
" __attribute__((matrix_type(";
877void TypePrinter::printConstantMatrixBefore(
const ConstantMatrixType *
T,
886void TypePrinter::printConstantMatrixAfter(
const ConstantMatrixType *
T,
892 printAfter(
T->getElementType(), OS);
895void TypePrinter::printDependentSizedMatrixBefore(
896 const DependentSizedMatrixType *
T, raw_ostream &OS) {
899 print(
T->getElementType(), OS, StringRef());
902 T->getRowExpr()->printPretty(OS,
nullptr, Policy);
904 if (
T->getColumnExpr())
905 T->getColumnExpr()->printPretty(OS,
nullptr, Policy);
907 spaceBeforePlaceHolder(OS);
909 printBefore(
T->getElementType(), OS);
910 OS <<
" __attribute__((matrix_type(";
912 T->getRowExpr()->printPretty(OS,
nullptr, Policy);
914 if (
T->getColumnExpr())
915 T->getColumnExpr()->printPretty(OS,
nullptr, Policy);
920void TypePrinter::printDependentSizedMatrixAfter(
921 const DependentSizedMatrixType *
T, raw_ostream &OS) {
923 printAfter(
T->getElementType(), OS);
943 OS <<
" __attribute__((nothrow))";
959 if (
T->hasTrailingReturn()) {
961 if (!HasEmptyPlaceHolder)
966 printBefore(
T->getReturnType(), OS);
967 if (!PrevPHIsEmpty.get())
975 llvm_unreachable(
"asking for spelling of ordinary parameter ABI");
977 return "swift_context";
979 return "swift_async_context";
981 return "swift_error_result";
983 return "swift_indirect_result";
989 llvm_unreachable(
"bad parameter ABI kind");
995 if (!HasEmptyPlaceHolder)
1001 ParamPolicyRAII ParamPolicy(Policy);
1002 for (
unsigned i = 0, e =
T->getNumParams(); i != e; ++i) {
1005 auto EPI =
T->getExtParameterInfo(i);
1006 if (EPI.isConsumed()) OS <<
"__attribute__((ns_consumed)) ";
1007 if (EPI.isNoEscape())
1008 OS <<
"__attribute__((noescape)) ";
1009 auto ABI = EPI.getABI();
1017 print(
T->getParamType(i).getNonReferenceType(), OS, StringRef());
1020 }
else if (ABI != ParameterABI::Ordinary)
1042 OS <<
" __arm_streaming_compatible";
1044 OS <<
" __arm_streaming";
1046 OS <<
"__arm_agnostic(\"sme_za_state\")";
1048 OS <<
" __arm_preserves(\"za\")";
1050 OS <<
" __arm_in(\"za\")";
1052 OS <<
" __arm_out(\"za\")";
1054 OS <<
" __arm_inout(\"za\")";
1056 OS <<
" __arm_preserves(\"zt0\")";
1058 OS <<
" __arm_in(\"zt0\")";
1060 OS <<
" __arm_out(\"zt0\")";
1062 OS <<
" __arm_inout(\"zt0\")";
1064 printFunctionAfter(Info, OS);
1084 for (
const auto &CFE : FX) {
1085 OS <<
" __attribute__((" << CFE.Effect.name();
1086 if (
const Expr *E = CFE.Cond.getCondition()) {
1088 E->printPretty(OS,
nullptr, Policy);
1095 OS <<
" __attribute__((cfi_unchecked_callee))";
1104void TypePrinter::printFunctionAfter(
const FunctionType::ExtInfo &Info,
1106 if (!InsideCCAttribute) {
1107 switch (Info.
getCC()) {
1118 OS <<
" __attribute__((stdcall))";
1121 OS <<
" __attribute__((fastcall))";
1124 OS <<
" __attribute__((thiscall))";
1127 OS <<
" __attribute__((vectorcall))";
1130 OS <<
" __attribute__((pascal))";
1133 OS <<
" __attribute__((pcs(\"aapcs\")))";
1136 OS <<
" __attribute__((pcs(\"aapcs-vfp\")))";
1139 OS <<
" __attribute__((aarch64_vector_pcs))";
1142 OS <<
" __attribute__((aarch64_sve_pcs))";
1145 OS <<
" __attribute__((device_kernel))";
1148 OS <<
" __attribute__((intel_ocl_bicc))";
1151 OS <<
" __attribute__((ms_abi))";
1154 OS <<
" __attribute__((sysv_abi))";
1157 OS <<
" __attribute__((regcall))";
1160 OS <<
" __attribute__((swiftcall))";
1163 OS <<
"__attribute__((swiftasynccall))";
1166 OS <<
" __attribute__((preserve_most))";
1169 OS <<
" __attribute__((preserve_all))";
1172 OS <<
" __attribute__((m68k_rtd))";
1175 OS <<
" __attribute__((preserve_none))";
1178 OS <<
"__attribute__((riscv_vector_cc))";
1180#define CC_VLS_CASE(ABI_VLEN) \
1181 case CC_RISCVVLSCall_##ABI_VLEN: \
1182 OS << "__attribute__((riscv_vls_cc" #ABI_VLEN "))"; \
1201 OS <<
" __attribute__((noreturn))";
1203 OS <<
" __attribute__((cmse_nonsecure_call))";
1205 OS <<
" __attribute__((ns_returns_retained))";
1207 OS <<
" __attribute__((regparm ("
1210 OS <<
" __attribute__((no_caller_saved_registers))";
1212 OS <<
" __attribute__((nocf_check))";
1215void TypePrinter::printFunctionNoProtoBefore(
const FunctionNoProtoType *
T,
1218 SaveAndRestore PrevPHIsEmpty(HasEmptyPlaceHolder,
false);
1220 if (!PrevPHIsEmpty.get())
1224void TypePrinter::printFunctionNoProtoAfter(
const FunctionNoProtoType *
T,
1227 if (!HasEmptyPlaceHolder)
1229 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
1236void TypePrinter::printTypeSpec(NamedDecl *D, raw_ostream &OS) {
1246 spaceBeforePlaceHolder(OS);
1249void TypePrinter::printUnresolvedUsingBefore(
const UnresolvedUsingType *
T,
1251 OS << TypeWithKeyword::getKeywordName(
T->getKeyword());
1252 if (
T->getKeyword() != ElaboratedTypeKeyword::None)
1254 auto *D =
T->getDecl();
1258 T->getQualifier().print(OS, Policy);
1261 spaceBeforePlaceHolder(OS);
1264void TypePrinter::printUnresolvedUsingAfter(
const UnresolvedUsingType *
T,
1267void TypePrinter::printUsingBefore(
const UsingType *
T, raw_ostream &OS) {
1268 OS << TypeWithKeyword::getKeywordName(
T->getKeyword());
1269 if (
T->getKeyword() != ElaboratedTypeKeyword::None)
1271 auto *D =
T->getDecl();
1272 if (Policy.FullyQualifiedName) {
1275 T->getQualifier().print(OS, Policy);
1278 spaceBeforePlaceHolder(OS);
1281void TypePrinter::printUsingAfter(
const UsingType *
T, raw_ostream &OS) {}
1283void TypePrinter::printTypedefBefore(
const TypedefType *
T, raw_ostream &OS) {
1284 OS << TypeWithKeyword::getKeywordName(
T->getKeyword());
1285 if (
T->getKeyword() != ElaboratedTypeKeyword::None)
1287 auto *D =
T->getDecl();
1288 if (Policy.FullyQualifiedName) {
1291 T->getQualifier().print(OS, Policy);
1294 spaceBeforePlaceHolder(OS);
1297void TypePrinter::printMacroQualifiedBefore(
const MacroQualifiedType *
T,
1299 StringRef MacroName =
T->getMacroIdentifier()->getName();
1300 OS << MacroName <<
" ";
1304 printBefore(
T->getModifiedType(), OS);
1307void TypePrinter::printMacroQualifiedAfter(
const MacroQualifiedType *
T,
1309 printAfter(
T->getModifiedType(), OS);
1312void TypePrinter::printTypedefAfter(
const TypedefType *
T, raw_ostream &OS) {}
1314void TypePrinter::printTypeOfExprBefore(
const TypeOfExprType *
T,
1316 OS << (
T->getKind() == TypeOfKind::Unqualified ?
"typeof_unqual "
1318 if (
T->getUnderlyingExpr())
1319 T->getUnderlyingExpr()->printPretty(OS,
nullptr, Policy);
1320 spaceBeforePlaceHolder(OS);
1323void TypePrinter::printTypeOfExprAfter(
const TypeOfExprType *
T,
1326void TypePrinter::printTypeOfBefore(
const TypeOfType *
T, raw_ostream &OS) {
1327 OS << (
T->getKind() == TypeOfKind::Unqualified ?
"typeof_unqual("
1329 print(
T->getUnmodifiedType(), OS, StringRef());
1331 spaceBeforePlaceHolder(OS);
1334void TypePrinter::printTypeOfAfter(
const TypeOfType *
T, raw_ostream &OS) {}
1336void TypePrinter::printDecltypeBefore(
const DecltypeType *
T, raw_ostream &OS) {
1342 if (
const Expr *E =
T->getUnderlyingExpr()) {
1343 PrintingPolicy ExprPolicy = Policy;
1345 E->printPretty(OS,
nullptr, ExprPolicy);
1348 spaceBeforePlaceHolder(OS);
1351void TypePrinter::printPackIndexingBefore(
const PackIndexingType *
T,
1353 if (
T->hasSelectedType()) {
1354 OS <<
T->getSelectedType();
1356 OS <<
T->getPattern() <<
"...[";
1357 T->getIndexExpr()->printPretty(OS,
nullptr, Policy);
1360 spaceBeforePlaceHolder(OS);
1363void TypePrinter::printPackIndexingAfter(
const PackIndexingType *
T,
1366void TypePrinter::printDecltypeAfter(
const DecltypeType *
T, raw_ostream &OS) {
1371void TypePrinter::printUnaryTransformBefore(
const UnaryTransformType *
T,
1373 IncludeStrongLifetimeRAII Strong(Policy);
1375 static const llvm::DenseMap<int, const char *> Transformation = {{
1376#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
1377 {UnaryTransformType::Enum, "__" #Trait},
1378#include "clang/Basic/BuiltinTraits.inc"
1380 OS << Transformation.lookup(
T->getUTTKind()) <<
'(';
1381 print(
T->getBaseType(), OS, StringRef());
1383 spaceBeforePlaceHolder(OS);
1386void TypePrinter::printUnaryTransformAfter(
const UnaryTransformType *
T,
1389void TypePrinter::printAutoBefore(
const AutoType *
T, raw_ostream &OS) {
1391 if (!
T->getDeducedType().isNull()) {
1392 printBefore(
T->getDeducedType(), OS);
1394 if (
T->isConstrained()) {
1398 Concept.print(OS, Policy, TemplateName::Qualified::None);
1399 auto Args =
T->getTypeConstraintArguments();
1400 if (!Args.empty()) {
1401 const TemplateDecl *TD =
Concept.getAsTemplateDecl();
1403 TD =
Concept.getAsTemplateTemplateParmDecl();
1404 printTemplateArgumentList(OS, Args, Policy,
1409 switch (
T->getKeyword()) {
1410 case AutoTypeKeyword::Auto:
OS <<
"auto";
break;
1411 case AutoTypeKeyword::DecltypeAuto:
OS <<
"decltype(auto)";
break;
1412 case AutoTypeKeyword::GNUAutoType:
OS <<
"__auto_type";
break;
1414 spaceBeforePlaceHolder(OS);
1418void TypePrinter::printAutoAfter(
const AutoType *
T, raw_ostream &OS) {
1420 if (!
T->getDeducedType().isNull())
1421 printAfter(
T->getDeducedType(), OS);
1424void TypePrinter::printDeducedTemplateSpecializationBefore(
1425 const DeducedTemplateSpecializationType *
T, raw_ostream &OS) {
1427 T->getKeyword() != ElaboratedTypeKeyword::None)
1437 ArrayRef<TemplateArgument> Args;
1438 TemplateDecl *DeducedTD =
nullptr;
1439 if (!
T->getDeducedType().isNull()) {
1440 if (
const auto *TST =
1441 dyn_cast<TemplateSpecializationType>(
T->getDeducedType())) {
1442 DeducedTD = TST->getTemplateName().getAsTemplateDecl(
1444 Args = TST->template_arguments();
1449 DeducedTD = CD->getSpecializedTemplate();
1450 Args = CD->getTemplateArgs().asArray();
1464 IncludeStrongLifetimeRAII Strong(Policy);
1465 Name.
print(OS, Policy);
1468 printTemplateArgumentList(OS, Args, Policy,
1472 spaceBeforePlaceHolder(OS);
1475void TypePrinter::printDeducedTemplateSpecializationAfter(
1476 const DeducedTemplateSpecializationType *
T, raw_ostream &OS) {
1478 if (!
T->getDeducedType().isNull())
1479 printAfter(
T->getDeducedType(), OS);
1482void TypePrinter::printAtomicBefore(
const AtomicType *
T, raw_ostream &OS) {
1483 IncludeStrongLifetimeRAII Strong(Policy);
1486 print(
T->getValueType(), OS, StringRef());
1488 spaceBeforePlaceHolder(OS);
1491void TypePrinter::printAtomicAfter(
const AtomicType *
T, raw_ostream &OS) {}
1493void TypePrinter::printPipeBefore(
const PipeType *
T, raw_ostream &OS) {
1494 IncludeStrongLifetimeRAII Strong(Policy);
1496 if (
T->isReadOnly())
1499 OS <<
"write_only ";
1501 print(
T->getElementType(), OS, StringRef());
1502 spaceBeforePlaceHolder(OS);
1505void TypePrinter::printPipeAfter(
const PipeType *
T, raw_ostream &OS) {}
1507void TypePrinter::printBitIntBefore(
const BitIntType *
T, raw_ostream &OS) {
1508 if (
T->isUnsigned())
1510 OS <<
"_BitInt(" <<
T->getNumBits() <<
")";
1511 spaceBeforePlaceHolder(OS);
1514void TypePrinter::printBitIntAfter(
const BitIntType *
T, raw_ostream &OS) {}
1516void TypePrinter::printDependentBitIntBefore(
const DependentBitIntType *
T,
1518 if (
T->isUnsigned())
1521 T->getNumBitsExpr()->printPretty(OS,
nullptr, Policy);
1523 spaceBeforePlaceHolder(OS);
1526void TypePrinter::printDependentBitIntAfter(
const DependentBitIntType *
T,
1529void TypePrinter::printPredefinedSugarBefore(
const PredefinedSugarType *
T,
1531 OS <<
T->getIdentifier()->getName();
1532 spaceBeforePlaceHolder(OS);
1535void TypePrinter::printPredefinedSugarAfter(
const PredefinedSugarType *
T,
1538void TypePrinter::printTagType(
const TagType *
T, raw_ostream &OS) {
1539 TagDecl *D =
T->getDecl();
1542 D->
print(OS, Policy, Indentation);
1543 spaceBeforePlaceHolder(OS);
1547 bool PrintedKindDecoration =
false;
1550 PrintedKindDecoration =
true;
1555 OS << TypeWithKeyword::getKeywordName(
T->getKeyword());
1556 if (
T->getKeyword() != ElaboratedTypeKeyword::None) {
1557 PrintedKindDecoration =
true;
1563 T->getQualifier().print(OS, Policy);
1574 clang::PrintingPolicy
Copy(Policy);
1577 if (PrintedKindDecoration) {
1578 Copy.SuppressTagKeywordInAnonNames =
true;
1579 Copy.SuppressTagKeyword =
true;
1587 if (
auto *S = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
1588 const TemplateParameterList *TParams =
1589 S->getSpecializedTemplate()->getTemplateParameters();
1590 const ASTTemplateArgumentListInfo *TArgAsWritten =
1591 S->getTemplateArgsAsWritten();
1592 IncludeStrongLifetimeRAII Strong(Policy);
1593 if (TArgAsWritten && !Policy.PrintAsCanonical)
1594 printTemplateArgumentList(OS, TArgAsWritten->
arguments(), Policy,
1597 printTemplateArgumentList(OS, S->getTemplateArgs().asArray(), Policy,
1601 spaceBeforePlaceHolder(OS);
1604void TypePrinter::printRecordBefore(
const RecordType *
T, raw_ostream &OS) {
1606 if (Policy.UsePreferredNames) {
1607 for (
const auto *PNA :
T->getDecl()
1608 ->getMostRecentDecl()
1609 ->specific_attrs<PreferredNameAttr>()) {
1614 QualType
T = PNA->getTypedefType();
1616 if (
auto *TT = dyn_cast<TypedefType>(
T))
1617 return printTypeSpec(TT->getDecl(), OS);
1618 if (
auto *TST = dyn_cast<TemplateSpecializationType>(
T))
1619 return printTemplateId(TST, OS,
true);
1625 printTagType(
T, OS);
1628void TypePrinter::printRecordAfter(
const RecordType *
T, raw_ostream &OS) {}
1630void TypePrinter::printEnumBefore(
const EnumType *
T, raw_ostream &OS) {
1631 printTagType(
T, OS);
1634void TypePrinter::printEnumAfter(
const EnumType *
T, raw_ostream &OS) {}
1636void TypePrinter::printInjectedClassNameBefore(
const InjectedClassNameType *
T,
1638 const ASTContext &Ctx =
T->getDecl()->getASTContext();
1639 IncludeStrongLifetimeRAII Strong(Policy);
1640 T->getTemplateName(Ctx).print(OS, Policy);
1641 if (Policy.PrintInjectedClassNameWithArguments) {
1642 auto *
Decl =
T->getDecl();
1645 if (
auto *RD = dyn_cast<ClassTemplateSpecializationDecl>(Decl)) {
1646 printTemplateArgumentList(OS, RD->getTemplateArgsAsWritten()->arguments(),
1648 T->getTemplateDecl()->getTemplateParameters());
1650 ClassTemplateDecl *TD =
Decl->getDescribedClassTemplate();
1652 printTemplateArgumentList(
1654 T->getTemplateDecl()->getTemplateParameters());
1657 spaceBeforePlaceHolder(OS);
1660void TypePrinter::printInjectedClassNameAfter(
const InjectedClassNameType *
T,
1663void TypePrinter::printTemplateTypeParmBefore(
const TemplateTypeParmType *
T,
1665 TemplateTypeParmDecl *D =
T->getDecl();
1668 TC->print(OS, Policy);
1672 }
else if (IdentifierInfo *Id =
T->getIdentifier())
1673 OS << (Policy.CleanUglifiedParameters ? Id->deuglifiedName()
1676 OS <<
"type-parameter-" <<
T->getDepth() <<
'-' <<
T->getIndex();
1678 spaceBeforePlaceHolder(OS);
1681void TypePrinter::printTemplateTypeParmAfter(
const TemplateTypeParmType *
T,
1684void TypePrinter::printSubstTemplateTypeParmBefore(
1685 const SubstTemplateTypeParmType *
T,
1687 IncludeStrongLifetimeRAII Strong(Policy);
1688 printBefore(
T->getReplacementType(), OS);
1691void TypePrinter::printSubstTemplateTypeParmAfter(
1692 const SubstTemplateTypeParmType *
T,
1694 IncludeStrongLifetimeRAII Strong(Policy);
1695 printAfter(
T->getReplacementType(), OS);
1698void TypePrinter::printSubstBuiltinTemplatePackBefore(
1699 const SubstBuiltinTemplatePackType *
T, raw_ostream &OS) {
1700 IncludeStrongLifetimeRAII Strong(Policy);
1704void TypePrinter::printSubstBuiltinTemplatePackAfter(
1705 const SubstBuiltinTemplatePackType *
T, raw_ostream &OS) {}
1707void TypePrinter::printSubstTemplateTypeParmPackBefore(
1708 const SubstTemplateTypeParmPackType *
T,
1710 IncludeStrongLifetimeRAII Strong(Policy);
1711 if (
const TemplateTypeParmDecl *D =
T->getReplacedParameter()) {
1714 TC->print(OS, Policy);
1719 OS << (Policy.CleanUglifiedParameters ? Id->deuglifiedName()
1724 spaceBeforePlaceHolder(OS);
1728void TypePrinter::printSubstTemplateTypeParmPackAfter(
1729 const SubstTemplateTypeParmPackType *
T,
1731 IncludeStrongLifetimeRAII Strong(Policy);
1734void TypePrinter::printTemplateId(
const TemplateSpecializationType *
T,
1735 raw_ostream &OS,
bool FullyQualify) {
1736 IncludeStrongLifetimeRAII Strong(Policy);
1739 K != ElaboratedTypeKeyword::None)
1740 OS << TypeWithKeyword::getKeywordName(K) <<
' ';
1743 T->getTemplateName().getAsTemplateDecl(
true);
1745 if (FullyQualify && TD) {
1751 T->getTemplateName().print(OS, Policy,
1753 ? TemplateName::Qualified::AsWritten
1754 : TemplateName::Qualified::None);
1757 DefaultTemplateArgsPolicyRAII TemplateArgs(Policy);
1759 printTemplateArgumentList(OS,
T->template_arguments(), Policy, TPL);
1760 spaceBeforePlaceHolder(OS);
1763void TypePrinter::printTemplateSpecializationBefore(
1764 const TemplateSpecializationType *
T,
1766 printTemplateId(
T, OS, Policy.FullyQualifiedName);
1769void TypePrinter::printTemplateSpecializationAfter(
1770 const TemplateSpecializationType *
T,
1773void TypePrinter::printParenBefore(
const ParenType *
T, raw_ostream &OS) {
1775 printBefore(
T->getInnerType(), OS);
1778 printBefore(
T->getInnerType(), OS);
1781void TypePrinter::printParenAfter(
const ParenType *
T, raw_ostream &OS) {
1784 printAfter(
T->getInnerType(), OS);
1786 printAfter(
T->getInnerType(), OS);
1789void TypePrinter::printDependentNameBefore(
const DependentNameType *
T,
1791 OS << TypeWithKeyword::getKeywordName(
T->getKeyword());
1792 if (
T->getKeyword() != ElaboratedTypeKeyword::None)
1794 T->getQualifier().print(OS, Policy);
1795 OS <<
T->getIdentifier()->getName();
1796 spaceBeforePlaceHolder(OS);
1799void TypePrinter::printDependentNameAfter(
const DependentNameType *
T,
1802void TypePrinter::printPackExpansionBefore(
const PackExpansionType *
T,
1804 printBefore(
T->getPattern(), OS);
1807void TypePrinter::printPackExpansionAfter(
const PackExpansionType *
T,
1809 printAfter(
T->getPattern(), OS);
1817 if (
T->isCountInBytes() &&
T->isOrNull())
1818 OS <<
"__sized_by_or_null(";
1819 else if (
T->isCountInBytes())
1820 OS <<
"__sized_by(";
1821 else if (
T->isOrNull())
1822 OS <<
"__counted_by_or_null(";
1824 OS <<
"__counted_by(";
1825 if (
T->getCountExpr())
1826 T->getCountExpr()->printPretty(OS,
nullptr, Policy);
1830void TypePrinter::printCountAttributedBefore(
const CountAttributedType *
T,
1837void TypePrinter::printCountAttributedAfter(
const CountAttributedType *
T,
1844void TypePrinter::printLateParsedAttrBefore(
const LateParsedAttrType *
T,
1848 printBefore(
T->getWrappedType(), OS);
1851void TypePrinter::printLateParsedAttrAfter(
const LateParsedAttrType *
T,
1855 printAfter(
T->getWrappedType(), OS);
1858void TypePrinter::printAttributedBefore(
const AttributedType *
T,
1863 if (
T->getAttrKind() == attr::ObjCGC ||
1864 T->getAttrKind() == attr::ObjCOwnership)
1865 return printBefore(
T->getEquivalentType(), OS);
1867 if (
T->getAttrKind() == attr::ObjCKindOf)
1870 if (
T->getAttrKind() == attr::PreserveNone) {
1871 OS <<
"__attribute__((preserve_none)) ";
1872 spaceBeforePlaceHolder(OS);
1873 }
else if (
T->getAttrKind() == attr::PreserveMost) {
1874 OS <<
"__attribute__((preserve_most)) ";
1875 spaceBeforePlaceHolder(OS);
1876 }
else if (
T->getAttrKind() == attr::PreserveAll) {
1877 OS <<
"__attribute__((preserve_all)) ";
1878 spaceBeforePlaceHolder(OS);
1881 if (
T->getAttrKind() == attr::AddressSpace)
1882 printBefore(
T->getEquivalentType(), OS);
1884 printBefore(
T->getModifiedType(), OS);
1886 if (
T->isMSTypeSpec()) {
1887 switch (
T->getAttrKind()) {
1889 case attr::Ptr32:
OS <<
" __ptr32";
break;
1890 case attr::Ptr64:
OS <<
" __ptr64";
break;
1891 case attr::SPtr:
OS <<
" __sptr";
break;
1892 case attr::UPtr:
OS <<
" __uptr";
break;
1894 spaceBeforePlaceHolder(OS);
1897 if (
T->isWebAssemblyFuncrefSpec())
1901 if (
T->getImmediateNullability()) {
1902 if (
T->getAttrKind() == attr::TypeNonNull)
1904 else if (
T->getAttrKind() == attr::TypeNullable)
1906 else if (
T->getAttrKind() == attr::TypeNullUnspecified)
1907 OS <<
" _Null_unspecified";
1908 else if (
T->getAttrKind() == attr::TypeNullableResult)
1909 OS <<
" _Nullable_result";
1911 llvm_unreachable(
"unhandled nullability");
1912 spaceBeforePlaceHolder(OS);
1916void TypePrinter::printAttributedAfter(
const AttributedType *
T,
1921 if (
T->getAttrKind() == attr::ObjCGC ||
1922 T->getAttrKind() == attr::ObjCOwnership)
1923 return printAfter(
T->getEquivalentType(), OS);
1927 SaveAndRestore MaybeSuppressCC(InsideCCAttribute,
T->isCallingConv());
1929 printAfter(
T->getModifiedType(), OS);
1933 if (
T->getAttrKind() == attr::ObjCKindOf ||
T->isMSTypeSpec() ||
1934 T->getImmediateNullability() ||
T->isWebAssemblyFuncrefSpec())
1938 if (
T->getAttrKind() == attr::ObjCInertUnsafeUnretained)
1942 if (
T->getAttrKind() == attr::NSReturnsRetained &&
1943 !
T->getEquivalentType()->
castAs<FunctionType>()
1944 ->getExtInfo().getProducesResult())
1947 if (
T->getAttrKind() == attr::LifetimeBound) {
1948 OS <<
" [[clang::lifetimebound]]";
1951 if (
T->getAttrKind() == attr::LifetimeCaptureBy) {
1952 OS <<
" [[clang::lifetime_capture_by(";
1953 if (
auto *attr = dyn_cast_or_null<LifetimeCaptureByAttr>(
T->getAttr()))
1954 llvm::interleaveComma(
attr->getArgIdents(), OS,
1955 [&](
auto it) { OS << it->getName(); });
1963 if (
T->getAttrKind() == attr::AddressSpace)
1966 if (
T->getAttrKind() == attr::AnnotateType) {
1971 OS <<
" [[clang::annotate_type(...)]]";
1975 if (
T->getAttrKind() == attr::ArmStreaming) {
1976 OS <<
"__arm_streaming";
1979 if (
T->getAttrKind() == attr::ArmStreamingCompatible) {
1980 OS <<
"__arm_streaming_compatible";
1984 if (
T->getAttrKind() == attr::SwiftAttr) {
1985 if (
auto *swiftAttr = dyn_cast_or_null<SwiftAttrAttr>(
T->getAttr())) {
1986 OS <<
" __attribute__((swift_attr(\"" << swiftAttr->getAttribute()
1992 if (
T->getAttrKind() == attr::PreserveAll ||
1993 T->getAttrKind() == attr::PreserveMost ||
1994 T->getAttrKind() == attr::PreserveNone) {
1999 OS <<
" __attribute__((";
2000 switch (
T->getAttrKind()) {
2001#define TYPE_ATTR(NAME)
2002#define DECL_OR_TYPE_ATTR(NAME)
2003#define ATTR(NAME) case attr::NAME:
2004#include "clang/Basic/AttrList.inc"
2005 llvm_unreachable(
"non-type attribute attached to type");
2007 case attr::BTFTypeTag:
2008 llvm_unreachable(
"BTFTypeTag attribute handled separately");
2010 case attr::HLSLResourceClass:
2011 case attr::HLSLIsROV:
2012 case attr::HLSLRawBuffer:
2013 case attr::HLSLContainedType:
2014 case attr::HLSLIsCounter:
2015 case attr::HLSLResourceDimension:
2016 case attr::HLSLIsArray:
2017 case attr::HLSLIsMultiSampled:
2018 llvm_unreachable(
"HLSL resource type attributes handled separately");
2020 case attr::OpenCLPrivateAddressSpace:
2021 case attr::OpenCLGlobalAddressSpace:
2022 case attr::OpenCLGlobalDeviceAddressSpace:
2023 case attr::OpenCLGlobalHostAddressSpace:
2024 case attr::OpenCLLocalAddressSpace:
2025 case attr::OpenCLConstantAddressSpace:
2026 case attr::OpenCLGenericAddressSpace:
2027 case attr::HLSLGroupSharedAddressSpace:
2028 case attr::SYCLPrivateAddressSpace:
2029 case attr::SYCLGlobalAddressSpace:
2030 case attr::SYCLLocalAddressSpace:
2031 case attr::SYCLConstantAddressSpace:
2032 case attr::SYCLGenericAddressSpace:
2035 llvm_unreachable(
"Address space attributes handled separately");
2036 case attr::CountedBy:
2037 case attr::CountedByOrNull:
2039 case attr::SizedByOrNull:
2040 case attr::LifetimeBound:
2041 case attr::LifetimeCaptureBy:
2042 case attr::TypeNonNull:
2043 case attr::TypeNullable:
2044 case attr::TypeNullableResult:
2045 case attr::TypeNullUnspecified:
2047 case attr::ObjCInertUnsafeUnretained:
2048 case attr::ObjCKindOf:
2049 case attr::ObjCOwnership:
2054 case attr::PointerAuth:
2055 case attr::AddressSpace:
2056 case attr::CmseNSCall:
2057 case attr::AnnotateType:
2058 case attr::WebAssemblyFuncref:
2059 case attr::ArmAgnostic:
2060 case attr::ArmStreaming:
2061 case attr::ArmStreamingCompatible:
2064 case attr::ArmInOut:
2065 case attr::ArmPreserves:
2066 case attr::NonBlocking:
2067 case attr::NonAllocating:
2068 case attr::Blocking:
2069 case attr::Allocating:
2070 case attr::SwiftAttr:
2071 case attr::PreserveAll:
2072 case attr::PreserveMost:
2073 case attr::PreserveNone:
2074 case attr::OverflowBehavior:
2075 llvm_unreachable(
"This attribute should have been handled already");
2077 case attr::NSReturnsRetained:
2078 OS <<
"ns_returns_retained";
2081 case attr::HLSLRowMajor:
2084 case attr::HLSLColumnMajor:
2085 OS <<
"column_major";
2090 case attr::AnyX86NoCfCheck:
OS <<
"nocf_check";
break;
2091 case attr::CDecl:
OS <<
"cdecl";
break;
2092 case attr::FastCall:
OS <<
"fastcall";
break;
2093 case attr::StdCall:
OS <<
"stdcall";
break;
2094 case attr::ThisCall:
OS <<
"thiscall";
break;
2095 case attr::SwiftCall:
OS <<
"swiftcall";
break;
2096 case attr::SwiftAsyncCall:
OS <<
"swiftasynccall";
break;
2097 case attr::VectorCall:
OS <<
"vectorcall";
break;
2098 case attr::Pascal:
OS <<
"pascal";
break;
2099 case attr::MSABI:
OS <<
"ms_abi";
break;
2100 case attr::SysVABI:
OS <<
"sysv_abi";
break;
2101 case attr::RegCall:
OS <<
"regcall";
break;
2104 QualType t =
T->getEquivalentType();
2108 "\"aapcs\"" :
"\"aapcs-vfp\"");
2112 case attr::AArch64VectorPcs:
OS <<
"aarch64_vector_pcs";
break;
2113 case attr::AArch64SVEPcs:
OS <<
"aarch64_sve_pcs";
break;
2114 case attr::IntelOclBicc:
2115 OS <<
"inteloclbicc";
2120 case attr::RISCVVectorCC:
2121 OS <<
"riscv_vector_cc";
2123 case attr::RISCVVLSCC:
2124 OS <<
"riscv_vls_cc";
2129 case attr::CFIUncheckedCallee:
2130 OS <<
"cfi_unchecked_callee";
2132 case attr::AcquireHandle:
2133 OS <<
"acquire_handle";
2135 case attr::ArmMveStrictPolymorphism:
2136 OS <<
"__clang_arm_mve_strict_polymorphism";
2138 case attr::ExtVectorType:
2139 OS <<
"ext_vector_type";
2144 case attr::NoFieldProtection:
2145 OS <<
"no_field_protection";
2147 case attr::PointerFieldProtection:
2148 OS <<
"pointer_field_protection";
2154void TypePrinter::printBTFTagAttributedBefore(
const BTFTagAttributedType *
T,
2156 printBefore(
T->getWrappedType(), OS);
2157 OS <<
" __attribute__((btf_type_tag(\"" <<
T->getAttr()->getBTFTypeTag() <<
"\")))";
2160void TypePrinter::printBTFTagAttributedAfter(
const BTFTagAttributedType *
T,
2162 printAfter(
T->getWrappedType(), OS);
2165void TypePrinter::printOverflowBehaviorBefore(
const OverflowBehaviorType *
T,
2167 switch (
T->getBehaviorKind()) {
2168 case clang::OverflowBehaviorType::OverflowBehaviorKind::Wrap:
2171 case clang::OverflowBehaviorType::OverflowBehaviorKind::Trap:
2175 printBefore(
T->getUnderlyingType(), OS);
2178void TypePrinter::printOverflowBehaviorAfter(
const OverflowBehaviorType *
T,
2180 printAfter(
T->getUnderlyingType(), OS);
2183void TypePrinter::printHLSLAttributedResourceBefore(
2184 const HLSLAttributedResourceType *
T, raw_ostream &OS) {
2185 printBefore(
T->getWrappedType(), OS);
2188void TypePrinter::printHLSLAttributedResourceAfter(
2189 const HLSLAttributedResourceType *
T, raw_ostream &OS) {
2190 printAfter(
T->getWrappedType(), OS);
2191 const HLSLAttributedResourceType::Attributes &Attrs =
T->getAttrs();
2192 OS <<
" [[hlsl::resource_class(\""
2193 << HLSLResourceClassAttr::ConvertResourceClassToStr(Attrs.ResourceClass)
2196 OS <<
" [[hlsl::is_rov]]";
2197 if (Attrs.RawBuffer)
2198 OS <<
" [[hlsl::raw_buffer]]";
2199 if (Attrs.IsCounter)
2200 OS <<
" [[hlsl::is_counter]]";
2202 OS <<
" [[hlsl::is_array]]";
2203 if (Attrs.isMultiSampled())
2204 OS <<
" [[hlsl::is_ms]]";
2206 QualType ContainedTy =
T->getContainedType();
2207 if (!ContainedTy.
isNull()) {
2208 OS <<
" [[hlsl::contained_type(";
2209 printBefore(ContainedTy, OS);
2210 printAfter(ContainedTy, OS);
2214 if (Attrs.ResourceDimension != llvm::dxil::ResourceDimension::Unknown)
2215 OS <<
" [[hlsl::dimension(\""
2216 << HLSLResourceDimensionAttr::ConvertResourceDimensionToStr(
2217 Attrs.ResourceDimension)
2221void TypePrinter::printHLSLInlineSpirvBefore(
const HLSLInlineSpirvType *
T,
2223 OS <<
"__hlsl_spirv_type<" <<
T->getOpcode();
2225 OS <<
", " <<
T->getSize();
2226 OS <<
", " <<
T->getAlignment();
2228 for (
auto &Operand :
T->getOperands()) {
2229 using SpirvOperandKind = SpirvOperand::SpirvOperandKind;
2233 case SpirvOperandKind::ConstantId: {
2234 QualType ConstantType =
Operand.getResultType();
2235 OS <<
"vk::integral_constant<";
2236 printBefore(ConstantType, OS);
2237 printAfter(ConstantType, OS);
2243 case SpirvOperandKind::Literal:
2244 OS <<
"vk::Literal<vk::integral_constant<uint, ";
2248 case SpirvOperandKind::TypeId: {
2250 printBefore(
Type, OS);
2251 printAfter(
Type, OS);
2255 llvm_unreachable(
"Invalid SpirvOperand kind!");
2263void TypePrinter::printHLSLInlineSpirvAfter(
const HLSLInlineSpirvType *
T,
2268void TypePrinter::printObjCInterfaceBefore(
const ObjCInterfaceType *
T,
2270 OS <<
T->getDecl()->getName();
2271 spaceBeforePlaceHolder(OS);
2274void TypePrinter::printObjCInterfaceAfter(
const ObjCInterfaceType *
T,
2277void TypePrinter::printObjCTypeParamBefore(
const ObjCTypeParamType *
T,
2279 OS <<
T->getDecl()->getName();
2280 if (!
T->qual_empty()) {
2281 bool isFirst =
true;
2283 for (
const auto *I :
T->quals()) {
2293 spaceBeforePlaceHolder(OS);
2296void TypePrinter::printObjCTypeParamAfter(
const ObjCTypeParamType *
T,
2299void TypePrinter::printObjCObjectBefore(
const ObjCObjectType *
T,
2301 if (
T->qual_empty() &&
T->isUnspecializedAsWritten() &&
2302 !
T->isKindOfTypeAsWritten())
2303 return printBefore(
T->getBaseType(), OS);
2305 if (
T->isKindOfTypeAsWritten())
2308 print(
T->getBaseType(), OS, StringRef());
2310 if (
T->isSpecializedAsWritten()) {
2311 bool isFirst =
true;
2313 for (
auto typeArg :
T->getTypeArgsAsWritten()) {
2319 print(typeArg, OS, StringRef());
2324 if (!
T->qual_empty()) {
2325 bool isFirst =
true;
2327 for (
const auto *I :
T->quals()) {
2337 spaceBeforePlaceHolder(OS);
2340void TypePrinter::printObjCObjectAfter(
const ObjCObjectType *
T,
2342 if (
T->qual_empty() &&
T->isUnspecializedAsWritten() &&
2343 !
T->isKindOfTypeAsWritten())
2344 return printAfter(
T->getBaseType(), OS);
2347void TypePrinter::printObjCObjectPointerBefore(
const ObjCObjectPointerType *
T,
2354 if (HasEmptyPlaceHolder)
2360void TypePrinter::printObjCObjectPointerAfter(
const ObjCObjectPointerType *
T,
2371 llvm::raw_ostream &OS,
bool IncludeType) {
2372 A.
print(PP, OS, IncludeType);
2385 TemplateArgument Pattern,
2386 ArrayRef<TemplateArgument> Args,
2395 if (
auto *TTPT = Pattern->
getAsCanonical<TemplateTypeParmType>()) {
2396 if (TTPT->getDepth() == Depth && TTPT->getIndex() < Args.size() &&
2399 Args[TTPT->getIndex()].getAsType(), Pattern.
getQualifiers());
2411 if (TQual != PatQual)
2416 QualType TPointee =
T->getPointeeType();
2428 if (
auto *TTST =
T->getAs<TemplateSpecializationType>()) {
2429 Template = TTST->getTemplateName();
2430 TemplateArgs = TTST->template_arguments();
2431 }
else if (
auto *CTSD = dyn_cast_or_null<ClassTemplateSpecializationDecl>(
2432 T->getAsCXXRecordDecl())) {
2434 TemplateArgs = CTSD->getTemplateArgs().asArray();
2442 if (TemplateArgs.size() != PTST->template_arguments().size())
2444 for (
unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
2446 Ctx, TemplateArgs[I], PTST->template_arguments()[I], Args, Depth))
2497 if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl()))
2498 return NTTP->getDepth() == Depth && Args.size() > NTTP->getIndex() &&
2499 Args[NTTP->getIndex()].structurallyEquals(Arg);
2515 if (
auto *TTPD = dyn_cast_or_null<TemplateTemplateParmDecl>(PatTD))
2516 return TTPD->getDepth() == Depth && Args.size() > TTPD->getIndex() &&
2525bool clang::isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg,
2526 const NamedDecl *Param,
2527 ArrayRef<TemplateArgument> Args,
2533 if (
auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Param)) {
2534 return TTPD->hasDefaultArgument() &&
2536 Ctx, Arg, TTPD->getDefaultArgument().getArgument(), Args, Depth);
2537 }
else if (
auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
2538 return TTPD->hasDefaultArgument() &&
2540 Ctx, Arg, TTPD->getDefaultArgument().getArgument(), Args, Depth);
2541 }
else if (
auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
2542 return NTTPD->hasDefaultArgument() &&
2544 Ctx, Arg, NTTPD->getDefaultArgument().getArgument(), Args,
2550template <
typename TA>
2556 !Args.empty() && !IsPack && Args.size() <= TPL->
size()) {
2558 for (
const TA &A : Args)
2560 while (!Args.empty() &&
getArgument(Args.back()).getIsDefaulted())
2561 Args = Args.drop_back();
2564 const char *Comma = Policy.MSVCFormatting ?
"," :
", ";
2568 bool NeedSpace =
false;
2569 bool FirstArg =
true;
2570 for (
const auto &Arg : Args) {
2573 llvm::raw_svector_ostream ArgOS(Buf);
2586 Policy, TPL, ParmIndex));
2588 StringRef ArgString = ArgOS.str();
2593 if (FirstArg && ArgString.starts_with(
":"))
2600 if (!ArgString.empty()) {
2617void clang::printTemplateArgumentList(raw_ostream &OS,
2618 const TemplateArgumentListInfo &Args,
2619 const PrintingPolicy &Policy,
2620 const TemplateParameterList *TPL) {
2621 printTemplateArgumentList(OS, Args.
arguments(), Policy, TPL);
2624void clang::printTemplateArgumentList(raw_ostream &OS,
2625 ArrayRef<TemplateArgument> Args,
2626 const PrintingPolicy &Policy,
2627 const TemplateParameterList *TPL) {
2628 PrintingPolicy InnerPolicy = Policy;
2630 printTo(OS, Args, InnerPolicy, TPL,
false, 0);
2633void clang::printTemplateArgumentList(raw_ostream &OS,
2634 ArrayRef<TemplateArgumentLoc> Args,
2635 const PrintingPolicy &Policy,
2636 const TemplateParameterList *TPL) {
2637 PrintingPolicy InnerPolicy = Policy;
2639 printTo(OS, Args, InnerPolicy, TPL,
false, 0);
2649 llvm::raw_svector_ostream StrOS(Buf);
2651 return StrOS.str().str();
2679 llvm::raw_svector_ostream StrOS(Buf);
2680 print(StrOS, Policy);
2681 return std::string(StrOS.str());
2699 PointerAuth && !PointerAuth.isEmptyWhenPrinted(Policy))
2716 return "__constant";
2723 return "__global_device";
2726 return "__global_host";
2728 return "[[clang::sycl_global]]";
2730 return "[[clang::sycl_local]]";
2732 return "[[clang::sycl_private]]";
2734 return "[[clang::sycl_generic]]";
2736 return "[[clang::sycl_constant]]";
2738 return "__device__";
2740 return "__constant__";
2742 return "__shared__";
2744 return "__sptr __ptr32";
2746 return "__uptr __ptr32";
2750 return "groupshared";
2752 return "hlsl_constant";
2754 return "hlsl_private";
2756 return "hlsl_device";
2758 return "hlsl_input";
2760 return "hlsl_output";
2762 return "hlsl_push_constant";
2766 return "amdgpu_barrier";
2776 bool appendSpaceIfNonEmpty)
const {
2777 bool addSpace =
false;
2787 OS <<
"__unaligned";
2791 if (!ASStr.empty()) {
2797 OS <<
"__attribute__((address_space(" << ASStr <<
")))";
2836 PointerAuth.print(OS, Policy);
2839 if (appendSpaceIfNonEmpty && addSpace)
2861 const Twine &PlaceHolder,
unsigned Indentation)
const {
2868 const Twine &PlaceHolder,
unsigned Indentation) {
2870 StringRef PH = PlaceHolder.toStringRef(PHBuf);
2872 TypePrinter(policy, Indentation).print(ty, qs, OS, PH);
2882 std::string &buffer,
2885 llvm::raw_svector_ostream StrOS(Buf);
2886 TypePrinter(policy).print(ty, qs, StrOS, buffer);
2887 std::string str = std::string(StrOS.str());
Defines the clang::ASTContext interface.
Provides definitions for the various language-specific address spaces.
Defines the clang::attr::Kind enum.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
static void print(llvm::raw_ostream &OS, const T &V, const Context &Ctx, QualType Ty)
#define CC_VLS_CASE(ABI_VLEN)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
Defines the clang::SourceLocation class and associated facilities.
Defines the SourceManager interface.
Defines various enumerations that describe declaration and type specifiers.
static void printHLSLMatrixBefore(TypePrinter &TP, const ConstantMatrixType *T, raw_ostream &OS)
static void printTo(raw_ostream &OS, ArrayRef< TA > Args, const PrintingPolicy &Policy, const TemplateParameterList *TPL, bool IsPack, unsigned ParmIndex)
static const TemplateArgument & getArgument(const TemplateArgument &A)
static bool isSubstitutedType(ASTContext &Ctx, QualType T, QualType Pattern, ArrayRef< TemplateArgument > Args, unsigned Depth)
static void printArgument(const TemplateArgument &A, const PrintingPolicy &PP, llvm::raw_ostream &OS, bool IncludeType)
static QualType skipTopLevelReferences(QualType T)
static void printClangMatrixBefore(TypePrinter &TP, const ConstantMatrixType *T, raw_ostream &OS)
static void printDims(const ConstantMatrixType *T, raw_ostream &OS)
static void printHLSLMatrixAfter(const ConstantMatrixType *T, raw_ostream &OS)
static void printCountAttributedImpl(const CountAttributedType *T, raw_ostream &OS, const PrintingPolicy &Policy)
static SplitQualType splitAccordingToPolicy(QualType QT, const PrintingPolicy &Policy)
static bool isSubstitutedTemplateArgument(ASTContext &Ctx, TemplateArgument Arg, TemplateArgument Pattern, ArrayRef< TemplateArgument > Args, unsigned Depth)
static void AppendTypeQualList(raw_ostream &OS, unsigned TypeQuals, bool HasRestrictKeyword)
static bool templateArgumentExpressionsEqual(ASTContext const &Ctx, TemplateArgument const &Pattern, TemplateArgument const &Arg)
Evaluates the expression template argument 'Pattern' and returns true if 'Arg' evaluates to the same ...
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const
Retrieve the "canonical" template argument.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
Represents a concrete matrix type with constant number of rows and columns.
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
This represents one expression.
bool isIntegerConstantExpr(const ASTContext &Ctx) const
bool isValueDependent() const
Determines whether the value of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
unsigned getNumParams() const
void printExceptionSpecification(raw_ostream &OS, const PrintingPolicy &Policy) const
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
Qualifiers getMethodQuals() const
QualType getParamType(unsigned i) const
FunctionEffectsRef getFunctionEffects() const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
QualType getExceptionType(unsigned i) const
Return the ith exception type, where 0 <= i < getNumExceptions().
bool hasCFIUncheckedCallee() const
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.
CallingConv getCC() const
bool getCmseNSCall() const
bool getNoCfCheck() const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
bool getProducesResult() const
ExtInfo getExtInfo() const
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
@ SME_AgnosticZAStateMask
static ArmStateValue getArmZT0State(unsigned AttrBits)
static ArmStateValue getArmZAState(unsigned AttrBits)
QualType getReturnType() const
StringRef getName() const
Return the actual identifier string.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
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.
void printNestedNameSpecifier(raw_ostream &OS) const
Print only the nested name specifier part of a fully-qualified name, including the '::' at the end.
Pointer-authentication qualifiers.
bool isAddressDiscriminated() const
unsigned getExtraDiscriminator() const
void print(raw_ostream &OS, const PrintingPolicy &Policy) const
bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const
std::string getAsString() const
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
QualType getCanonicalType() const
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
std::string getAsString() const
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
bool hasUnaligned() const
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool appendSpaceIfNonEmpty=false) const
bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const
PointerAuthQualifier getPointerAuth() const
ObjCLifetime getObjCLifetime() const
std::string getAsString() const
LangAS getAddressSpace() const
static std::string getAddrSpaceAsString(LangAS AS)
Base for LValueReferenceType and RValueReferenceType.
StringRef getKindName() const
TypedefNameDecl * getTypedefNameForAnonDecl() const
void printName(raw_ostream &OS, const PrintingPolicy &Policy) const override
Pretty-print the unqualified name of this declaration.
ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
TypeSourceInfo * getTypeSourceInfo() const
Represents a template argument.
ArrayRef< TemplateArgument > getPackAsArray() const
Return the array of arguments in this template argument pack.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
bool structurallyEquals(const TemplateArgument &Other) const
Determines whether two template arguments are superficially the same.
void print(const PrintingPolicy &Policy, raw_ostream &Out, bool IncludeType) const
Print this template argument to the given output stream.
ArgKind
The kind of template argument we're storing.
@ Template
The template argument is a template name that was provided for a template template parameter.
@ Pack
The template argument is actually a parameter pack.
@ Type
The template argument is a type.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
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.
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.
ArrayRef< TemplateArgument > getInjectedTemplateArgs(const ASTContext &Context)
Get the template argument list of the template parameter list.
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
unsigned getIndex() const
Retrieve the index of the template parameter.
const TypeConstraint * getTypeConstraint() const
Returns the type constraint associated with this template parameter (if any).
unsigned getDepth() const
Retrieve the depth of the template parameter.
QualType getType() const
Return the type wrapped by this type source info.
The base class of the type hierarchy.
QualType getLocallyUnqualifiedSingleStepDesugaredType() const
Pull a single level of sugar off of this locally-unqualified type.
const T * castAs() const
Member-template castAs<specific type>.
bool isObjCQualifiedIdType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isObjCIdType() const
bool isSpecifierType() const
Returns true if this type can be represented by some set of type specifiers.
bool isFunctionType() const
bool isObjCQualifiedClassType() const
bool isObjCClassType() const
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
TypeClass getTypeClass() const
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
const T * getAs() const
Member-template getAs<specific type>'.
const internal::VariadicAllOfMatcher< Attr > attr
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
Top level wrappers for InstallAPI frontend operations.
bool isa(CodeGen::Address addr)
llvm::StringRef getParameterABISpelling(ParameterABI kind)
bool isTargetAddressSpace(LangAS AS)
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
bool isRVVFixedLengthVectorKind(VectorKind VK)
True if VK is one of the RVV fixed-length data or mask vector kinds.
unsigned toTargetAddressSpace(LangAS AS)
unsigned getRVVFixedLengthMaskSubByteLanes(VectorKind VK)
Return the number of lanes (1, 2 or 4) of an RVV fixed-length mask vector kind that fits in less than...
ParameterABI
Kinds of parameter ABI.
@ SwiftAsyncContext
This parameter (which must have pointer type) uses the special Swift asynchronous context-pointer ABI...
@ SwiftErrorResult
This parameter (which must have pointer-to-pointer type) uses the special Swift error-result ABI trea...
@ Ordinary
This parameter uses ordinary ABI rules for its type.
@ SwiftIndirectResult
This parameter (which must have pointer type) is a Swift indirect result parameter.
@ SwiftContext
This parameter (which must have pointer type) uses the special Swift context-pointer ABI treatment.
const FunctionProtoType * T
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType)
@ Keyword
The name has been typo-corrected to a keyword.
@ Concept
The name was classified as a concept name.
LangAS
Defines the address space values used by the address space qualifier of QualType.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
llvm::StringRef getAsString(SyncScope S)
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ConceptReference *C)
Insertion operator for diagnostics.
U cast(CodeGen::Address addr)
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_MSAny
Microsoft throw(...) extension.
bool isRVVFixedLengthMaskVectorKind(VectorKind VK)
True if VK is one of the RVV fixed-length mask vector kinds, i.e.
ArrayRef< TemplateArgumentLoc > arguments() const
static StringRef getKeywordName(ElaboratedTypeKeyword Keyword)
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressDefaultTemplateArgs
When true, attempt to suppress template arguments that match the default argument for the parameter.
unsigned SplitTemplateClosers
Whether nested templates must be closed like 'a<b<c> >' rather than 'a<b<c>>'.
unsigned UseVoidForZeroParams
Whether we should use '(void)' rather than '()' for a function prototype with zero parameters.
unsigned SuppressSpecifiers
Whether we should suppress printing of the actual specifiers for the given type or declaration.
unsigned SuppressTagKeyword
Whether type printing should skip printing the tag keyword.
unsigned SuppressStrongLifetime
When true, suppress printing of the __strong lifetime qualifier in ARC.
unsigned Restrict
Whether we can use 'restrict' rather than '__restrict'.
unsigned UseHLSLTypes
Whether or not we're printing known HLSL code and should print HLSL sugared types when possible.
unsigned SuppressScope
Suppresses printing of scope specifiers.
unsigned IncludeTagDefinition
When true, include the body of a tag definition.
unsigned ResolveDecltype
Use whitespace and punctuation like MSVC does.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.