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)
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::BTFTagAttributed:
246 case Type::HLSLAttributedResource:
247 case Type::HLSLInlineSpirv:
248 case Type::PredefinedSugar:
249 CanPrefixQualifiers =
true;
252 case Type::ObjCObjectPointer:
257 case Type::VariableArray:
258 case Type::DependentSizedArray:
259 NeedARCStrongQualifier =
true;
262 case Type::ConstantArray:
263 case Type::IncompleteArray:
264 return canPrefixQualifiers(
266 NeedARCStrongQualifier);
270 case Type::ArrayParameter:
272 case Type::BlockPointer:
273 case Type::LValueReference:
274 case Type::RValueReference:
275 case Type::MemberPointer:
276 case Type::DependentAddressSpace:
277 case Type::DependentVector:
278 case Type::DependentSizedExtVector:
280 case Type::ExtVector:
281 case Type::ConstantMatrix:
282 case Type::DependentSizedMatrix:
283 case Type::FunctionProto:
284 case Type::FunctionNoProto:
286 case Type::PackExpansion:
287 case Type::SubstTemplateTypeParm:
288 case Type::MacroQualified:
289 case Type::CountAttributed:
290 CanPrefixQualifiers =
false;
293 case Type::Attributed: {
297 CanPrefixQualifiers = AttrTy->getAttrKind() == attr::AddressSpace;
300 case Type::PackIndexing: {
301 return canPrefixQualifiers(
303 NeedARCStrongQualifier);
307 return CanPrefixQualifiers;
310void TypePrinter::printBefore(QualType
T, raw_ostream &OS) {
315 Qualifiers Quals =
Split.Quals;
316 if (
const auto *Subst = dyn_cast<SubstTemplateTypeParmType>(
Split.Ty))
317 Quals -= QualType(Subst, 0).getQualifiers();
319 printBefore(
Split.Ty, Quals, OS);
324void TypePrinter::printBefore(
const Type *
T,Qualifiers Quals, raw_ostream &OS) {
328 SaveAndRestore PrevPHIsEmpty(HasEmptyPlaceHolder);
332 bool CanPrefixQualifiers =
false;
333 bool NeedARCStrongQualifier =
false;
334 CanPrefixQualifiers = canPrefixQualifiers(
T, NeedARCStrongQualifier);
336 if (CanPrefixQualifiers && !Quals.
empty()) {
337 if (NeedARCStrongQualifier) {
338 IncludeStrongLifetimeRAII Strong(Policy);
339 Quals.
print(OS, Policy,
true);
341 Quals.
print(OS, Policy,
true);
345 bool hasAfterQuals =
false;
346 if (!CanPrefixQualifiers && !Quals.
empty()) {
349 HasEmptyPlaceHolder =
false;
353#define ABSTRACT_TYPE(CLASS, PARENT)
354#define TYPE(CLASS, PARENT) case Type::CLASS: \
355 print##CLASS##Before(cast<CLASS##Type>(T), OS); \
357#include "clang/AST/TypeNodes.inc"
361 if (NeedARCStrongQualifier) {
362 IncludeStrongLifetimeRAII Strong(Policy);
363 Quals.
print(OS, Policy, !PrevPHIsEmpty.get());
365 Quals.
print(OS, Policy, !PrevPHIsEmpty.get());
370void TypePrinter::printAfter(QualType t, raw_ostream &OS) {
372 printAfter(split.
Ty, split.
Quals, OS);
377void TypePrinter::printAfter(
const Type *
T, Qualifiers Quals, raw_ostream &OS) {
379#define ABSTRACT_TYPE(CLASS, PARENT)
380#define TYPE(CLASS, PARENT) case Type::CLASS: \
381 print##CLASS##After(cast<CLASS##Type>(T), OS); \
383#include "clang/AST/TypeNodes.inc"
387void TypePrinter::printBuiltinBefore(
const BuiltinType *
T, raw_ostream &OS) {
388 OS <<
T->getName(Policy);
389 spaceBeforePlaceHolder(OS);
392void TypePrinter::printBuiltinAfter(
const BuiltinType *
T, raw_ostream &OS) {}
394void TypePrinter::printComplexBefore(
const ComplexType *
T, raw_ostream &OS) {
396 printBefore(
T->getElementType(), OS);
399void TypePrinter::printComplexAfter(
const ComplexType *
T, raw_ostream &OS) {
400 printAfter(
T->getElementType(), OS);
403void TypePrinter::printPointerBefore(
const PointerType *
T, raw_ostream &OS) {
404 IncludeStrongLifetimeRAII Strong(Policy);
405 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
414void TypePrinter::printPointerAfter(
const PointerType *
T, raw_ostream &OS) {
415 IncludeStrongLifetimeRAII Strong(Policy);
416 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
424void TypePrinter::printBlockPointerBefore(
const BlockPointerType *
T,
426 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
431void TypePrinter::printBlockPointerAfter(
const BlockPointerType *
T,
433 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
445void TypePrinter::printLValueReferenceBefore(
const LValueReferenceType *
T,
447 IncludeStrongLifetimeRAII Strong(Policy);
448 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
450 printBefore(Inner, OS);
458void TypePrinter::printLValueReferenceAfter(
const LValueReferenceType *
T,
460 IncludeStrongLifetimeRAII Strong(Policy);
461 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
467 printAfter(Inner, OS);
470void TypePrinter::printRValueReferenceBefore(
const RValueReferenceType *
T,
472 IncludeStrongLifetimeRAII Strong(Policy);
473 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
475 printBefore(Inner, OS);
483void TypePrinter::printRValueReferenceAfter(
const RValueReferenceType *
T,
485 IncludeStrongLifetimeRAII Strong(Policy);
486 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
492 printAfter(Inner, OS);
495void TypePrinter::printMemberPointerBefore(
const MemberPointerType *
T,
497 IncludeStrongLifetimeRAII Strong(Policy);
498 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
504 T->getQualifier().print(OS, Policy);
508void TypePrinter::printMemberPointerAfter(
const MemberPointerType *
T,
510 IncludeStrongLifetimeRAII Strong(Policy);
511 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
519void TypePrinter::printConstantArrayBefore(
const ConstantArrayType *
T,
521 IncludeStrongLifetimeRAII Strong(Policy);
522 printBefore(
T->getElementType(), OS);
525void TypePrinter::printConstantArrayAfter(
const ConstantArrayType *
T,
528 if (
T->getIndexTypeQualifiers().hasQualifiers()) {
534 if (
T->getSizeModifier() == ArraySizeModifier::Static)
537 OS <<
T->getZExtSize() <<
']';
538 printAfter(
T->getElementType(), OS);
541void TypePrinter::printIncompleteArrayBefore(
const IncompleteArrayType *
T,
543 IncludeStrongLifetimeRAII Strong(Policy);
544 printBefore(
T->getElementType(), OS);
547void TypePrinter::printIncompleteArrayAfter(
const IncompleteArrayType *
T,
550 printAfter(
T->getElementType(), OS);
553void TypePrinter::printVariableArrayBefore(
const VariableArrayType *
T,
555 IncludeStrongLifetimeRAII Strong(Policy);
556 printBefore(
T->getElementType(), OS);
559void TypePrinter::printVariableArrayAfter(
const VariableArrayType *
T,
562 if (
T->getIndexTypeQualifiers().hasQualifiers()) {
567 if (
T->getSizeModifier() == ArraySizeModifier::Static)
569 else if (
T->getSizeModifier() == ArraySizeModifier::Star)
572 if (
T->getSizeExpr())
573 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
576 printAfter(
T->getElementType(), OS);
579void TypePrinter::printAdjustedBefore(
const AdjustedType *
T, raw_ostream &OS) {
582 printBefore(
T->getAdjustedType(), OS);
585void TypePrinter::printAdjustedAfter(
const AdjustedType *
T, raw_ostream &OS) {
586 printAfter(
T->getAdjustedType(), OS);
589void TypePrinter::printDecayedBefore(
const DecayedType *
T, raw_ostream &OS) {
591 printAdjustedBefore(
T, OS);
594void TypePrinter::printArrayParameterAfter(
const ArrayParameterType *
T,
596 printConstantArrayAfter(
T, OS);
599void TypePrinter::printArrayParameterBefore(
const ArrayParameterType *
T,
601 printConstantArrayBefore(
T, OS);
604void TypePrinter::printDecayedAfter(
const DecayedType *
T, raw_ostream &OS) {
605 printAdjustedAfter(
T, OS);
608void TypePrinter::printDependentSizedArrayBefore(
609 const DependentSizedArrayType *
T,
611 IncludeStrongLifetimeRAII Strong(Policy);
612 printBefore(
T->getElementType(), OS);
615void TypePrinter::printDependentSizedArrayAfter(
616 const DependentSizedArrayType *
T,
619 if (
T->getSizeExpr())
620 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
622 printAfter(
T->getElementType(), OS);
625void TypePrinter::printDependentAddressSpaceBefore(
626 const DependentAddressSpaceType *
T, raw_ostream &OS) {
630void TypePrinter::printDependentAddressSpaceAfter(
631 const DependentAddressSpaceType *
T, raw_ostream &OS) {
632 OS <<
" __attribute__((address_space(";
633 if (
T->getAddrSpaceExpr())
634 T->getAddrSpaceExpr()->printPretty(OS,
nullptr, Policy);
639void TypePrinter::printDependentSizedExtVectorBefore(
640 const DependentSizedExtVectorType *
T,
644 printBefore(
T->getElementType(), OS);
647void TypePrinter::printDependentSizedExtVectorAfter(
648 const DependentSizedExtVectorType *
T,
652 if (
T->getSizeExpr())
653 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
656 OS <<
" __attribute__((ext_vector_type(";
657 if (
T->getSizeExpr())
658 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
661 printAfter(
T->getElementType(), OS);
664void TypePrinter::printVectorBefore(
const VectorType *
T, raw_ostream &OS) {
665 switch (
T->getVectorKind()) {
666 case VectorKind::AltiVecPixel:
667 OS <<
"__vector __pixel ";
669 case VectorKind::AltiVecBool:
670 OS <<
"__vector __bool ";
671 printBefore(
T->getElementType(), OS);
673 case VectorKind::AltiVecVector:
675 printBefore(
T->getElementType(), OS);
677 case VectorKind::Neon:
678 OS <<
"__attribute__((neon_vector_type("
679 <<
T->getNumElements() <<
"))) ";
680 printBefore(
T->getElementType(), OS);
682 case VectorKind::NeonPoly:
683 OS <<
"__attribute__((neon_polyvector_type(" <<
684 T->getNumElements() <<
"))) ";
685 printBefore(
T->getElementType(), OS);
687 case VectorKind::Generic: {
690 OS <<
"__attribute__((__vector_size__("
691 <<
T->getNumElements()
693 print(
T->getElementType(), OS, StringRef());
695 printBefore(
T->getElementType(), OS);
698 case VectorKind::SveFixedLengthData:
699 case VectorKind::SveFixedLengthPredicate:
702 OS <<
"__attribute__((__arm_sve_vector_bits__(";
704 if (
T->getVectorKind() == VectorKind::SveFixedLengthPredicate)
707 OS <<
T->getNumElements() * 8;
709 OS <<
T->getNumElements();
712 print(
T->getElementType(), OS, StringRef());
715 printBefore(
T->getElementType(), OS);
717 case VectorKind::RVVFixedLengthData:
718 case VectorKind::RVVFixedLengthMask:
719 case VectorKind::RVVFixedLengthMask_1:
720 case VectorKind::RVVFixedLengthMask_2:
721 case VectorKind::RVVFixedLengthMask_4:
724 OS <<
"__attribute__((__riscv_rvv_vector_bits__(";
726 OS <<
T->getNumElements();
729 print(
T->getElementType(), OS, StringRef());
732 printBefore(
T->getElementType(), OS);
737void TypePrinter::printVectorAfter(
const VectorType *
T, raw_ostream &OS) {
738 printAfter(
T->getElementType(), OS);
741void TypePrinter::printDependentVectorBefore(
742 const DependentVectorType *
T, raw_ostream &OS) {
743 switch (
T->getVectorKind()) {
744 case VectorKind::AltiVecPixel:
745 OS <<
"__vector __pixel ";
747 case VectorKind::AltiVecBool:
748 OS <<
"__vector __bool ";
749 printBefore(
T->getElementType(), OS);
751 case VectorKind::AltiVecVector:
753 printBefore(
T->getElementType(), OS);
755 case VectorKind::Neon:
756 OS <<
"__attribute__((neon_vector_type(";
757 if (
T->getSizeExpr())
758 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
760 printBefore(
T->getElementType(), OS);
762 case VectorKind::NeonPoly:
763 OS <<
"__attribute__((neon_polyvector_type(";
764 if (
T->getSizeExpr())
765 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
767 printBefore(
T->getElementType(), OS);
769 case VectorKind::Generic: {
772 OS <<
"__attribute__((__vector_size__(";
773 if (
T->getSizeExpr())
774 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
776 print(
T->getElementType(), OS, StringRef());
778 printBefore(
T->getElementType(), OS);
781 case VectorKind::SveFixedLengthData:
782 case VectorKind::SveFixedLengthPredicate:
785 OS <<
"__attribute__((__arm_sve_vector_bits__(";
786 if (
T->getSizeExpr()) {
787 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
788 if (
T->getVectorKind() == VectorKind::SveFixedLengthPredicate)
793 print(
T->getElementType(), OS, StringRef());
798 printBefore(
T->getElementType(), OS);
800 case VectorKind::RVVFixedLengthData:
801 case VectorKind::RVVFixedLengthMask:
802 case VectorKind::RVVFixedLengthMask_1:
803 case VectorKind::RVVFixedLengthMask_2:
804 case VectorKind::RVVFixedLengthMask_4:
807 OS <<
"__attribute__((__riscv_rvv_vector_bits__(";
808 if (
T->getSizeExpr()) {
809 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
811 print(
T->getElementType(), OS, StringRef());
816 printBefore(
T->getElementType(), OS);
821void TypePrinter::printDependentVectorAfter(
822 const DependentVectorType *
T, raw_ostream &OS) {
823 printAfter(
T->getElementType(), OS);
826void TypePrinter::printExtVectorBefore(
const ExtVectorType *
T,
830 printBefore(
T->getElementType(), OS);
833void TypePrinter::printExtVectorAfter(
const ExtVectorType *
T, raw_ostream &OS) {
834 printAfter(
T->getElementType(), OS);
838 OS <<
T->getNumElements();
841 OS <<
" __attribute__((ext_vector_type(";
842 OS <<
T->getNumElements();
848 OS <<
T->getNumRows() <<
", " <<
T->getNumColumns();
854 TP.printBefore(
T->getElementType(), OS);
865 TP.printBefore(
T->getElementType(), OS);
866 OS <<
" __attribute__((matrix_type(";
871void TypePrinter::printConstantMatrixBefore(
const ConstantMatrixType *
T,
880void TypePrinter::printConstantMatrixAfter(
const ConstantMatrixType *
T,
886 printAfter(
T->getElementType(), OS);
889void TypePrinter::printDependentSizedMatrixBefore(
890 const DependentSizedMatrixType *
T, raw_ostream &OS) {
891 printBefore(
T->getElementType(), OS);
892 OS <<
" __attribute__((matrix_type(";
893 if (
T->getRowExpr()) {
894 T->getRowExpr()->printPretty(OS,
nullptr, Policy);
897 if (
T->getColumnExpr()) {
898 T->getColumnExpr()->printPretty(OS,
nullptr, Policy);
903void TypePrinter::printDependentSizedMatrixAfter(
904 const DependentSizedMatrixType *
T, raw_ostream &OS) {
905 printAfter(
T->getElementType(), OS);
925 OS <<
" __attribute__((nothrow))";
941 if (
T->hasTrailingReturn()) {
943 if (!HasEmptyPlaceHolder)
948 printBefore(
T->getReturnType(), OS);
949 if (!PrevPHIsEmpty.get())
957 llvm_unreachable(
"asking for spelling of ordinary parameter ABI");
959 return "swift_context";
961 return "swift_async_context";
963 return "swift_error_result";
965 return "swift_indirect_result";
971 llvm_unreachable(
"bad parameter ABI kind");
977 if (!HasEmptyPlaceHolder)
983 ParamPolicyRAII ParamPolicy(Policy);
984 for (
unsigned i = 0, e =
T->getNumParams(); i != e; ++i) {
987 auto EPI =
T->getExtParameterInfo(i);
988 if (EPI.isConsumed()) OS <<
"__attribute__((ns_consumed)) ";
989 if (EPI.isNoEscape())
990 OS <<
"__attribute__((noescape)) ";
991 auto ABI = EPI.getABI();
999 print(
T->getParamType(i).getNonReferenceType(), OS, StringRef());
1002 }
else if (ABI != ParameterABI::Ordinary)
1024 OS <<
" __arm_streaming_compatible";
1026 OS <<
" __arm_streaming";
1028 OS <<
"__arm_agnostic(\"sme_za_state\")";
1030 OS <<
" __arm_preserves(\"za\")";
1032 OS <<
" __arm_in(\"za\")";
1034 OS <<
" __arm_out(\"za\")";
1036 OS <<
" __arm_inout(\"za\")";
1038 OS <<
" __arm_preserves(\"zt0\")";
1040 OS <<
" __arm_in(\"zt0\")";
1042 OS <<
" __arm_out(\"zt0\")";
1044 OS <<
" __arm_inout(\"zt0\")";
1046 printFunctionAfter(Info, OS);
1066 for (
const auto &CFE : FX) {
1067 OS <<
" __attribute__((" << CFE.Effect.name();
1068 if (
const Expr *E = CFE.Cond.getCondition()) {
1070 E->printPretty(OS,
nullptr, Policy);
1077 OS <<
" __attribute__((cfi_unchecked_callee))";
1086void TypePrinter::printFunctionAfter(
const FunctionType::ExtInfo &Info,
1088 if (!InsideCCAttribute) {
1089 switch (Info.
getCC()) {
1100 OS <<
" __attribute__((stdcall))";
1103 OS <<
" __attribute__((fastcall))";
1106 OS <<
" __attribute__((thiscall))";
1109 OS <<
" __attribute__((vectorcall))";
1112 OS <<
" __attribute__((pascal))";
1115 OS <<
" __attribute__((pcs(\"aapcs\")))";
1118 OS <<
" __attribute__((pcs(\"aapcs-vfp\")))";
1121 OS <<
" __attribute__((aarch64_vector_pcs))";
1124 OS <<
" __attribute__((aarch64_sve_pcs))";
1127 OS <<
" __attribute__((device_kernel))";
1130 OS <<
" __attribute__((intel_ocl_bicc))";
1133 OS <<
" __attribute__((ms_abi))";
1136 OS <<
" __attribute__((sysv_abi))";
1139 OS <<
" __attribute__((regcall))";
1145 OS <<
" __attribute__((swiftcall))";
1148 OS <<
"__attribute__((swiftasynccall))";
1151 OS <<
" __attribute__((preserve_most))";
1154 OS <<
" __attribute__((preserve_all))";
1157 OS <<
" __attribute__((m68k_rtd))";
1160 OS <<
" __attribute__((preserve_none))";
1163 OS <<
"__attribute__((riscv_vector_cc))";
1165#define CC_VLS_CASE(ABI_VLEN) \
1166 case CC_RISCVVLSCall_##ABI_VLEN: \
1167 OS << "__attribute__((riscv_vls_cc" #ABI_VLEN "))"; \
1186 OS <<
" __attribute__((noreturn))";
1188 OS <<
" __attribute__((cmse_nonsecure_call))";
1190 OS <<
" __attribute__((ns_returns_retained))";
1192 OS <<
" __attribute__((regparm ("
1195 OS <<
" __attribute__((no_caller_saved_registers))";
1197 OS <<
" __attribute__((nocf_check))";
1200void TypePrinter::printFunctionNoProtoBefore(
const FunctionNoProtoType *
T,
1203 SaveAndRestore PrevPHIsEmpty(HasEmptyPlaceHolder,
false);
1205 if (!PrevPHIsEmpty.get())
1209void TypePrinter::printFunctionNoProtoAfter(
const FunctionNoProtoType *
T,
1212 if (!HasEmptyPlaceHolder)
1214 SaveAndRestore NonEmptyPH(HasEmptyPlaceHolder,
false);
1221void TypePrinter::printTypeSpec(NamedDecl *D, raw_ostream &OS) {
1231 spaceBeforePlaceHolder(OS);
1234void TypePrinter::printUnresolvedUsingBefore(
const UnresolvedUsingType *
T,
1236 OS << TypeWithKeyword::getKeywordName(
T->getKeyword());
1237 if (
T->getKeyword() != ElaboratedTypeKeyword::None)
1239 auto *D =
T->getDecl();
1243 T->getQualifier().print(OS, Policy);
1246 spaceBeforePlaceHolder(OS);
1249void TypePrinter::printUnresolvedUsingAfter(
const UnresolvedUsingType *
T,
1252void TypePrinter::printUsingBefore(
const UsingType *
T, raw_ostream &OS) {
1253 OS << TypeWithKeyword::getKeywordName(
T->getKeyword());
1254 if (
T->getKeyword() != ElaboratedTypeKeyword::None)
1256 auto *D =
T->getDecl();
1260 T->getQualifier().print(OS, Policy);
1263 spaceBeforePlaceHolder(OS);
1266void TypePrinter::printUsingAfter(
const UsingType *
T, raw_ostream &OS) {}
1268void TypePrinter::printTypedefBefore(
const TypedefType *
T, raw_ostream &OS) {
1269 OS << TypeWithKeyword::getKeywordName(
T->getKeyword());
1270 if (
T->getKeyword() != ElaboratedTypeKeyword::None)
1272 auto *D =
T->getDecl();
1276 T->getQualifier().print(OS, Policy);
1279 spaceBeforePlaceHolder(OS);
1282void TypePrinter::printMacroQualifiedBefore(
const MacroQualifiedType *
T,
1284 StringRef MacroName =
T->getMacroIdentifier()->getName();
1285 OS << MacroName <<
" ";
1289 printBefore(
T->getModifiedType(), OS);
1292void TypePrinter::printMacroQualifiedAfter(
const MacroQualifiedType *
T,
1294 printAfter(
T->getModifiedType(), OS);
1297void TypePrinter::printTypedefAfter(
const TypedefType *
T, raw_ostream &OS) {}
1299void TypePrinter::printTypeOfExprBefore(
const TypeOfExprType *
T,
1301 OS << (
T->getKind() == TypeOfKind::Unqualified ?
"typeof_unqual "
1303 if (
T->getUnderlyingExpr())
1304 T->getUnderlyingExpr()->printPretty(OS,
nullptr, Policy);
1305 spaceBeforePlaceHolder(OS);
1308void TypePrinter::printTypeOfExprAfter(
const TypeOfExprType *
T,
1311void TypePrinter::printTypeOfBefore(
const TypeOfType *
T, raw_ostream &OS) {
1312 OS << (
T->getKind() == TypeOfKind::Unqualified ?
"typeof_unqual("
1314 print(
T->getUnmodifiedType(), OS, StringRef());
1316 spaceBeforePlaceHolder(OS);
1319void TypePrinter::printTypeOfAfter(
const TypeOfType *
T, raw_ostream &OS) {}
1321void TypePrinter::printDecltypeBefore(
const DecltypeType *
T, raw_ostream &OS) {
1323 if (
const Expr *E =
T->getUnderlyingExpr()) {
1324 PrintingPolicy ExprPolicy = Policy;
1326 E->printPretty(OS,
nullptr, ExprPolicy);
1329 spaceBeforePlaceHolder(OS);
1332void TypePrinter::printPackIndexingBefore(
const PackIndexingType *
T,
1334 if (
T->hasSelectedType()) {
1335 OS <<
T->getSelectedType();
1337 OS <<
T->getPattern() <<
"...[";
1338 T->getIndexExpr()->printPretty(OS,
nullptr, Policy);
1341 spaceBeforePlaceHolder(OS);
1344void TypePrinter::printPackIndexingAfter(
const PackIndexingType *
T,
1347void TypePrinter::printDecltypeAfter(
const DecltypeType *
T, raw_ostream &OS) {}
1349void TypePrinter::printUnaryTransformBefore(
const UnaryTransformType *
T,
1351 IncludeStrongLifetimeRAII Strong(Policy);
1353 static llvm::DenseMap<int, const char *> Transformation = {{
1354#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
1355 {UnaryTransformType::Enum, "__" #Trait},
1356#include "clang/Basic/TransformTypeTraits.def"
1358 OS << Transformation[
T->getUTTKind()] <<
'(';
1359 print(
T->getBaseType(), OS, StringRef());
1361 spaceBeforePlaceHolder(OS);
1364void TypePrinter::printUnaryTransformAfter(
const UnaryTransformType *
T,
1367void TypePrinter::printAutoBefore(
const AutoType *
T, raw_ostream &OS) {
1369 if (!
T->getDeducedType().isNull()) {
1370 printBefore(
T->getDeducedType(), OS);
1372 if (
T->isConstrained()) {
1375 T->getTypeConstraintConcept()->getDeclName().print(OS, Policy);
1376 auto Args =
T->getTypeConstraintArguments();
1378 printTemplateArgumentList(
1380 T->getTypeConstraintConcept()->getTemplateParameters());
1383 switch (
T->getKeyword()) {
1384 case AutoTypeKeyword::Auto:
OS <<
"auto";
break;
1385 case AutoTypeKeyword::DecltypeAuto:
OS <<
"decltype(auto)";
break;
1386 case AutoTypeKeyword::GNUAutoType:
OS <<
"__auto_type";
break;
1388 spaceBeforePlaceHolder(OS);
1392void TypePrinter::printAutoAfter(
const AutoType *
T, raw_ostream &OS) {
1394 if (!
T->getDeducedType().isNull())
1395 printAfter(
T->getDeducedType(), OS);
1398void TypePrinter::printDeducedTemplateSpecializationBefore(
1399 const DeducedTemplateSpecializationType *
T, raw_ostream &OS) {
1401 T->getKeyword() != ElaboratedTypeKeyword::None)
1411 ArrayRef<TemplateArgument> Args;
1412 TemplateDecl *DeducedTD =
nullptr;
1413 if (!
T->getDeducedType().isNull()) {
1414 if (
const auto *TST =
1415 dyn_cast<TemplateSpecializationType>(
T->getDeducedType())) {
1416 DeducedTD = TST->getTemplateName().getAsTemplateDecl(
1418 Args = TST->template_arguments();
1423 DeducedTD = CD->getSpecializedTemplate();
1424 Args = CD->getTemplateArgs().asArray();
1438 IncludeStrongLifetimeRAII Strong(Policy);
1439 Name.
print(OS, Policy);
1442 printTemplateArgumentList(OS, Args, Policy,
1446 spaceBeforePlaceHolder(OS);
1449void TypePrinter::printDeducedTemplateSpecializationAfter(
1450 const DeducedTemplateSpecializationType *
T, raw_ostream &OS) {
1452 if (!
T->getDeducedType().isNull())
1453 printAfter(
T->getDeducedType(), OS);
1456void TypePrinter::printAtomicBefore(
const AtomicType *
T, raw_ostream &OS) {
1457 IncludeStrongLifetimeRAII Strong(Policy);
1460 print(
T->getValueType(), OS, StringRef());
1462 spaceBeforePlaceHolder(OS);
1465void TypePrinter::printAtomicAfter(
const AtomicType *
T, raw_ostream &OS) {}
1467void TypePrinter::printPipeBefore(
const PipeType *
T, raw_ostream &OS) {
1468 IncludeStrongLifetimeRAII Strong(Policy);
1470 if (
T->isReadOnly())
1473 OS <<
"write_only ";
1475 print(
T->getElementType(), OS, StringRef());
1476 spaceBeforePlaceHolder(OS);
1479void TypePrinter::printPipeAfter(
const PipeType *
T, raw_ostream &OS) {}
1481void TypePrinter::printBitIntBefore(
const BitIntType *
T, raw_ostream &OS) {
1482 if (
T->isUnsigned())
1484 OS <<
"_BitInt(" <<
T->getNumBits() <<
")";
1485 spaceBeforePlaceHolder(OS);
1488void TypePrinter::printBitIntAfter(
const BitIntType *
T, raw_ostream &OS) {}
1490void TypePrinter::printDependentBitIntBefore(
const DependentBitIntType *
T,
1492 if (
T->isUnsigned())
1495 T->getNumBitsExpr()->printPretty(OS,
nullptr, Policy);
1497 spaceBeforePlaceHolder(OS);
1500void TypePrinter::printDependentBitIntAfter(
const DependentBitIntType *
T,
1503void TypePrinter::printPredefinedSugarBefore(
const PredefinedSugarType *
T,
1505 OS <<
T->getIdentifier()->getName();
1506 spaceBeforePlaceHolder(OS);
1509void TypePrinter::printPredefinedSugarAfter(
const PredefinedSugarType *
T,
1512void TypePrinter::printTagType(
const TagType *
T, raw_ostream &OS) {
1513 TagDecl *D =
T->getDecl();
1516 D->
print(OS, Policy, Indentation);
1517 spaceBeforePlaceHolder(OS);
1521 bool HasKindDecoration =
false;
1525 HasKindDecoration =
true;
1530 OS << TypeWithKeyword::getKeywordName(
T->getKeyword());
1531 if (
T->getKeyword() != ElaboratedTypeKeyword::None)
1536 T->getQualifier().print(OS, Policy);
1547 assert(
Typedef->getIdentifier() &&
"Typedef without identifier?");
1548 OS <<
Typedef->getIdentifier()->getName();
1556 HasKindDecoration =
true;
1567 if (!HasKindDecoration)
1575 llvm::SmallString<1024> WrittenFile(
File);
1577 WrittenFile = Callbacks->remapPath(
File);
1581 llvm::sys::path::Style Style =
1582 llvm::sys::path::is_absolute(WrittenFile)
1583 ? llvm::sys::path::Style::native
1585 ? llvm::sys::path::Style::windows_backslash
1586 : llvm::sys::path::Style::posix);
1587 llvm::sys::path::native(WrittenFile, Style);
1597 if (
auto *S = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
1598 const TemplateParameterList *TParams =
1599 S->getSpecializedTemplate()->getTemplateParameters();
1600 const ASTTemplateArgumentListInfo *TArgAsWritten =
1601 S->getTemplateArgsAsWritten();
1602 IncludeStrongLifetimeRAII Strong(Policy);
1604 printTemplateArgumentList(OS, TArgAsWritten->
arguments(), Policy,
1607 printTemplateArgumentList(OS, S->getTemplateArgs().asArray(), Policy,
1611 spaceBeforePlaceHolder(OS);
1614void TypePrinter::printRecordBefore(
const RecordType *
T, raw_ostream &OS) {
1617 for (
const auto *PNA :
T->getDecl()
1618 ->getMostRecentDecl()
1619 ->specific_attrs<PreferredNameAttr>()) {
1624 QualType
T = PNA->getTypedefType();
1626 if (
auto *TT = dyn_cast<TypedefType>(
T))
1627 return printTypeSpec(TT->getDecl(), OS);
1628 if (
auto *TST = dyn_cast<TemplateSpecializationType>(
T))
1629 return printTemplateId(TST, OS,
true);
1635 printTagType(
T, OS);
1638void TypePrinter::printRecordAfter(
const RecordType *
T, raw_ostream &OS) {}
1640void TypePrinter::printEnumBefore(
const EnumType *
T, raw_ostream &OS) {
1641 printTagType(
T, OS);
1644void TypePrinter::printEnumAfter(
const EnumType *
T, raw_ostream &OS) {}
1646void TypePrinter::printInjectedClassNameBefore(
const InjectedClassNameType *
T,
1648 const ASTContext &Ctx =
T->getDecl()->getASTContext();
1649 IncludeStrongLifetimeRAII Strong(Policy);
1650 T->getTemplateName(Ctx).print(OS, Policy);
1652 auto *
Decl =
T->getDecl();
1655 if (
auto *RD = dyn_cast<ClassTemplateSpecializationDecl>(Decl)) {
1656 printTemplateArgumentList(OS, RD->getTemplateArgsAsWritten()->arguments(),
1658 T->getTemplateDecl()->getTemplateParameters());
1660 ClassTemplateDecl *TD =
Decl->getDescribedClassTemplate();
1662 printTemplateArgumentList(
1664 T->getTemplateDecl()->getTemplateParameters());
1667 spaceBeforePlaceHolder(OS);
1670void TypePrinter::printInjectedClassNameAfter(
const InjectedClassNameType *
T,
1673void TypePrinter::printTemplateTypeParmBefore(
const TemplateTypeParmType *
T,
1675 TemplateTypeParmDecl *D =
T->getDecl();
1678 TC->print(OS, Policy);
1682 }
else if (IdentifierInfo *Id =
T->getIdentifier())
1686 OS <<
"type-parameter-" <<
T->getDepth() <<
'-' <<
T->getIndex();
1688 spaceBeforePlaceHolder(OS);
1691void TypePrinter::printTemplateTypeParmAfter(
const TemplateTypeParmType *
T,
1694void TypePrinter::printSubstTemplateTypeParmBefore(
1695 const SubstTemplateTypeParmType *
T,
1697 IncludeStrongLifetimeRAII Strong(Policy);
1698 printBefore(
T->getReplacementType(), OS);
1701void TypePrinter::printSubstTemplateTypeParmAfter(
1702 const SubstTemplateTypeParmType *
T,
1704 IncludeStrongLifetimeRAII Strong(Policy);
1705 printAfter(
T->getReplacementType(), OS);
1708void TypePrinter::printSubstBuiltinTemplatePackBefore(
1709 const SubstBuiltinTemplatePackType *
T, raw_ostream &OS) {
1710 IncludeStrongLifetimeRAII Strong(Policy);
1714void TypePrinter::printSubstBuiltinTemplatePackAfter(
1715 const SubstBuiltinTemplatePackType *
T, raw_ostream &OS) {}
1717void TypePrinter::printSubstTemplateTypeParmPackBefore(
1718 const SubstTemplateTypeParmPackType *
T,
1720 IncludeStrongLifetimeRAII Strong(Policy);
1721 if (
const TemplateTypeParmDecl *D =
T->getReplacedParameter()) {
1724 TC->print(OS, Policy);
1734 spaceBeforePlaceHolder(OS);
1738void TypePrinter::printSubstTemplateTypeParmPackAfter(
1739 const SubstTemplateTypeParmPackType *
T,
1741 IncludeStrongLifetimeRAII Strong(Policy);
1744void TypePrinter::printTemplateId(
const TemplateSpecializationType *
T,
1745 raw_ostream &OS,
bool FullyQualify) {
1746 IncludeStrongLifetimeRAII Strong(Policy);
1749 K != ElaboratedTypeKeyword::None)
1750 OS << TypeWithKeyword::getKeywordName(K) <<
' ';
1753 T->getTemplateName().getAsTemplateDecl(
true);
1755 if (FullyQualify && TD) {
1761 T->getTemplateName().print(OS, Policy,
1763 ? TemplateName::Qualified::AsWritten
1764 : TemplateName::Qualified::None);
1767 DefaultTemplateArgsPolicyRAII TemplateArgs(Policy);
1769 printTemplateArgumentList(OS,
T->template_arguments(), Policy, TPL);
1770 spaceBeforePlaceHolder(OS);
1773void TypePrinter::printTemplateSpecializationBefore(
1774 const TemplateSpecializationType *
T,
1779void TypePrinter::printTemplateSpecializationAfter(
1780 const TemplateSpecializationType *
T,
1783void TypePrinter::printParenBefore(
const ParenType *
T, raw_ostream &OS) {
1785 printBefore(
T->getInnerType(), OS);
1788 printBefore(
T->getInnerType(), OS);
1791void TypePrinter::printParenAfter(
const ParenType *
T, raw_ostream &OS) {
1794 printAfter(
T->getInnerType(), OS);
1796 printAfter(
T->getInnerType(), OS);
1799void TypePrinter::printDependentNameBefore(
const DependentNameType *
T,
1801 OS << TypeWithKeyword::getKeywordName(
T->getKeyword());
1802 if (
T->getKeyword() != ElaboratedTypeKeyword::None)
1804 T->getQualifier().print(OS, Policy);
1805 OS <<
T->getIdentifier()->getName();
1806 spaceBeforePlaceHolder(OS);
1809void TypePrinter::printDependentNameAfter(
const DependentNameType *
T,
1812void TypePrinter::printPackExpansionBefore(
const PackExpansionType *
T,
1814 printBefore(
T->getPattern(), OS);
1817void TypePrinter::printPackExpansionAfter(
const PackExpansionType *
T,
1819 printAfter(
T->getPattern(), OS);
1827 if (
T->isCountInBytes() &&
T->isOrNull())
1828 OS <<
"__sized_by_or_null(";
1829 else if (
T->isCountInBytes())
1830 OS <<
"__sized_by(";
1831 else if (
T->isOrNull())
1832 OS <<
"__counted_by_or_null(";
1834 OS <<
"__counted_by(";
1835 if (
T->getCountExpr())
1836 T->getCountExpr()->printPretty(OS,
nullptr, Policy);
1840void TypePrinter::printCountAttributedBefore(
const CountAttributedType *
T,
1847void TypePrinter::printCountAttributedAfter(
const CountAttributedType *
T,
1854void TypePrinter::printAttributedBefore(
const AttributedType *
T,
1859 if (
T->getAttrKind() == attr::ObjCGC ||
1860 T->getAttrKind() == attr::ObjCOwnership)
1861 return printBefore(
T->getEquivalentType(), OS);
1863 if (
T->getAttrKind() == attr::ObjCKindOf)
1866 if (
T->getAttrKind() == attr::PreserveNone) {
1867 OS <<
"__attribute__((preserve_none)) ";
1868 spaceBeforePlaceHolder(OS);
1869 }
else if (
T->getAttrKind() == attr::PreserveMost) {
1870 OS <<
"__attribute__((preserve_most)) ";
1871 spaceBeforePlaceHolder(OS);
1872 }
else if (
T->getAttrKind() == attr::PreserveAll) {
1873 OS <<
"__attribute__((preserve_all)) ";
1874 spaceBeforePlaceHolder(OS);
1877 if (
T->getAttrKind() == attr::AddressSpace)
1878 printBefore(
T->getEquivalentType(), OS);
1880 printBefore(
T->getModifiedType(), OS);
1882 if (
T->isMSTypeSpec()) {
1883 switch (
T->getAttrKind()) {
1885 case attr::Ptr32:
OS <<
" __ptr32";
break;
1886 case attr::Ptr64:
OS <<
" __ptr64";
break;
1887 case attr::SPtr:
OS <<
" __sptr";
break;
1888 case attr::UPtr:
OS <<
" __uptr";
break;
1890 spaceBeforePlaceHolder(OS);
1893 if (
T->isWebAssemblyFuncrefSpec())
1897 if (
T->getImmediateNullability()) {
1898 if (
T->getAttrKind() == attr::TypeNonNull)
1900 else if (
T->getAttrKind() == attr::TypeNullable)
1902 else if (
T->getAttrKind() == attr::TypeNullUnspecified)
1903 OS <<
" _Null_unspecified";
1904 else if (
T->getAttrKind() == attr::TypeNullableResult)
1905 OS <<
" _Nullable_result";
1907 llvm_unreachable(
"unhandled nullability");
1908 spaceBeforePlaceHolder(OS);
1912void TypePrinter::printAttributedAfter(
const AttributedType *
T,
1917 if (
T->getAttrKind() == attr::ObjCGC ||
1918 T->getAttrKind() == attr::ObjCOwnership)
1919 return printAfter(
T->getEquivalentType(), OS);
1923 SaveAndRestore MaybeSuppressCC(InsideCCAttribute,
T->isCallingConv());
1925 printAfter(
T->getModifiedType(), OS);
1929 if (
T->getAttrKind() == attr::ObjCKindOf ||
T->isMSTypeSpec() ||
1930 T->getImmediateNullability() ||
T->isWebAssemblyFuncrefSpec())
1934 if (
T->getAttrKind() == attr::ObjCInertUnsafeUnretained)
1938 if (
T->getAttrKind() == attr::NSReturnsRetained &&
1939 !
T->getEquivalentType()->
castAs<FunctionType>()
1940 ->getExtInfo().getProducesResult())
1943 if (
T->getAttrKind() == attr::LifetimeBound) {
1944 OS <<
" [[clang::lifetimebound]]";
1947 if (
T->getAttrKind() == attr::LifetimeCaptureBy) {
1948 OS <<
" [[clang::lifetime_capture_by(";
1949 if (
auto *attr = dyn_cast_or_null<LifetimeCaptureByAttr>(
T->getAttr()))
1950 llvm::interleaveComma(
attr->getArgIdents(), OS,
1951 [&](
auto it) { OS << it->getName(); });
1959 if (
T->getAttrKind() == attr::AddressSpace)
1962 if (
T->getAttrKind() == attr::AnnotateType) {
1967 OS <<
" [[clang::annotate_type(...)]]";
1971 if (
T->getAttrKind() == attr::ArmStreaming) {
1972 OS <<
"__arm_streaming";
1975 if (
T->getAttrKind() == attr::ArmStreamingCompatible) {
1976 OS <<
"__arm_streaming_compatible";
1980 if (
T->getAttrKind() == attr::SwiftAttr) {
1981 if (
auto *swiftAttr = dyn_cast_or_null<SwiftAttrAttr>(
T->getAttr())) {
1982 OS <<
" __attribute__((swift_attr(\"" << swiftAttr->getAttribute()
1988 if (
T->getAttrKind() == attr::PreserveAll ||
1989 T->getAttrKind() == attr::PreserveMost ||
1990 T->getAttrKind() == attr::PreserveNone) {
1995 OS <<
" __attribute__((";
1996 switch (
T->getAttrKind()) {
1997#define TYPE_ATTR(NAME)
1998#define DECL_OR_TYPE_ATTR(NAME)
1999#define ATTR(NAME) case attr::NAME:
2000#include "clang/Basic/AttrList.inc"
2001 llvm_unreachable(
"non-type attribute attached to type");
2003 case attr::BTFTypeTag:
2004 llvm_unreachable(
"BTFTypeTag attribute handled separately");
2006 case attr::HLSLResourceClass:
2008 case attr::HLSLRawBuffer:
2009 case attr::HLSLContainedType:
2010 case attr::HLSLIsCounter:
2011 llvm_unreachable(
"HLSL resource type attributes handled separately");
2013 case attr::OpenCLPrivateAddressSpace:
2014 case attr::OpenCLGlobalAddressSpace:
2015 case attr::OpenCLGlobalDeviceAddressSpace:
2016 case attr::OpenCLGlobalHostAddressSpace:
2017 case attr::OpenCLLocalAddressSpace:
2018 case attr::OpenCLConstantAddressSpace:
2019 case attr::OpenCLGenericAddressSpace:
2020 case attr::HLSLGroupSharedAddressSpace:
2025 case attr::CountedBy:
2026 case attr::CountedByOrNull:
2028 case attr::SizedByOrNull:
2029 case attr::LifetimeBound:
2030 case attr::LifetimeCaptureBy:
2031 case attr::TypeNonNull:
2032 case attr::TypeNullable:
2033 case attr::TypeNullableResult:
2034 case attr::TypeNullUnspecified:
2036 case attr::ObjCInertUnsafeUnretained:
2037 case attr::ObjCKindOf:
2038 case attr::ObjCOwnership:
2043 case attr::PointerAuth:
2044 case attr::AddressSpace:
2045 case attr::CmseNSCall:
2046 case attr::AnnotateType:
2047 case attr::WebAssemblyFuncref:
2048 case attr::ArmAgnostic:
2049 case attr::ArmStreaming:
2050 case attr::ArmStreamingCompatible:
2053 case attr::ArmInOut:
2054 case attr::ArmPreserves:
2055 case attr::NonBlocking:
2056 case attr::NonAllocating:
2057 case attr::Blocking:
2058 case attr::Allocating:
2059 case attr::SwiftAttr:
2060 case attr::PreserveAll:
2061 case attr::PreserveMost:
2062 case attr::PreserveNone:
2063 llvm_unreachable(
"This attribute should have been handled already");
2065 case attr::NSReturnsRetained:
2066 OS <<
"ns_returns_retained";
2071 case attr::AnyX86NoCfCheck:
OS <<
"nocf_check";
break;
2072 case attr::CDecl:
OS <<
"cdecl";
break;
2073 case attr::FastCall:
OS <<
"fastcall";
break;
2074 case attr::StdCall:
OS <<
"stdcall";
break;
2075 case attr::ThisCall:
OS <<
"thiscall";
break;
2076 case attr::SwiftCall:
OS <<
"swiftcall";
break;
2077 case attr::SwiftAsyncCall:
OS <<
"swiftasynccall";
break;
2078 case attr::VectorCall:
OS <<
"vectorcall";
break;
2079 case attr::Pascal:
OS <<
"pascal";
break;
2080 case attr::MSABI:
OS <<
"ms_abi";
break;
2081 case attr::SysVABI:
OS <<
"sysv_abi";
break;
2082 case attr::RegCall:
OS <<
"regcall";
break;
2085 QualType t =
T->getEquivalentType();
2089 "\"aapcs\"" :
"\"aapcs-vfp\"");
2093 case attr::AArch64VectorPcs:
OS <<
"aarch64_vector_pcs";
break;
2094 case attr::AArch64SVEPcs:
OS <<
"aarch64_sve_pcs";
break;
2095 case attr::IntelOclBicc:
2096 OS <<
"inteloclbicc";
2101 case attr::RISCVVectorCC:
2102 OS <<
"riscv_vector_cc";
2104 case attr::RISCVVLSCC:
2105 OS <<
"riscv_vls_cc";
2110 case attr::CFIUncheckedCallee:
2111 OS <<
"cfi_unchecked_callee";
2113 case attr::AcquireHandle:
2114 OS <<
"acquire_handle";
2116 case attr::ArmMveStrictPolymorphism:
2117 OS <<
"__clang_arm_mve_strict_polymorphism";
2119 case attr::ExtVectorType:
2120 OS <<
"ext_vector_type";
2129void TypePrinter::printBTFTagAttributedBefore(
const BTFTagAttributedType *
T,
2131 printBefore(
T->getWrappedType(), OS);
2132 OS <<
" __attribute__((btf_type_tag(\"" <<
T->getAttr()->getBTFTypeTag() <<
"\")))";
2135void TypePrinter::printBTFTagAttributedAfter(
const BTFTagAttributedType *
T,
2137 printAfter(
T->getWrappedType(), OS);
2140void TypePrinter::printHLSLAttributedResourceBefore(
2141 const HLSLAttributedResourceType *
T, raw_ostream &OS) {
2142 printBefore(
T->getWrappedType(), OS);
2145void TypePrinter::printHLSLAttributedResourceAfter(
2146 const HLSLAttributedResourceType *
T, raw_ostream &OS) {
2147 printAfter(
T->getWrappedType(), OS);
2148 const HLSLAttributedResourceType::Attributes &Attrs =
T->getAttrs();
2149 OS <<
" [[hlsl::resource_class("
2150 << HLSLResourceClassAttr::ConvertResourceClassToStr(Attrs.ResourceClass)
2153 OS <<
" [[hlsl::is_rov]]";
2154 if (Attrs.RawBuffer)
2155 OS <<
" [[hlsl::raw_buffer]]";
2156 if (Attrs.IsCounter)
2157 OS <<
" [[hlsl::is_counter]]";
2159 QualType ContainedTy =
T->getContainedType();
2160 if (!ContainedTy.
isNull()) {
2161 OS <<
" [[hlsl::contained_type(";
2162 printBefore(ContainedTy, OS);
2163 printAfter(ContainedTy, OS);
2168void TypePrinter::printHLSLInlineSpirvBefore(
const HLSLInlineSpirvType *
T,
2170 OS <<
"__hlsl_spirv_type<" <<
T->getOpcode();
2172 OS <<
", " <<
T->getSize();
2173 OS <<
", " <<
T->getAlignment();
2175 for (
auto &Operand :
T->getOperands()) {
2176 using SpirvOperandKind = SpirvOperand::SpirvOperandKind;
2180 case SpirvOperandKind::ConstantId: {
2181 QualType ConstantType =
Operand.getResultType();
2182 OS <<
"vk::integral_constant<";
2183 printBefore(ConstantType, OS);
2184 printAfter(ConstantType, OS);
2190 case SpirvOperandKind::Literal:
2191 OS <<
"vk::Literal<vk::integral_constant<uint, ";
2195 case SpirvOperandKind::TypeId: {
2197 printBefore(
Type, OS);
2198 printAfter(
Type, OS);
2202 llvm_unreachable(
"Invalid SpirvOperand kind!");
2210void TypePrinter::printHLSLInlineSpirvAfter(
const HLSLInlineSpirvType *
T,
2215void TypePrinter::printObjCInterfaceBefore(
const ObjCInterfaceType *
T,
2217 OS <<
T->getDecl()->getName();
2218 spaceBeforePlaceHolder(OS);
2221void TypePrinter::printObjCInterfaceAfter(
const ObjCInterfaceType *
T,
2224void TypePrinter::printObjCTypeParamBefore(
const ObjCTypeParamType *
T,
2226 OS <<
T->getDecl()->getName();
2227 if (!
T->qual_empty()) {
2228 bool isFirst =
true;
2230 for (
const auto *I :
T->quals()) {
2240 spaceBeforePlaceHolder(OS);
2243void TypePrinter::printObjCTypeParamAfter(
const ObjCTypeParamType *
T,
2246void TypePrinter::printObjCObjectBefore(
const ObjCObjectType *
T,
2248 if (
T->qual_empty() &&
T->isUnspecializedAsWritten() &&
2249 !
T->isKindOfTypeAsWritten())
2250 return printBefore(
T->getBaseType(), OS);
2252 if (
T->isKindOfTypeAsWritten())
2255 print(
T->getBaseType(), OS, StringRef());
2257 if (
T->isSpecializedAsWritten()) {
2258 bool isFirst =
true;
2260 for (
auto typeArg :
T->getTypeArgsAsWritten()) {
2266 print(typeArg, OS, StringRef());
2271 if (!
T->qual_empty()) {
2272 bool isFirst =
true;
2274 for (
const auto *I :
T->quals()) {
2284 spaceBeforePlaceHolder(OS);
2287void TypePrinter::printObjCObjectAfter(
const ObjCObjectType *
T,
2289 if (
T->qual_empty() &&
T->isUnspecializedAsWritten() &&
2290 !
T->isKindOfTypeAsWritten())
2291 return printAfter(
T->getBaseType(), OS);
2294void TypePrinter::printObjCObjectPointerBefore(
const ObjCObjectPointerType *
T,
2301 if (HasEmptyPlaceHolder)
2307void TypePrinter::printObjCObjectPointerAfter(
const ObjCObjectPointerType *
T,
2318 llvm::raw_ostream &OS,
bool IncludeType) {
2319 A.
print(PP, OS, IncludeType);
2332 TemplateArgument Pattern,
2333 ArrayRef<TemplateArgument> Args,
2342 if (
auto *TTPT = Pattern->
getAsCanonical<TemplateTypeParmType>()) {
2343 if (TTPT->getDepth() == Depth && TTPT->getIndex() < Args.size() &&
2346 Args[TTPT->getIndex()].getAsType(), Pattern.
getQualifiers());
2358 if (TQual != PatQual)
2363 QualType TPointee =
T->getPointeeType();
2375 if (
auto *TTST =
T->getAs<TemplateSpecializationType>()) {
2376 Template = TTST->getTemplateName();
2377 TemplateArgs = TTST->template_arguments();
2378 }
else if (
auto *CTSD = dyn_cast_or_null<ClassTemplateSpecializationDecl>(
2379 T->getAsCXXRecordDecl())) {
2381 TemplateArgs = CTSD->getTemplateArgs().asArray();
2389 if (TemplateArgs.size() != PTST->template_arguments().size())
2391 for (
unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
2393 Ctx, TemplateArgs[I], PTST->template_arguments()[I], Args, Depth))
2444 if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl()))
2445 return NTTP->getDepth() == Depth && Args.size() > NTTP->getIndex() &&
2446 Args[NTTP->getIndex()].structurallyEquals(Arg);
2462 if (
auto *TTPD = dyn_cast_or_null<TemplateTemplateParmDecl>(PatTD))
2463 return TTPD->getDepth() == Depth && Args.size() > TTPD->getIndex() &&
2472bool clang::isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg,
2473 const NamedDecl *Param,
2474 ArrayRef<TemplateArgument> Args,
2480 if (
auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Param)) {
2481 return TTPD->hasDefaultArgument() &&
2483 Ctx, Arg, TTPD->getDefaultArgument().getArgument(), Args, Depth);
2484 }
else if (
auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
2485 return TTPD->hasDefaultArgument() &&
2487 Ctx, Arg, TTPD->getDefaultArgument().getArgument(), Args, Depth);
2488 }
else if (
auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
2489 return NTTPD->hasDefaultArgument() &&
2491 Ctx, Arg, NTTPD->getDefaultArgument().getArgument(), Args,
2497template <
typename TA>
2503 !Args.empty() && !IsPack && Args.size() <= TPL->
size()) {
2505 for (
const TA &A : Args)
2507 while (!Args.empty() &&
getArgument(Args.back()).getIsDefaulted())
2508 Args = Args.drop_back();
2515 bool NeedSpace =
false;
2516 bool FirstArg =
true;
2517 for (
const auto &Arg : Args) {
2520 llvm::raw_svector_ostream ArgOS(Buf);
2533 Policy, TPL, ParmIndex));
2535 StringRef ArgString = ArgOS.str();
2540 if (FirstArg && ArgString.starts_with(
":"))
2547 if (!ArgString.empty()) {
2564void clang::printTemplateArgumentList(raw_ostream &OS,
2565 const TemplateArgumentListInfo &Args,
2566 const PrintingPolicy &Policy,
2567 const TemplateParameterList *TPL) {
2568 printTemplateArgumentList(OS, Args.
arguments(), Policy, TPL);
2571void clang::printTemplateArgumentList(raw_ostream &OS,
2572 ArrayRef<TemplateArgument> Args,
2573 const PrintingPolicy &Policy,
2574 const TemplateParameterList *TPL) {
2575 PrintingPolicy InnerPolicy = Policy;
2577 printTo(OS, Args, InnerPolicy, TPL,
false, 0);
2580void clang::printTemplateArgumentList(raw_ostream &OS,
2581 ArrayRef<TemplateArgumentLoc> Args,
2582 const PrintingPolicy &Policy,
2583 const TemplateParameterList *TPL) {
2584 PrintingPolicy InnerPolicy = Policy;
2586 printTo(OS, Args, InnerPolicy, TPL,
false, 0);
2596 llvm::raw_svector_ostream StrOS(Buf);
2598 return StrOS.str().str();
2626 llvm::raw_svector_ostream StrOS(Buf);
2627 print(StrOS, Policy);
2628 return std::string(StrOS.str());
2646 PointerAuth && !PointerAuth.isEmptyWhenPrinted(Policy))
2666 return "__constant";
2671 return "__global_device";
2674 return "__global_host";
2676 return "__device__";
2678 return "__constant__";
2680 return "__shared__";
2682 return "__sptr __ptr32";
2684 return "__uptr __ptr32";
2688 return "groupshared";
2690 return "hlsl_constant";
2692 return "hlsl_private";
2694 return "hlsl_device";
2696 return "hlsl_input";
2708 bool appendSpaceIfNonEmpty)
const {
2709 bool addSpace =
false;
2719 OS <<
"__unaligned";
2723 if (!ASStr.empty()) {
2729 OS <<
"__attribute__((address_space(" << ASStr <<
")))";
2768 PointerAuth.print(OS, Policy);
2771 if (appendSpaceIfNonEmpty && addSpace)
2793 const Twine &PlaceHolder,
unsigned Indentation)
const {
2800 const Twine &PlaceHolder,
unsigned Indentation) {
2802 StringRef PH = PlaceHolder.toStringRef(PHBuf);
2804 TypePrinter(policy, Indentation).print(ty, qs, OS, PH);
2814 std::string &buffer,
2817 llvm::raw_svector_ostream StrOS(Buf);
2818 TypePrinter(policy).print(ty, qs, StrOS, buffer);
2819 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, ASTContext &ASTCtx, 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 ...
SourceManager & getSourceManager()
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...
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
SourceLocation getLocation() const
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
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
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.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
StringRef getKindName() const
TypedefNameDecl * getTypedefNameForAnonDecl() const
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.
The JSON file list parser is used to communicate input to InstallAPI.
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.
unsigned toTargetAddressSpace(LangAS AS)
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.
@ Type
The name was classified as a type.
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.
ArrayRef< TemplateArgumentLoc > arguments() const
static StringRef getKeywordName(ElaboratedTypeKeyword Keyword)
Describes how types, statements, expressions, and declarations should be printed.
unsigned FullyQualifiedName
When true, print the fully qualified name of function declarations.
unsigned MSVCFormatting
Use whitespace and punctuation like MSVC does.
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 PrintInjectedClassNameWithArguments
Whether to print an InjectedClassNameType with template arguments or as written.
unsigned UseVoidForZeroParams
Whether we should use '(void)' rather than '()' for a function prototype with zero parameters.
unsigned AnonymousTagLocations
When printing an anonymous tag name, also print the location of that entity (e.g.,...
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 SuppressTagKeyword
Whether type printing should skip printing the tag keyword.
unsigned UsePreferredNames
Whether to use C++ template preferred_name attributes when printing templates.
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.
const PrintingCallbacks * Callbacks
Callbacks to use to allow the behavior of printing to be customized.
unsigned IncludeTagDefinition
When true, include the body of a tag definition.
unsigned PrintAsCanonical
Whether to print entities as written or canonically.
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.