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/Casting.h"
41#include "llvm/Support/Compiler.h"
42#include "llvm/Support/ErrorHandling.h"
43#include "llvm/Support/SaveAndRestore.h"
44#include "llvm/Support/raw_ostream.h"
54class IncludeStrongLifetimeRAII {
60 : Policy(Policy), Old(Policy.SuppressStrongLifetime) {
68class ParamPolicyRAII {
74 : Policy(Policy), Old(Policy.SuppressSpecifiers) {
81class DefaultTemplateArgsPolicyRAII {
87 : Policy(Policy), Old(Policy.SuppressDefaultTemplateArgs) {
94class ElaboratedTypePolicyRAII {
96 bool SuppressTagKeyword;
100 explicit ElaboratedTypePolicyRAII(
PrintingPolicy &Policy) : Policy(Policy) {
107 ~ElaboratedTypePolicyRAII() {
115 unsigned Indentation;
116 bool HasEmptyPlaceHolder =
false;
117 bool InsideCCAttribute =
false;
120 explicit TypePrinter(
const PrintingPolicy &Policy,
unsigned Indentation = 0)
121 : Policy(Policy), Indentation(Indentation) {}
124 StringRef PlaceHolder);
127 static bool canPrefixQualifiers(
const Type *
T,
bool &NeedARCStrongQualifier);
128 void spaceBeforePlaceHolder(raw_ostream &OS);
129 void printTypeSpec(
NamedDecl *D, raw_ostream &OS);
133 void printBefore(
QualType T, raw_ostream &OS);
134 void printAfter(
QualType T, raw_ostream &OS);
137 void printTag(
TagDecl *
T, raw_ostream &OS);
139#define ABSTRACT_TYPE(CLASS, PARENT)
140#define TYPE(CLASS, PARENT) \
141 void print##CLASS##Before(const CLASS##Type *T, raw_ostream &OS); \
142 void print##CLASS##After(const CLASS##Type *T, raw_ostream &OS);
143#include "clang/AST/TypeNodes.inc"
153 bool HasRestrictKeyword) {
154 bool appendSpace =
false;
160 if (appendSpace) OS <<
' ';
165 if (appendSpace) OS <<
' ';
166 if (HasRestrictKeyword) {
174void TypePrinter::spaceBeforePlaceHolder(raw_ostream &OS) {
175 if (!HasEmptyPlaceHolder)
186void TypePrinter::print(
QualType t, raw_ostream &OS, StringRef PlaceHolder) {
191void TypePrinter::print(
const Type *
T,
Qualifiers Quals, raw_ostream &OS,
192 StringRef PlaceHolder) {
200 printBefore(
T, Quals, OS);
202 printAfter(
T, Quals, OS);
205bool TypePrinter::canPrefixQualifiers(
const Type *
T,
206 bool &NeedARCStrongQualifier) {
212 bool CanPrefixQualifiers =
false;
213 NeedARCStrongQualifier =
false;
214 const Type *UnderlyingType =
T;
215 if (
const auto *AT = dyn_cast<AutoType>(
T))
216 UnderlyingType = AT->desugar().getTypePtr();
217 if (
const auto *Subst = dyn_cast<SubstTemplateTypeParmType>(
T))
218 UnderlyingType = Subst->getReplacementType().getTypePtr();
225 case Type::UnresolvedUsing:
228 case Type::TypeOfExpr:
231 case Type::UnaryTransform:
234 case Type::Elaborated:
235 case Type::TemplateTypeParm:
236 case Type::SubstTemplateTypeParmPack:
237 case Type::DeducedTemplateSpecialization:
238 case Type::TemplateSpecialization:
239 case Type::InjectedClassName:
240 case Type::DependentName:
241 case Type::DependentTemplateSpecialization:
242 case Type::ObjCObject:
243 case Type::ObjCTypeParam:
244 case Type::ObjCInterface:
248 case Type::DependentBitInt:
249 case Type::BTFTagAttributed:
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(
266 cast<ArrayType>(UnderlyingType)->getElementType().getTypePtr(),
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 CanPrefixQualifiers =
false;
294 case Type::Attributed: {
297 const auto *AttrTy = cast<AttributedType>(UnderlyingType);
298 CanPrefixQualifiers = AttrTy->getAttrKind() == attr::AddressSpace;
301 case Type::PackIndexing: {
302 return canPrefixQualifiers(
303 cast<PackIndexingType>(UnderlyingType)->getPattern().getTypePtr(),
304 NeedARCStrongQualifier);
308 return CanPrefixQualifiers;
311void TypePrinter::printBefore(
QualType T, raw_ostream &OS) {
317 if (
const auto *Subst = dyn_cast<SubstTemplateTypeParmType>(
Split.Ty))
320 printBefore(
Split.Ty, Quals, OS);
325void TypePrinter::printBefore(
const Type *
T,
Qualifiers Quals, raw_ostream &OS) {
333 bool CanPrefixQualifiers =
false;
334 bool NeedARCStrongQualifier =
false;
335 CanPrefixQualifiers = canPrefixQualifiers(
T, NeedARCStrongQualifier);
337 if (CanPrefixQualifiers && !Quals.
empty()) {
338 if (NeedARCStrongQualifier) {
339 IncludeStrongLifetimeRAII Strong(Policy);
340 Quals.
print(OS, Policy,
true);
342 Quals.
print(OS, Policy,
true);
346 bool hasAfterQuals =
false;
347 if (!CanPrefixQualifiers && !Quals.
empty()) {
350 HasEmptyPlaceHolder =
false;
354#define ABSTRACT_TYPE(CLASS, PARENT)
355#define TYPE(CLASS, PARENT) case Type::CLASS: \
356 print##CLASS##Before(cast<CLASS##Type>(T), OS); \
358#include "clang/AST/TypeNodes.inc"
362 if (NeedARCStrongQualifier) {
363 IncludeStrongLifetimeRAII Strong(Policy);
364 Quals.
print(OS, Policy, !PrevPHIsEmpty.get());
366 Quals.
print(OS, Policy, !PrevPHIsEmpty.get());
371void TypePrinter::printAfter(
QualType t, raw_ostream &OS) {
373 printAfter(split.
Ty, split.
Quals, OS);
378void TypePrinter::printAfter(
const Type *
T,
Qualifiers Quals, raw_ostream &OS) {
380#define ABSTRACT_TYPE(CLASS, PARENT)
381#define TYPE(CLASS, PARENT) case Type::CLASS: \
382 print##CLASS##After(cast<CLASS##Type>(T), OS); \
384#include "clang/AST/TypeNodes.inc"
388void TypePrinter::printBuiltinBefore(
const BuiltinType *
T, raw_ostream &OS) {
389 OS <<
T->getName(Policy);
390 spaceBeforePlaceHolder(OS);
393void TypePrinter::printBuiltinAfter(
const BuiltinType *
T, raw_ostream &OS) {}
395void TypePrinter::printComplexBefore(
const ComplexType *
T, raw_ostream &OS) {
397 printBefore(
T->getElementType(), OS);
400void TypePrinter::printComplexAfter(
const ComplexType *
T, raw_ostream &OS) {
401 printAfter(
T->getElementType(), OS);
404void TypePrinter::printPointerBefore(
const PointerType *
T, raw_ostream &OS) {
405 IncludeStrongLifetimeRAII Strong(Policy);
415void TypePrinter::printPointerAfter(
const PointerType *
T, raw_ostream &OS) {
416 IncludeStrongLifetimeRAII Strong(Policy);
448 IncludeStrongLifetimeRAII Strong(Policy);
451 printBefore(Inner, OS);
454 if (isa<ArrayType>(Inner))
461 IncludeStrongLifetimeRAII Strong(Policy);
466 if (isa<ArrayType>(Inner))
468 printAfter(Inner, OS);
473 IncludeStrongLifetimeRAII Strong(Policy);
476 printBefore(Inner, OS);
479 if (isa<ArrayType>(Inner))
486 IncludeStrongLifetimeRAII Strong(Policy);
491 if (isa<ArrayType>(Inner))
493 printAfter(Inner, OS);
498 IncludeStrongLifetimeRAII Strong(Policy);
507 InnerPolicy.IncludeTagDefinition =
false;
508 TypePrinter(InnerPolicy).print(
QualType(
T->getClass(), 0), OS, StringRef());
515 IncludeStrongLifetimeRAII Strong(Policy);
526 IncludeStrongLifetimeRAII Strong(Policy);
527 printBefore(
T->getElementType(), OS);
533 if (
T->getIndexTypeQualifiers().hasQualifiers()) {
539 if (
T->getSizeModifier() == ArraySizeModifier::Static)
542 OS <<
T->getZExtSize() <<
']';
543 printAfter(
T->getElementType(), OS);
548 IncludeStrongLifetimeRAII Strong(Policy);
549 printBefore(
T->getElementType(), OS);
555 printAfter(
T->getElementType(), OS);
560 IncludeStrongLifetimeRAII Strong(Policy);
561 printBefore(
T->getElementType(), OS);
567 if (
T->getIndexTypeQualifiers().hasQualifiers()) {
572 if (
T->getSizeModifier() == ArraySizeModifier::Static)
574 else if (
T->getSizeModifier() == ArraySizeModifier::Star)
577 if (
T->getSizeExpr())
578 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
581 printAfter(
T->getElementType(), OS);
584void TypePrinter::printAdjustedBefore(
const AdjustedType *
T, raw_ostream &OS) {
587 printBefore(
T->getAdjustedType(), OS);
590void TypePrinter::printAdjustedAfter(
const AdjustedType *
T, raw_ostream &OS) {
591 printAfter(
T->getAdjustedType(), OS);
594void TypePrinter::printDecayedBefore(
const DecayedType *
T, raw_ostream &OS) {
596 printAdjustedBefore(
T, OS);
601 printConstantArrayAfter(
T, OS);
606 printConstantArrayBefore(
T, OS);
609void TypePrinter::printDecayedAfter(
const DecayedType *
T, raw_ostream &OS) {
610 printAdjustedAfter(
T, OS);
613void TypePrinter::printDependentSizedArrayBefore(
616 IncludeStrongLifetimeRAII Strong(Policy);
617 printBefore(
T->getElementType(), OS);
620void TypePrinter::printDependentSizedArrayAfter(
624 if (
T->getSizeExpr())
625 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
627 printAfter(
T->getElementType(), OS);
630void TypePrinter::printDependentAddressSpaceBefore(
635void TypePrinter::printDependentAddressSpaceAfter(
637 OS <<
" __attribute__((address_space(";
638 if (
T->getAddrSpaceExpr())
639 T->getAddrSpaceExpr()->printPretty(OS,
nullptr, Policy);
644void TypePrinter::printDependentSizedExtVectorBefore(
647 printBefore(
T->getElementType(), OS);
650void TypePrinter::printDependentSizedExtVectorAfter(
653 OS <<
" __attribute__((ext_vector_type(";
654 if (
T->getSizeExpr())
655 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
657 printAfter(
T->getElementType(), OS);
660void TypePrinter::printVectorBefore(
const VectorType *
T, raw_ostream &OS) {
661 switch (
T->getVectorKind()) {
662 case VectorKind::AltiVecPixel:
663 OS <<
"__vector __pixel ";
665 case VectorKind::AltiVecBool:
666 OS <<
"__vector __bool ";
667 printBefore(
T->getElementType(), OS);
669 case VectorKind::AltiVecVector:
671 printBefore(
T->getElementType(), OS);
673 case VectorKind::Neon:
674 OS <<
"__attribute__((neon_vector_type("
675 <<
T->getNumElements() <<
"))) ";
676 printBefore(
T->getElementType(), OS);
678 case VectorKind::NeonPoly:
679 OS <<
"__attribute__((neon_polyvector_type(" <<
680 T->getNumElements() <<
"))) ";
681 printBefore(
T->getElementType(), OS);
683 case VectorKind::Generic: {
686 OS <<
"__attribute__((__vector_size__("
687 <<
T->getNumElements()
689 print(
T->getElementType(), OS, StringRef());
691 printBefore(
T->getElementType(), OS);
694 case VectorKind::SveFixedLengthData:
695 case VectorKind::SveFixedLengthPredicate:
698 OS <<
"__attribute__((__arm_sve_vector_bits__(";
700 if (
T->getVectorKind() == VectorKind::SveFixedLengthPredicate)
703 OS <<
T->getNumElements() * 8;
705 OS <<
T->getNumElements();
708 print(
T->getElementType(), OS, StringRef());
711 printBefore(
T->getElementType(), OS);
713 case VectorKind::RVVFixedLengthData:
714 case VectorKind::RVVFixedLengthMask:
717 OS <<
"__attribute__((__riscv_rvv_vector_bits__(";
719 OS <<
T->getNumElements();
722 print(
T->getElementType(), OS, StringRef());
725 printBefore(
T->getElementType(), OS);
730void TypePrinter::printVectorAfter(
const VectorType *
T, raw_ostream &OS) {
731 printAfter(
T->getElementType(), OS);
734void TypePrinter::printDependentVectorBefore(
736 switch (
T->getVectorKind()) {
737 case VectorKind::AltiVecPixel:
738 OS <<
"__vector __pixel ";
740 case VectorKind::AltiVecBool:
741 OS <<
"__vector __bool ";
742 printBefore(
T->getElementType(), OS);
744 case VectorKind::AltiVecVector:
746 printBefore(
T->getElementType(), OS);
748 case VectorKind::Neon:
749 OS <<
"__attribute__((neon_vector_type(";
750 if (
T->getSizeExpr())
751 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
753 printBefore(
T->getElementType(), OS);
755 case VectorKind::NeonPoly:
756 OS <<
"__attribute__((neon_polyvector_type(";
757 if (
T->getSizeExpr())
758 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
760 printBefore(
T->getElementType(), OS);
762 case VectorKind::Generic: {
765 OS <<
"__attribute__((__vector_size__(";
766 if (
T->getSizeExpr())
767 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
769 print(
T->getElementType(), OS, StringRef());
771 printBefore(
T->getElementType(), OS);
774 case VectorKind::SveFixedLengthData:
775 case VectorKind::SveFixedLengthPredicate:
778 OS <<
"__attribute__((__arm_sve_vector_bits__(";
779 if (
T->getSizeExpr()) {
780 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
781 if (
T->getVectorKind() == VectorKind::SveFixedLengthPredicate)
786 print(
T->getElementType(), OS, StringRef());
791 printBefore(
T->getElementType(), OS);
793 case VectorKind::RVVFixedLengthData:
794 case VectorKind::RVVFixedLengthMask:
797 OS <<
"__attribute__((__riscv_rvv_vector_bits__(";
798 if (
T->getSizeExpr()) {
799 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
801 print(
T->getElementType(), OS, StringRef());
806 printBefore(
T->getElementType(), OS);
811void TypePrinter::printDependentVectorAfter(
813 printAfter(
T->getElementType(), OS);
818 printBefore(
T->getElementType(), OS);
821void TypePrinter::printExtVectorAfter(
const ExtVectorType *
T, raw_ostream &OS) {
822 printAfter(
T->getElementType(), OS);
823 OS <<
" __attribute__((ext_vector_type(";
824 OS <<
T->getNumElements();
830 printBefore(
T->getElementType(), OS);
831 OS <<
" __attribute__((matrix_type(";
832 OS <<
T->getNumRows() <<
", " <<
T->getNumColumns();
838 printAfter(
T->getElementType(), OS);
841void TypePrinter::printDependentSizedMatrixBefore(
843 printBefore(
T->getElementType(), OS);
844 OS <<
" __attribute__((matrix_type(";
845 if (
T->getRowExpr()) {
846 T->getRowExpr()->printPretty(OS,
nullptr, Policy);
849 if (
T->getColumnExpr()) {
850 T->getColumnExpr()->printPretty(OS,
nullptr, Policy);
855void TypePrinter::printDependentSizedMatrixAfter(
857 printAfter(
T->getElementType(), OS);
877 OS <<
" __attribute__((nothrow))";
895 if (!HasEmptyPlaceHolder)
901 if (!PrevPHIsEmpty.get())
909 llvm_unreachable(
"asking for spelling of ordinary parameter ABI");
911 return "swift_context";
913 return "swift_async_context";
915 return "swift_error_result";
917 return "swift_indirect_result";
919 llvm_unreachable(
"bad parameter ABI kind");
925 if (!HasEmptyPlaceHolder)
931 ParamPolicyRAII ParamPolicy(Policy);
936 if (EPI.isConsumed()) OS <<
"__attribute__((ns_consumed)) ";
937 if (EPI.isNoEscape())
938 OS <<
"__attribute__((noescape)) ";
939 auto ABI = EPI.getABI();
951 }
else if (
T->
getNumParams() == 0 && Policy.UseVoidForZeroParams) {
962 OS <<
" __arm_streaming_compatible";
964 OS <<
" __arm_streaming";
966 OS <<
" __arm_preserves(\"za\")";
968 OS <<
" __arm_in(\"za\")";
970 OS <<
" __arm_out(\"za\")";
972 OS <<
" __arm_inout(\"za\")";
974 OS <<
" __arm_preserves(\"zt0\")";
976 OS <<
" __arm_in(\"zt0\")";
978 OS <<
" __arm_out(\"zt0\")";
980 OS <<
" __arm_inout(\"zt0\")";
982 printFunctionAfter(Info, OS);
1010 if (!InsideCCAttribute) {
1011 switch (Info.
getCC()) {
1022 OS <<
" __attribute__((stdcall))";
1025 OS <<
" __attribute__((fastcall))";
1028 OS <<
" __attribute__((thiscall))";
1031 OS <<
" __attribute__((vectorcall))";
1034 OS <<
" __attribute__((pascal))";
1037 OS <<
" __attribute__((pcs(\"aapcs\")))";
1040 OS <<
" __attribute__((pcs(\"aapcs-vfp\")))";
1043 OS <<
"__attribute__((aarch64_vector_pcs))";
1046 OS <<
"__attribute__((aarch64_sve_pcs))";
1049 OS <<
"__attribute__((amdgpu_kernel))";
1052 OS <<
" __attribute__((intel_ocl_bicc))";
1055 OS <<
" __attribute__((ms_abi))";
1058 OS <<
" __attribute__((sysv_abi))";
1061 OS <<
" __attribute__((regcall))";
1068 OS <<
" __attribute__((swiftcall))";
1071 OS <<
"__attribute__((swiftasynccall))";
1074 OS <<
" __attribute__((preserve_most))";
1077 OS <<
" __attribute__((preserve_all))";
1080 OS <<
" __attribute__((m68k_rtd))";
1083 OS <<
" __attribute__((preserve_none))";
1086 OS <<
"__attribute__((riscv_vector_cc))";
1092 OS <<
" __attribute__((noreturn))";
1094 OS <<
" __attribute__((cmse_nonsecure_call))";
1096 OS <<
" __attribute__((ns_returns_retained))";
1098 OS <<
" __attribute__((regparm ("
1101 OS <<
" __attribute__((no_caller_saved_registers))";
1103 OS <<
" __attribute__((nocf_check))";
1111 if (!PrevPHIsEmpty.get())
1118 if (!HasEmptyPlaceHolder)
1127void TypePrinter::printTypeSpec(
NamedDecl *D, raw_ostream &OS) {
1132 if (!Policy.SuppressScope)
1137 spaceBeforePlaceHolder(OS);
1142 printTypeSpec(
T->getDecl(), OS);
1148void TypePrinter::printUsingBefore(
const UsingType *
T, raw_ostream &OS) {
1158 printTypeSpec(
T->getFoundDecl()->getUnderlyingDecl(), OS);
1161void TypePrinter::printUsingAfter(
const UsingType *
T, raw_ostream &OS) {}
1163void TypePrinter::printTypedefBefore(
const TypedefType *
T, raw_ostream &OS) {
1164 printTypeSpec(
T->getDecl(), OS);
1169 StringRef MacroName =
T->getMacroIdentifier()->getName();
1170 OS << MacroName <<
" ";
1174 printBefore(
T->getModifiedType(), OS);
1179 printAfter(
T->getModifiedType(), OS);
1182void TypePrinter::printTypedefAfter(
const TypedefType *
T, raw_ostream &OS) {}
1188 if (
T->getUnderlyingExpr())
1189 T->getUnderlyingExpr()->printPretty(OS,
nullptr, Policy);
1190 spaceBeforePlaceHolder(OS);
1196void TypePrinter::printTypeOfBefore(
const TypeOfType *
T, raw_ostream &OS) {
1199 print(
T->getUnmodifiedType(), OS, StringRef());
1201 spaceBeforePlaceHolder(OS);
1204void TypePrinter::printTypeOfAfter(
const TypeOfType *
T, raw_ostream &OS) {}
1206void TypePrinter::printDecltypeBefore(
const DecltypeType *
T, raw_ostream &OS) {
1208 if (
T->getUnderlyingExpr())
1209 T->getUnderlyingExpr()->printPretty(OS,
nullptr, Policy);
1211 spaceBeforePlaceHolder(OS);
1216 if (
T->hasSelectedType()) {
1217 OS <<
T->getSelectedType();
1219 OS <<
T->getPattern() <<
"...[";
1220 T->getIndexExpr()->printPretty(OS,
nullptr, Policy);
1223 spaceBeforePlaceHolder(OS);
1229void TypePrinter::printDecltypeAfter(
const DecltypeType *
T, raw_ostream &OS) {}
1233 IncludeStrongLifetimeRAII Strong(Policy);
1235 static llvm::DenseMap<int, const char *> Transformation = {{
1236#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
1237 {UnaryTransformType::Enum, "__" #Trait},
1238#include "clang/Basic/TransformTypeTraits.def"
1240 OS << Transformation[
T->getUTTKind()] <<
'(';
1241 print(
T->getBaseType(), OS, StringRef());
1243 spaceBeforePlaceHolder(OS);
1249void TypePrinter::printAutoBefore(
const AutoType *
T, raw_ostream &OS) {
1251 if (!
T->getDeducedType().isNull()) {
1252 printBefore(
T->getDeducedType(), OS);
1254 if (
T->isConstrained()) {
1257 T->getTypeConstraintConcept()->getDeclName().print(OS, Policy);
1258 auto Args =
T->getTypeConstraintArguments();
1262 T->getTypeConstraintConcept()->getTemplateParameters());
1265 switch (
T->getKeyword()) {
1270 spaceBeforePlaceHolder(OS);
1274void TypePrinter::printAutoAfter(
const AutoType *
T, raw_ostream &OS) {
1276 if (!
T->getDeducedType().isNull())
1277 printAfter(
T->getDeducedType(), OS);
1280void TypePrinter::printDeducedTemplateSpecializationBefore(
1283 if (!
T->getDeducedType().isNull()) {
1284 printBefore(
T->getDeducedType(), OS);
1286 IncludeStrongLifetimeRAII Strong(Policy);
1287 T->getTemplateName().print(OS, Policy);
1288 spaceBeforePlaceHolder(OS);
1292void TypePrinter::printDeducedTemplateSpecializationAfter(
1295 if (!
T->getDeducedType().isNull())
1296 printAfter(
T->getDeducedType(), OS);
1299void TypePrinter::printAtomicBefore(
const AtomicType *
T, raw_ostream &OS) {
1300 IncludeStrongLifetimeRAII Strong(Policy);
1303 print(
T->getValueType(), OS, StringRef());
1305 spaceBeforePlaceHolder(OS);
1308void TypePrinter::printAtomicAfter(
const AtomicType *
T, raw_ostream &OS) {}
1310void TypePrinter::printPipeBefore(
const PipeType *
T, raw_ostream &OS) {
1311 IncludeStrongLifetimeRAII Strong(Policy);
1313 if (
T->isReadOnly())
1316 OS <<
"write_only ";
1318 print(
T->getElementType(), OS, StringRef());
1319 spaceBeforePlaceHolder(OS);
1322void TypePrinter::printPipeAfter(
const PipeType *
T, raw_ostream &OS) {}
1324void TypePrinter::printBitIntBefore(
const BitIntType *
T, raw_ostream &OS) {
1325 if (
T->isUnsigned())
1327 OS <<
"_BitInt(" <<
T->getNumBits() <<
")";
1328 spaceBeforePlaceHolder(OS);
1331void TypePrinter::printBitIntAfter(
const BitIntType *
T, raw_ostream &OS) {}
1335 if (
T->isUnsigned())
1338 T->getNumBitsExpr()->printPretty(OS,
nullptr, Policy);
1340 spaceBeforePlaceHolder(OS);
1347void TypePrinter::AppendScope(
DeclContext *DC, raw_ostream &OS,
1357 if (Policy.Callbacks && Policy.Callbacks->isScopeVisible(DC))
1360 if (
const auto *NS = dyn_cast<NamespaceDecl>(DC)) {
1361 if (Policy.SuppressUnwrittenScope && NS->isAnonymousNamespace())
1362 return AppendScope(DC->
getParent(), OS, NameInScope);
1366 if (Policy.SuppressInlineNamespace && NS->isInline() && NameInScope &&
1367 NS->isRedundantInlineQualifierFor(NameInScope))
1368 return AppendScope(DC->
getParent(), OS, NameInScope);
1370 AppendScope(DC->
getParent(), OS, NS->getDeclName());
1371 if (NS->getIdentifier())
1372 OS << NS->getName() <<
"::";
1374 OS <<
"(anonymous namespace)::";
1375 }
else if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
1376 AppendScope(DC->
getParent(), OS, Spec->getDeclName());
1377 IncludeStrongLifetimeRAII Strong(Policy);
1378 OS << Spec->getIdentifier()->getName();
1381 OS, TemplateArgs.
asArray(), Policy,
1382 Spec->getSpecializedTemplate()->getTemplateParameters());
1384 }
else if (
const auto *Tag = dyn_cast<TagDecl>(DC)) {
1385 AppendScope(DC->
getParent(), OS, Tag->getDeclName());
1387 OS << Typedef->getIdentifier()->getName() <<
"::";
1388 else if (Tag->getIdentifier())
1389 OS << Tag->getIdentifier()->getName() <<
"::";
1393 AppendScope(DC->
getParent(), OS, NameInScope);
1397void TypePrinter::printTag(
TagDecl *D, raw_ostream &OS) {
1398 if (Policy.IncludeTagDefinition) {
1401 D->
print(OS, SubPolicy, Indentation);
1402 spaceBeforePlaceHolder(OS);
1406 bool HasKindDecoration =
false;
1411 HasKindDecoration =
true;
1419 if (!Policy.SuppressScope)
1425 assert(Typedef->getIdentifier() &&
"Typedef without identifier?");
1426 OS << Typedef->getIdentifier()->getName();
1430 OS << (Policy.MSVCFormatting ?
'`' :
'(');
1432 if (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda()) {
1434 HasKindDecoration =
true;
1435 }
else if ((isa<RecordDecl>(D) && cast<RecordDecl>(D)->isAnonymousStructOrUnion())) {
1441 if (Policy.AnonymousTagLocations) {
1445 if (!HasKindDecoration)
1454 if (
auto *Callbacks = Policy.Callbacks)
1455 WrittenFile = Callbacks->remapPath(
File);
1459 llvm::sys::path::Style Style =
1460 llvm::sys::path::is_absolute(WrittenFile)
1461 ? llvm::sys::path::Style::native
1462 : (Policy.MSVCFormatting
1463 ? llvm::sys::path::Style::windows_backslash
1464 : llvm::sys::path::Style::posix);
1465 llvm::sys::path::native(WrittenFile, Style);
1470 OS << (Policy.MSVCFormatting ?
'\'' :
')');
1475 if (
auto *S = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
1477 S->getSpecializedTemplate()->getTemplateParameters();
1479 S->getTemplateArgsAsWritten();
1480 IncludeStrongLifetimeRAII Strong(Policy);
1481 if (TArgAsWritten && !Policy.PrintCanonicalTypes)
1489 spaceBeforePlaceHolder(OS);
1492void TypePrinter::printRecordBefore(
const RecordType *
T, raw_ostream &OS) {
1494 if (Policy.UsePreferredNames) {
1495 for (
const auto *PNA :
T->getDecl()->specific_attrs<PreferredNameAttr>()) {
1502 if (
auto *TT = dyn_cast<TypedefType>(
T))
1503 return printTypeSpec(TT->getDecl(), OS);
1504 if (
auto *TST = dyn_cast<TemplateSpecializationType>(
T))
1505 return printTemplateId(TST, OS,
true);
1511 printTag(
T->getDecl(), OS);
1514void TypePrinter::printRecordAfter(
const RecordType *
T, raw_ostream &OS) {}
1516void TypePrinter::printEnumBefore(
const EnumType *
T, raw_ostream &OS) {
1517 printTag(
T->getDecl(), OS);
1520void TypePrinter::printEnumAfter(
const EnumType *
T, raw_ostream &OS) {}
1527 TC->print(OS, Policy);
1532 OS << (Policy.CleanUglifiedParameters ?
Id->deuglifiedName()
1535 OS <<
"type-parameter-" <<
T->getDepth() <<
'-' <<
T->getIndex();
1537 spaceBeforePlaceHolder(OS);
1543void TypePrinter::printSubstTemplateTypeParmBefore(
1546 IncludeStrongLifetimeRAII Strong(Policy);
1547 printBefore(
T->getReplacementType(), OS);
1550void TypePrinter::printSubstTemplateTypeParmAfter(
1553 IncludeStrongLifetimeRAII Strong(Policy);
1554 printAfter(
T->getReplacementType(), OS);
1557void TypePrinter::printSubstTemplateTypeParmPackBefore(
1560 IncludeStrongLifetimeRAII Strong(Policy);
1564 TC->print(OS, Policy);
1569 OS << (Policy.CleanUglifiedParameters ?
Id->deuglifiedName()
1574 spaceBeforePlaceHolder(OS);
1578void TypePrinter::printSubstTemplateTypeParmPackAfter(
1581 IncludeStrongLifetimeRAII Strong(Policy);
1585 raw_ostream &OS,
bool FullyQualify) {
1586 IncludeStrongLifetimeRAII Strong(Policy);
1588 TemplateDecl *TD =
T->getTemplateName().getAsTemplateDecl();
1590 if (FullyQualify && TD) {
1591 if (!Policy.SuppressScope)
1596 T->getTemplateName().print(OS, Policy);
1599 DefaultTemplateArgsPolicyRAII TemplateArgs(Policy);
1602 spaceBeforePlaceHolder(OS);
1605void TypePrinter::printTemplateSpecializationBefore(
1608 printTemplateId(
T, OS, Policy.FullyQualifiedName);
1611void TypePrinter::printTemplateSpecializationAfter(
1617 if (Policy.PrintInjectedClassNameWithArguments)
1618 return printTemplateSpecializationBefore(
T->getInjectedTST(), OS);
1620 IncludeStrongLifetimeRAII Strong(Policy);
1621 T->getTemplateName().print(OS, Policy);
1622 spaceBeforePlaceHolder(OS);
1630 if (Policy.IncludeTagDefinition &&
T->getOwnedTagDecl()) {
1631 TagDecl *OwnedTagDecl =
T->getOwnedTagDecl();
1632 assert(OwnedTagDecl->
getTypeForDecl() ==
T->getNamedType().getTypePtr() &&
1633 "OwnedTagDecl expected to be a declaration for the type");
1636 OwnedTagDecl->
print(OS, SubPolicy, Indentation);
1637 spaceBeforePlaceHolder(OS);
1641 if (Policy.SuppressElaboration) {
1642 printBefore(
T->getNamedType(), OS);
1647 if (!Policy.IncludeTagDefinition)
1653 if (!Policy.SuppressTagKeyword && Policy.SuppressScope &&
1654 !Policy.SuppressUnwrittenScope) {
1655 bool OldTagKeyword = Policy.SuppressTagKeyword;
1656 bool OldSupressScope = Policy.SuppressScope;
1657 Policy.SuppressTagKeyword =
true;
1658 Policy.SuppressScope =
false;
1659 printBefore(
T->getNamedType(), OS);
1660 Policy.SuppressTagKeyword = OldTagKeyword;
1661 Policy.SuppressScope = OldSupressScope;
1668 ElaboratedTypePolicyRAII PolicyRAII(Policy);
1669 printBefore(
T->getNamedType(), OS);
1674 if (Policy.IncludeTagDefinition &&
T->getOwnedTagDecl())
1677 if (Policy.SuppressElaboration) {
1678 printAfter(
T->getNamedType(), OS);
1682 ElaboratedTypePolicyRAII PolicyRAII(Policy);
1683 printAfter(
T->getNamedType(), OS);
1686void TypePrinter::printParenBefore(
const ParenType *
T, raw_ostream &OS) {
1687 if (!HasEmptyPlaceHolder && !isa<FunctionType>(
T->getInnerType())) {
1688 printBefore(
T->getInnerType(), OS);
1691 printBefore(
T->getInnerType(), OS);
1694void TypePrinter::printParenAfter(
const ParenType *
T, raw_ostream &OS) {
1695 if (!HasEmptyPlaceHolder && !isa<FunctionType>(
T->getInnerType())) {
1697 printAfter(
T->getInnerType(), OS);
1699 printAfter(
T->getInnerType(), OS);
1708 T->getQualifier()->print(OS, Policy);
1710 OS <<
T->getIdentifier()->getName();
1711 spaceBeforePlaceHolder(OS);
1717void TypePrinter::printDependentTemplateSpecializationBefore(
1719 IncludeStrongLifetimeRAII Strong(Policy);
1725 if (
T->getQualifier())
1726 T->getQualifier()->print(OS, Policy);
1727 OS <<
"template " <<
T->getIdentifier()->getName();
1729 spaceBeforePlaceHolder(OS);
1732void TypePrinter::printDependentTemplateSpecializationAfter(
1737 printBefore(
T->getPattern(), OS);
1742 printAfter(
T->getPattern(), OS);
1750 if (
T->isCountInBytes() &&
T->isOrNull())
1751 OS <<
"__sized_by_or_null(";
1752 else if (
T->isCountInBytes())
1753 OS <<
"__sized_by(";
1754 else if (
T->isOrNull())
1755 OS <<
"__counted_by_or_null(";
1757 OS <<
"__counted_by(";
1758 if (
T->getCountExpr())
1759 T->getCountExpr()->printPretty(OS,
nullptr, Policy);
1782 if (
T->getAttrKind() == attr::ObjCGC ||
1783 T->getAttrKind() == attr::ObjCOwnership)
1784 return printBefore(
T->getEquivalentType(), OS);
1786 if (
T->getAttrKind() == attr::ObjCKindOf)
1789 if (
T->getAttrKind() == attr::AddressSpace)
1790 printBefore(
T->getEquivalentType(), OS);
1792 printBefore(
T->getModifiedType(), OS);
1794 if (
T->isMSTypeSpec()) {
1795 switch (
T->getAttrKind()) {
1797 case attr::Ptr32: OS <<
" __ptr32";
break;
1798 case attr::Ptr64: OS <<
" __ptr64";
break;
1799 case attr::SPtr: OS <<
" __sptr";
break;
1800 case attr::UPtr: OS <<
" __uptr";
break;
1802 spaceBeforePlaceHolder(OS);
1805 if (
T->isWebAssemblyFuncrefSpec())
1809 if (
T->getImmediateNullability()) {
1810 if (
T->getAttrKind() == attr::TypeNonNull)
1812 else if (
T->getAttrKind() == attr::TypeNullable)
1814 else if (
T->getAttrKind() == attr::TypeNullUnspecified)
1815 OS <<
" _Null_unspecified";
1816 else if (
T->getAttrKind() == attr::TypeNullableResult)
1817 OS <<
" _Nullable_result";
1819 llvm_unreachable(
"unhandled nullability");
1820 spaceBeforePlaceHolder(OS);
1829 if (
T->getAttrKind() == attr::ObjCGC ||
1830 T->getAttrKind() == attr::ObjCOwnership)
1831 return printAfter(
T->getEquivalentType(), OS);
1835 SaveAndRestore MaybeSuppressCC(InsideCCAttribute,
T->isCallingConv());
1837 printAfter(
T->getModifiedType(), OS);
1841 if (
T->getAttrKind() == attr::ObjCKindOf ||
T->isMSTypeSpec() ||
1842 T->getImmediateNullability() ||
T->isWebAssemblyFuncrefSpec())
1846 if (
T->getAttrKind() == attr::ObjCInertUnsafeUnretained)
1850 if (
T->getAttrKind() == attr::NSReturnsRetained &&
1855 if (
T->getAttrKind() == attr::LifetimeBound) {
1856 OS <<
" [[clang::lifetimebound]]";
1863 if (
T->getAttrKind() == attr::AddressSpace)
1866 if (
T->getAttrKind() == attr::AnnotateType) {
1871 OS <<
" [[clang::annotate_type(...)]]";
1875 if (
T->getAttrKind() == attr::ArmStreaming) {
1876 OS <<
"__arm_streaming";
1879 if (
T->getAttrKind() == attr::ArmStreamingCompatible) {
1880 OS <<
"__arm_streaming_compatible";
1884 OS <<
" __attribute__((";
1885 switch (
T->getAttrKind()) {
1886#define TYPE_ATTR(NAME)
1887#define DECL_OR_TYPE_ATTR(NAME)
1888#define ATTR(NAME) case attr::NAME:
1889#include "clang/Basic/AttrList.inc"
1890 llvm_unreachable(
"non-type attribute attached to type");
1892 case attr::BTFTypeTag:
1893 llvm_unreachable(
"BTFTypeTag attribute handled separately");
1895 case attr::OpenCLPrivateAddressSpace:
1896 case attr::OpenCLGlobalAddressSpace:
1897 case attr::OpenCLGlobalDeviceAddressSpace:
1898 case attr::OpenCLGlobalHostAddressSpace:
1899 case attr::OpenCLLocalAddressSpace:
1900 case attr::OpenCLConstantAddressSpace:
1901 case attr::OpenCLGenericAddressSpace:
1902 case attr::HLSLGroupSharedAddressSpace:
1907 case attr::CountedBy:
1908 case attr::LifetimeBound:
1909 case attr::TypeNonNull:
1910 case attr::TypeNullable:
1911 case attr::TypeNullableResult:
1912 case attr::TypeNullUnspecified:
1914 case attr::ObjCInertUnsafeUnretained:
1915 case attr::ObjCKindOf:
1916 case attr::ObjCOwnership:
1921 case attr::AddressSpace:
1922 case attr::CmseNSCall:
1923 case attr::AnnotateType:
1924 case attr::WebAssemblyFuncref:
1925 case attr::ArmStreaming:
1926 case attr::ArmStreamingCompatible:
1929 case attr::ArmInOut:
1930 case attr::ArmPreserves:
1931 llvm_unreachable(
"This attribute should have been handled already");
1933 case attr::NSReturnsRetained:
1934 OS <<
"ns_returns_retained";
1939 case attr::AnyX86NoCfCheck: OS <<
"nocf_check";
break;
1940 case attr::CDecl: OS <<
"cdecl";
break;
1941 case attr::FastCall: OS <<
"fastcall";
break;
1942 case attr::StdCall: OS <<
"stdcall";
break;
1943 case attr::ThisCall: OS <<
"thiscall";
break;
1944 case attr::SwiftCall: OS <<
"swiftcall";
break;
1945 case attr::SwiftAsyncCall: OS <<
"swiftasynccall";
break;
1946 case attr::VectorCall: OS <<
"vectorcall";
break;
1947 case attr::Pascal: OS <<
"pascal";
break;
1948 case attr::MSABI: OS <<
"ms_abi";
break;
1949 case attr::SysVABI: OS <<
"sysv_abi";
break;
1950 case attr::RegCall: OS <<
"regcall";
break;
1957 "\"aapcs\"" :
"\"aapcs-vfp\"");
1961 case attr::AArch64VectorPcs: OS <<
"aarch64_vector_pcs";
break;
1962 case attr::AArch64SVEPcs: OS <<
"aarch64_sve_pcs";
break;
1963 case attr::AMDGPUKernelCall: OS <<
"amdgpu_kernel";
break;
1964 case attr::IntelOclBicc: OS <<
"inteloclbicc";
break;
1965 case attr::PreserveMost:
1966 OS <<
"preserve_most";
1969 case attr::PreserveAll:
1970 OS <<
"preserve_all";
1975 case attr::PreserveNone:
1976 OS <<
"preserve_none";
1978 case attr::RISCVVectorCC:
1979 OS <<
"riscv_vector_cc";
1984 case attr::AcquireHandle:
1985 OS <<
"acquire_handle";
1987 case attr::ArmMveStrictPolymorphism:
1988 OS <<
"__clang_arm_mve_strict_polymorphism";
1992 case attr::HLSLParamModifier:
2000 printBefore(
T->getWrappedType(), OS);
2001 OS <<
" __attribute__((btf_type_tag(\"" <<
T->getAttr()->getBTFTypeTag() <<
"\")))";
2006 printAfter(
T->getWrappedType(), OS);
2011 OS <<
T->getDecl()->getName();
2012 spaceBeforePlaceHolder(OS);
2020 OS <<
T->getDecl()->getName();
2021 if (!
T->qual_empty()) {
2022 bool isFirst =
true;
2024 for (
const auto *I :
T->quals()) {
2034 spaceBeforePlaceHolder(OS);
2042 if (
T->qual_empty() &&
T->isUnspecializedAsWritten() &&
2043 !
T->isKindOfTypeAsWritten())
2044 return printBefore(
T->getBaseType(), OS);
2046 if (
T->isKindOfTypeAsWritten())
2049 print(
T->getBaseType(), OS, StringRef());
2051 if (
T->isSpecializedAsWritten()) {
2052 bool isFirst =
true;
2054 for (
auto typeArg :
T->getTypeArgsAsWritten()) {
2060 print(typeArg, OS, StringRef());
2065 if (!
T->qual_empty()) {
2066 bool isFirst =
true;
2068 for (
const auto *I :
T->quals()) {
2078 spaceBeforePlaceHolder(OS);
2083 if (
T->qual_empty() &&
T->isUnspecializedAsWritten() &&
2084 !
T->isKindOfTypeAsWritten())
2085 return printAfter(
T->getBaseType(), OS);
2095 if (HasEmptyPlaceHolder)
2112 llvm::raw_ostream &OS,
bool IncludeType) {
2113 A.
print(PP, OS, IncludeType);
2137 if (TTPT->getDepth() == Depth && TTPT->getIndex() < Args.size() &&
2140 Args[TTPT->getIndex()].getAsType(), Pattern.
getQualifiers());
2152 if (TQual != PatQual)
2170 Template = TTST->getTemplateName();
2171 TemplateArgs = TTST->template_arguments();
2172 }
else if (
auto *CTSD = dyn_cast_or_null<ClassTemplateSpecializationDecl>(
2174 Template =
TemplateName(CTSD->getSpecializedTemplate());
2175 TemplateArgs = CTSD->getTemplateArgs().asArray();
2183 if (TemplateArgs.size() != PTST->template_arguments().size())
2185 for (
unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
2187 Ctx, TemplateArgs[I], PTST->template_arguments()[I], Args, Depth))
2238 if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl()))
2239 return NTTP->getDepth() == Depth && Args.size() > NTTP->getIndex() &&
2240 Args[NTTP->getIndex()].structurallyEquals(Arg);
2256 if (
auto *TTPD = dyn_cast_or_null<TemplateTemplateParmDecl>(PatTD))
2257 return TTPD->getDepth() == Depth && Args.size() > TTPD->getIndex() &&
2274 if (
auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Param)) {
2275 return TTPD->hasDefaultArgument() &&
2278 }
else if (
auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
2279 return TTPD->hasDefaultArgument() &&
2281 Ctx, Arg, TTPD->getDefaultArgument().getArgument(), Args, Depth);
2282 }
else if (
auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
2283 return NTTPD->hasDefaultArgument() &&
2290template <
typename TA>
2297 Args.size() <= TPL->
size()) {
2299 for (
const TA &A : Args)
2302 Args = Args.drop_back();
2309 bool NeedSpace =
false;
2310 bool FirstArg =
true;
2311 for (
const auto &Arg : Args) {
2314 llvm::raw_svector_ostream ArgOS(Buf);
2327 Policy, TPL, ParmIndex));
2329 StringRef ArgString = ArgOS.str();
2334 if (FirstArg && ArgString.starts_with(
":"))
2341 if (!ArgString.empty()) {
2369 printTo(OS, Args, Policy, TPL,
false, 0);
2376 printTo(OS, Args, Policy, TPL,
false, 0);
2389 llvm::raw_svector_ostream StrOS(Buf);
2390 print(StrOS, Policy);
2391 return std::string(StrOS.str());
2425 return "__constant";
2430 return "__global_device";
2433 return "__global_host";
2435 return "__device__";
2437 return "__constant__";
2439 return "__shared__";
2441 return "__sptr __ptr32";
2443 return "__uptr __ptr32";
2449 return "groupshared";
2459 bool appendSpaceIfNonEmpty)
const {
2460 bool addSpace =
false;
2470 OS <<
"__unaligned";
2474 if (!ASStr.empty()) {
2480 OS <<
"__attribute__((address_space(" << ASStr <<
")))";
2514 if (appendSpaceIfNonEmpty && addSpace)
2536 const Twine &PlaceHolder,
unsigned Indentation)
const {
2543 const Twine &PlaceHolder,
unsigned Indentation) {
2545 StringRef PH = PlaceHolder.toStringRef(PHBuf);
2547 TypePrinter(policy, Indentation).print(ty, qs, OS, PH);
2557 std::string &buffer,
2560 llvm::raw_svector_ostream StrOS(Buf);
2561 TypePrinter(policy).print(ty, qs, StrOS, buffer);
2562 std::string str = std::string(StrOS.str());
2568 TypePrinter(
LangOptions()).print(S.Ty, S.Quals, OS,
"");
Defines the clang::ASTContext interface.
Provides definitions for the various language-specific address spaces.
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 &, QualType)
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 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 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.
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
Represents a constant array type that does not decay to a pointer when used as a function parameter.
An attributed type is a type to which a type attribute has been applied.
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
A fixed int type of a specified bitwidth.
This class is used for builtin types like 'int'.
Complex values, per C99 6.2.5p11.
Represents the canonical version of C arrays with a specified constant size.
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...
Represents a pointer type decayed from an array or function type.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isTranslationUnit() const
bool isFunctionOrMethod() const
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
SourceLocation getLocation() const
DeclContext * getDeclContext()
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
The name of a declaration.
Represents the type decltype(expr) (C++11).
Represents a C++17 deduced template specialization type.
Represents an extended address space qualifier where the input address space value is dependent.
Represents a qualified type name for which the type name is dependent.
Represents an array type in C++ whose size is a value-dependent expression.
Represents an extended vector type where either the type or size is dependent.
Represents a matrix type where the type and the number of rows and columns is dependent on a template...
Represents a template specialization type whose template cannot be resolved, e.g.
Represents a vector type where either the type or size is dependent.
Represents a type that was referred to using an elaborated type keyword, e.g., struct S,...
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
This represents one expression.
bool isValueDependent() const
Determines whether the value of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) 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...
bool isIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
ExtVectorType - Extended vector type.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
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
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().
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.
A class which abstracts out some details necessary for making a call.
CallingConv getCC() const
bool getCmseNSCall() const
bool getNoCfCheck() const
unsigned getRegParm() const
bool getNoCallerSavedRegs() const
bool getProducesResult() const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
static ArmStateValue getArmZT0State(unsigned AttrBits)
static ArmStateValue getArmZAState(unsigned AttrBits)
QualType getReturnType() const
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
Represents a C array with an unspecified size.
The injected class name of a C++ class template or class template partial specialization.
An lvalue reference type, per C++11 [dcl.ref].
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
A pointer to member type per C++ 8.3.3 - Pointers to members.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Interfaces are the core concept in Objective-C for object oriented design.
Represents a pointer to an Objective C object.
Represents a class type in Objective C.
Represents a type parameter type in Objective C.
Represents a pack expansion of types.
Sugar for parentheses used when specifying types.
PointerType - C99 6.7.5.1 - Pointer Declarators.
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
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
StreamedQualTypeHelper stream(const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) 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
ObjCLifetime getObjCLifetime() const
std::string getAsString() const
LangAS getAddressSpace() const
static std::string getAddrSpaceAsString(LangAS AS)
An rvalue reference type, per C++11 [dcl.ref].
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Base for LValueReferenceType and RValueReferenceType.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
Represents the result of substituting a set of types for a template type parameter pack.
Represents the result of substituting a type for a template type parameter.
Represents the declaration of a struct/union/class/enum.
StringRef getKindName() const
TypedefNameDecl * getTypedefNameForAnonDecl() const
A convenient class for passing around template argument information.
llvm::ArrayRef< TemplateArgumentLoc > arguments() const
A template argument list.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
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.
bool getIsDefaulted() const
If returns 'true', this TemplateArgument corresponds to a default template parameter.
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() const
Retrieve the underlying template declaration that this template name refers to, if known.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
Represents a type template specialization; the template must be a class template, a type alias templa...
Declaration of a template type parameter.
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.
const Type * getTypeForDecl() const
Represents a typeof (or typeof) expression (a C23 feature and GCC extension) or a typeof_unqual expre...
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
QualType getType() const
Return the type wrapped by this type source info.
static StringRef getKeywordName(ElaboratedTypeKeyword Keyword)
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
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
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
Base class for declarations which introduce a typedef-name.
Represents the dependent type named by a dependently-scoped typename using declaration,...
Represents a C array with a specified size that is not an integer-constant-expression.
Represents a GCC generic vector type.
The JSON file list parser is used to communicate input to InstallAPI.
@ GNUAutoType
__auto_type (GNU extension)
@ DecltypeAuto
decltype(auto)
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 (&&).
const StreamingDiagnostic & operator<<(const StreamingDiagnostic &DB, const ASTContext::SectionInfo &Section)
Insertion operator for diagnostics.
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.
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType)
LangAS
Defines the address space values used by the address space qualifier of QualType.
bool isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg, const NamedDecl *Param, ArrayRef< TemplateArgument > Args, unsigned Depth)
Make a best-effort determination of whether the type T can be produced by substituting Args into the ...
const FunctionProtoType * T
void printTemplateArgumentList(raw_ostream &OS, ArrayRef< TemplateArgument > Args, const PrintingPolicy &Policy, const TemplateParameterList *TPL=nullptr)
Print a template argument list, including the '<' and '>' enclosing the template arguments.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
@ None
No keyword precedes the qualified type name.
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_MSAny
Microsoft throw(...) extension.
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
llvm::ArrayRef< TemplateArgumentLoc > arguments() const
Describes how types, statements, expressions, and declarations should be printed.
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 PrintCanonicalTypes
Whether to print types as written or canonically.
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 SuppressScope
Suppresses printing of scope specifiers.
unsigned IncludeTagDefinition
When true, include the body of a tag definition.
unsigned SuppressLifetimeQualifiers
When true, suppress printing of lifetime qualifier in ARC.
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.