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 if (Policy.UseHLSLTypes)
649 printBefore(
T->getElementType(), OS);
652void TypePrinter::printDependentSizedExtVectorAfter(
655 if (Policy.UseHLSLTypes) {
657 if (
T->getSizeExpr())
658 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
661 OS <<
" __attribute__((ext_vector_type(";
662 if (
T->getSizeExpr())
663 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
666 printAfter(
T->getElementType(), OS);
669void TypePrinter::printVectorBefore(
const VectorType *
T, raw_ostream &OS) {
670 switch (
T->getVectorKind()) {
671 case VectorKind::AltiVecPixel:
672 OS <<
"__vector __pixel ";
674 case VectorKind::AltiVecBool:
675 OS <<
"__vector __bool ";
676 printBefore(
T->getElementType(), OS);
678 case VectorKind::AltiVecVector:
680 printBefore(
T->getElementType(), OS);
682 case VectorKind::Neon:
683 OS <<
"__attribute__((neon_vector_type("
684 <<
T->getNumElements() <<
"))) ";
685 printBefore(
T->getElementType(), OS);
687 case VectorKind::NeonPoly:
688 OS <<
"__attribute__((neon_polyvector_type(" <<
689 T->getNumElements() <<
"))) ";
690 printBefore(
T->getElementType(), OS);
692 case VectorKind::Generic: {
695 OS <<
"__attribute__((__vector_size__("
696 <<
T->getNumElements()
698 print(
T->getElementType(), OS, StringRef());
700 printBefore(
T->getElementType(), OS);
703 case VectorKind::SveFixedLengthData:
704 case VectorKind::SveFixedLengthPredicate:
707 OS <<
"__attribute__((__arm_sve_vector_bits__(";
709 if (
T->getVectorKind() == VectorKind::SveFixedLengthPredicate)
712 OS <<
T->getNumElements() * 8;
714 OS <<
T->getNumElements();
717 print(
T->getElementType(), OS, StringRef());
720 printBefore(
T->getElementType(), OS);
722 case VectorKind::RVVFixedLengthData:
723 case VectorKind::RVVFixedLengthMask:
726 OS <<
"__attribute__((__riscv_rvv_vector_bits__(";
728 OS <<
T->getNumElements();
731 print(
T->getElementType(), OS, StringRef());
734 printBefore(
T->getElementType(), OS);
739void TypePrinter::printVectorAfter(
const VectorType *
T, raw_ostream &OS) {
740 printAfter(
T->getElementType(), OS);
743void TypePrinter::printDependentVectorBefore(
745 switch (
T->getVectorKind()) {
746 case VectorKind::AltiVecPixel:
747 OS <<
"__vector __pixel ";
749 case VectorKind::AltiVecBool:
750 OS <<
"__vector __bool ";
751 printBefore(
T->getElementType(), OS);
753 case VectorKind::AltiVecVector:
755 printBefore(
T->getElementType(), OS);
757 case VectorKind::Neon:
758 OS <<
"__attribute__((neon_vector_type(";
759 if (
T->getSizeExpr())
760 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
762 printBefore(
T->getElementType(), OS);
764 case VectorKind::NeonPoly:
765 OS <<
"__attribute__((neon_polyvector_type(";
766 if (
T->getSizeExpr())
767 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
769 printBefore(
T->getElementType(), OS);
771 case VectorKind::Generic: {
774 OS <<
"__attribute__((__vector_size__(";
775 if (
T->getSizeExpr())
776 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
778 print(
T->getElementType(), OS, StringRef());
780 printBefore(
T->getElementType(), OS);
783 case VectorKind::SveFixedLengthData:
784 case VectorKind::SveFixedLengthPredicate:
787 OS <<
"__attribute__((__arm_sve_vector_bits__(";
788 if (
T->getSizeExpr()) {
789 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
790 if (
T->getVectorKind() == VectorKind::SveFixedLengthPredicate)
795 print(
T->getElementType(), OS, StringRef());
800 printBefore(
T->getElementType(), OS);
802 case VectorKind::RVVFixedLengthData:
803 case VectorKind::RVVFixedLengthMask:
806 OS <<
"__attribute__((__riscv_rvv_vector_bits__(";
807 if (
T->getSizeExpr()) {
808 T->getSizeExpr()->printPretty(OS,
nullptr, Policy);
810 print(
T->getElementType(), OS, StringRef());
815 printBefore(
T->getElementType(), OS);
820void TypePrinter::printDependentVectorAfter(
822 printAfter(
T->getElementType(), OS);
827 if (Policy.UseHLSLTypes)
829 printBefore(
T->getElementType(), OS);
832void TypePrinter::printExtVectorAfter(
const ExtVectorType *
T, raw_ostream &OS) {
833 printAfter(
T->getElementType(), OS);
835 if (Policy.UseHLSLTypes) {
837 OS <<
T->getNumElements();
840 OS <<
" __attribute__((ext_vector_type(";
841 OS <<
T->getNumElements();
848 printBefore(
T->getElementType(), OS);
849 OS <<
" __attribute__((matrix_type(";
850 OS <<
T->getNumRows() <<
", " <<
T->getNumColumns();
856 printAfter(
T->getElementType(), OS);
859void TypePrinter::printDependentSizedMatrixBefore(
861 printBefore(
T->getElementType(), OS);
862 OS <<
" __attribute__((matrix_type(";
863 if (
T->getRowExpr()) {
864 T->getRowExpr()->printPretty(OS,
nullptr, Policy);
867 if (
T->getColumnExpr()) {
868 T->getColumnExpr()->printPretty(OS,
nullptr, Policy);
873void TypePrinter::printDependentSizedMatrixAfter(
875 printAfter(
T->getElementType(), OS);
895 OS <<
" __attribute__((nothrow))";
913 if (!HasEmptyPlaceHolder)
919 if (!PrevPHIsEmpty.get())
927 llvm_unreachable(
"asking for spelling of ordinary parameter ABI");
929 return "swift_context";
931 return "swift_async_context";
933 return "swift_error_result";
935 return "swift_indirect_result";
937 llvm_unreachable(
"bad parameter ABI kind");
943 if (!HasEmptyPlaceHolder)
949 ParamPolicyRAII ParamPolicy(Policy);
954 if (EPI.isConsumed()) OS <<
"__attribute__((ns_consumed)) ";
955 if (EPI.isNoEscape())
956 OS <<
"__attribute__((noescape)) ";
957 auto ABI = EPI.getABI();
969 }
else if (
T->
getNumParams() == 0 && Policy.UseVoidForZeroParams) {
980 OS <<
" __arm_streaming_compatible";
982 OS <<
" __arm_streaming";
984 OS <<
" __arm_preserves(\"za\")";
986 OS <<
" __arm_in(\"za\")";
988 OS <<
" __arm_out(\"za\")";
990 OS <<
" __arm_inout(\"za\")";
992 OS <<
" __arm_preserves(\"zt0\")";
994 OS <<
" __arm_in(\"zt0\")";
996 OS <<
" __arm_out(\"zt0\")";
998 OS <<
" __arm_inout(\"zt0\")";
1000 printFunctionAfter(Info, OS);
1020 for (
const auto &CFE : FX) {
1021 OS <<
" __attribute__((" << CFE.Effect.name();
1022 if (
const Expr *
E = CFE.Cond.getCondition()) {
1039 if (!InsideCCAttribute) {
1040 switch (Info.
getCC()) {
1051 OS <<
" __attribute__((stdcall))";
1054 OS <<
" __attribute__((fastcall))";
1057 OS <<
" __attribute__((thiscall))";
1060 OS <<
" __attribute__((vectorcall))";
1063 OS <<
" __attribute__((pascal))";
1066 OS <<
" __attribute__((pcs(\"aapcs\")))";
1069 OS <<
" __attribute__((pcs(\"aapcs-vfp\")))";
1072 OS <<
"__attribute__((aarch64_vector_pcs))";
1075 OS <<
"__attribute__((aarch64_sve_pcs))";
1078 OS <<
"__attribute__((amdgpu_kernel))";
1081 OS <<
" __attribute__((intel_ocl_bicc))";
1084 OS <<
" __attribute__((ms_abi))";
1087 OS <<
" __attribute__((sysv_abi))";
1090 OS <<
" __attribute__((regcall))";
1097 OS <<
" __attribute__((swiftcall))";
1100 OS <<
"__attribute__((swiftasynccall))";
1103 OS <<
" __attribute__((preserve_most))";
1106 OS <<
" __attribute__((preserve_all))";
1109 OS <<
" __attribute__((m68k_rtd))";
1112 OS <<
" __attribute__((preserve_none))";
1115 OS <<
"__attribute__((riscv_vector_cc))";
1121 OS <<
" __attribute__((noreturn))";
1123 OS <<
" __attribute__((cmse_nonsecure_call))";
1125 OS <<
" __attribute__((ns_returns_retained))";
1127 OS <<
" __attribute__((regparm ("
1130 OS <<
" __attribute__((no_caller_saved_registers))";
1132 OS <<
" __attribute__((nocf_check))";
1140 if (!PrevPHIsEmpty.get())
1147 if (!HasEmptyPlaceHolder)
1156void TypePrinter::printTypeSpec(
NamedDecl *
D, raw_ostream &OS) {
1161 if (!Policy.SuppressScope)
1166 spaceBeforePlaceHolder(OS);
1171 printTypeSpec(
T->getDecl(), OS);
1177void TypePrinter::printUsingBefore(
const UsingType *
T, raw_ostream &OS) {
1187 printTypeSpec(
T->getFoundDecl()->getUnderlyingDecl(), OS);
1190void TypePrinter::printUsingAfter(
const UsingType *
T, raw_ostream &OS) {}
1192void TypePrinter::printTypedefBefore(
const TypedefType *
T, raw_ostream &OS) {
1193 printTypeSpec(
T->getDecl(), OS);
1198 StringRef MacroName =
T->getMacroIdentifier()->getName();
1199 OS << MacroName <<
" ";
1203 printBefore(
T->getModifiedType(), OS);
1208 printAfter(
T->getModifiedType(), OS);
1211void TypePrinter::printTypedefAfter(
const TypedefType *
T, raw_ostream &OS) {}
1217 if (
T->getUnderlyingExpr())
1218 T->getUnderlyingExpr()->printPretty(OS,
nullptr, Policy);
1219 spaceBeforePlaceHolder(OS);
1225void TypePrinter::printTypeOfBefore(
const TypeOfType *
T, raw_ostream &OS) {
1228 print(
T->getUnmodifiedType(), OS, StringRef());
1230 spaceBeforePlaceHolder(OS);
1233void TypePrinter::printTypeOfAfter(
const TypeOfType *
T, raw_ostream &OS) {}
1235void TypePrinter::printDecltypeBefore(
const DecltypeType *
T, raw_ostream &OS) {
1237 if (
T->getUnderlyingExpr())
1238 T->getUnderlyingExpr()->printPretty(OS,
nullptr, Policy);
1240 spaceBeforePlaceHolder(OS);
1245 if (
T->hasSelectedType()) {
1246 OS <<
T->getSelectedType();
1248 OS <<
T->getPattern() <<
"...[";
1249 T->getIndexExpr()->printPretty(OS,
nullptr, Policy);
1252 spaceBeforePlaceHolder(OS);
1258void TypePrinter::printDecltypeAfter(
const DecltypeType *
T, raw_ostream &OS) {}
1262 IncludeStrongLifetimeRAII Strong(Policy);
1264 static llvm::DenseMap<int, const char *> Transformation = {{
1265#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
1266 {UnaryTransformType::Enum, "__" #Trait},
1267#include "clang/Basic/TransformTypeTraits.def"
1269 OS << Transformation[
T->getUTTKind()] <<
'(';
1270 print(
T->getBaseType(), OS, StringRef());
1272 spaceBeforePlaceHolder(OS);
1278void TypePrinter::printAutoBefore(
const AutoType *
T, raw_ostream &OS) {
1280 if (!
T->getDeducedType().isNull()) {
1281 printBefore(
T->getDeducedType(), OS);
1283 if (
T->isConstrained()) {
1286 T->getTypeConstraintConcept()->getDeclName().print(OS, Policy);
1287 auto Args =
T->getTypeConstraintArguments();
1291 T->getTypeConstraintConcept()->getTemplateParameters());
1294 switch (
T->getKeyword()) {
1299 spaceBeforePlaceHolder(OS);
1303void TypePrinter::printAutoAfter(
const AutoType *
T, raw_ostream &OS) {
1305 if (!
T->getDeducedType().isNull())
1306 printAfter(
T->getDeducedType(), OS);
1309void TypePrinter::printDeducedTemplateSpecializationBefore(
1312 if (!
T->getDeducedType().isNull()) {
1313 printBefore(
T->getDeducedType(), OS);
1315 IncludeStrongLifetimeRAII Strong(Policy);
1316 T->getTemplateName().print(OS, Policy);
1317 spaceBeforePlaceHolder(OS);
1321void TypePrinter::printDeducedTemplateSpecializationAfter(
1324 if (!
T->getDeducedType().isNull())
1325 printAfter(
T->getDeducedType(), OS);
1328void TypePrinter::printAtomicBefore(
const AtomicType *
T, raw_ostream &OS) {
1329 IncludeStrongLifetimeRAII Strong(Policy);
1332 print(
T->getValueType(), OS, StringRef());
1334 spaceBeforePlaceHolder(OS);
1337void TypePrinter::printAtomicAfter(
const AtomicType *
T, raw_ostream &OS) {}
1339void TypePrinter::printPipeBefore(
const PipeType *
T, raw_ostream &OS) {
1340 IncludeStrongLifetimeRAII Strong(Policy);
1342 if (
T->isReadOnly())
1345 OS <<
"write_only ";
1347 print(
T->getElementType(), OS, StringRef());
1348 spaceBeforePlaceHolder(OS);
1351void TypePrinter::printPipeAfter(
const PipeType *
T, raw_ostream &OS) {}
1353void TypePrinter::printBitIntBefore(
const BitIntType *
T, raw_ostream &OS) {
1354 if (
T->isUnsigned())
1356 OS <<
"_BitInt(" <<
T->getNumBits() <<
")";
1357 spaceBeforePlaceHolder(OS);
1360void TypePrinter::printBitIntAfter(
const BitIntType *
T, raw_ostream &OS) {}
1364 if (
T->isUnsigned())
1367 T->getNumBitsExpr()->printPretty(OS,
nullptr, Policy);
1369 spaceBeforePlaceHolder(OS);
1376void TypePrinter::AppendScope(
DeclContext *DC, raw_ostream &OS,
1386 if (Policy.Callbacks && Policy.Callbacks->isScopeVisible(DC))
1389 if (
const auto *NS = dyn_cast<NamespaceDecl>(DC)) {
1390 if (Policy.SuppressUnwrittenScope && NS->isAnonymousNamespace())
1391 return AppendScope(DC->
getParent(), OS, NameInScope);
1395 if (Policy.SuppressInlineNamespace && NS->isInline() && NameInScope &&
1396 NS->isRedundantInlineQualifierFor(NameInScope))
1397 return AppendScope(DC->
getParent(), OS, NameInScope);
1399 AppendScope(DC->
getParent(), OS, NS->getDeclName());
1400 if (NS->getIdentifier())
1401 OS << NS->getName() <<
"::";
1403 OS <<
"(anonymous namespace)::";
1404 }
else if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
1405 AppendScope(DC->
getParent(), OS, Spec->getDeclName());
1406 IncludeStrongLifetimeRAII Strong(Policy);
1407 OS << Spec->getIdentifier()->getName();
1410 OS, TemplateArgs.
asArray(), Policy,
1411 Spec->getSpecializedTemplate()->getTemplateParameters());
1413 }
else if (
const auto *Tag = dyn_cast<TagDecl>(DC)) {
1416 OS << Typedef->getIdentifier()->getName() <<
"::";
1417 else if (
Tag->getIdentifier())
1418 OS <<
Tag->getIdentifier()->getName() <<
"::";
1422 AppendScope(DC->
getParent(), OS, NameInScope);
1426void TypePrinter::printTag(
TagDecl *
D, raw_ostream &OS) {
1427 if (Policy.IncludeTagDefinition) {
1430 D->
print(OS, SubPolicy, Indentation);
1431 spaceBeforePlaceHolder(OS);
1435 bool HasKindDecoration =
false;
1439 if (!Policy.SuppressTagKeyword && !
D->getTypedefNameForAnonDecl()) {
1440 HasKindDecoration =
true;
1441 OS <<
D->getKindName();
1448 if (!Policy.SuppressScope)
1454 assert(Typedef->getIdentifier() &&
"Typedef without identifier?");
1455 OS << Typedef->getIdentifier()->getName();
1459 OS << (Policy.MSVCFormatting ?
'`' :
'(');
1461 if (isa<CXXRecordDecl>(
D) && cast<CXXRecordDecl>(
D)->isLambda()) {
1463 HasKindDecoration =
true;
1464 }
else if ((isa<RecordDecl>(
D) && cast<RecordDecl>(
D)->isAnonymousStructOrUnion())) {
1470 if (Policy.AnonymousTagLocations) {
1474 if (!HasKindDecoration)
1475 OS <<
" " <<
D->getKindName();
1483 if (
auto *Callbacks = Policy.Callbacks)
1484 WrittenFile = Callbacks->remapPath(
File);
1488 llvm::sys::path::Style Style =
1489 llvm::sys::path::is_absolute(WrittenFile)
1490 ? llvm::sys::path::Style::native
1491 : (Policy.MSVCFormatting
1492 ? llvm::sys::path::Style::windows_backslash
1493 : llvm::sys::path::Style::posix);
1494 llvm::sys::path::native(WrittenFile, Style);
1499 OS << (Policy.MSVCFormatting ?
'\'' :
')');
1504 if (
auto *S = dyn_cast<ClassTemplateSpecializationDecl>(
D)) {
1506 S->getSpecializedTemplate()->getTemplateParameters();
1508 S->getTemplateArgsAsWritten();
1509 IncludeStrongLifetimeRAII Strong(Policy);
1510 if (TArgAsWritten && !Policy.PrintCanonicalTypes)
1518 spaceBeforePlaceHolder(OS);
1521void TypePrinter::printRecordBefore(
const RecordType *
T, raw_ostream &OS) {
1523 if (Policy.UsePreferredNames) {
1524 for (
const auto *PNA :
T->getDecl()->specific_attrs<PreferredNameAttr>()) {
1531 if (
auto *TT = dyn_cast<TypedefType>(
T))
1532 return printTypeSpec(TT->getDecl(), OS);
1533 if (
auto *TST = dyn_cast<TemplateSpecializationType>(
T))
1534 return printTemplateId(TST, OS,
true);
1540 printTag(
T->getDecl(), OS);
1543void TypePrinter::printRecordAfter(
const RecordType *
T, raw_ostream &OS) {}
1545void TypePrinter::printEnumBefore(
const EnumType *
T, raw_ostream &OS) {
1546 printTag(
T->getDecl(), OS);
1549void TypePrinter::printEnumAfter(
const EnumType *
T, raw_ostream &OS) {}
1555 if (
auto *TC =
D->getTypeConstraint()) {
1556 TC->print(OS, Policy);
1561 OS << (Policy.CleanUglifiedParameters ?
Id->deuglifiedName()
1564 OS <<
"type-parameter-" <<
T->getDepth() <<
'-' <<
T->getIndex();
1566 spaceBeforePlaceHolder(OS);
1572void TypePrinter::printSubstTemplateTypeParmBefore(
1575 IncludeStrongLifetimeRAII Strong(Policy);
1576 printBefore(
T->getReplacementType(), OS);
1579void TypePrinter::printSubstTemplateTypeParmAfter(
1582 IncludeStrongLifetimeRAII Strong(Policy);
1583 printAfter(
T->getReplacementType(), OS);
1586void TypePrinter::printSubstTemplateTypeParmPackBefore(
1589 IncludeStrongLifetimeRAII Strong(Policy);
1592 if (
auto *TC =
D->getTypeConstraint()) {
1593 TC->print(OS, Policy);
1598 OS << (Policy.CleanUglifiedParameters ?
Id->deuglifiedName()
1601 OS <<
"type-parameter-" <<
D->getDepth() <<
'-' <<
D->getIndex();
1603 spaceBeforePlaceHolder(OS);
1607void TypePrinter::printSubstTemplateTypeParmPackAfter(
1610 IncludeStrongLifetimeRAII Strong(Policy);
1614 raw_ostream &OS,
bool FullyQualify) {
1615 IncludeStrongLifetimeRAII Strong(Policy);
1617 TemplateDecl *TD =
T->getTemplateName().getAsTemplateDecl();
1619 if (FullyQualify && TD) {
1620 if (!Policy.SuppressScope)
1628 DefaultTemplateArgsPolicyRAII TemplateArgs(Policy);
1631 spaceBeforePlaceHolder(OS);
1634void TypePrinter::printTemplateSpecializationBefore(
1637 printTemplateId(
T, OS, Policy.FullyQualifiedName);
1640void TypePrinter::printTemplateSpecializationAfter(
1646 if (Policy.PrintInjectedClassNameWithArguments)
1647 return printTemplateSpecializationBefore(
T->getInjectedTST(), OS);
1649 IncludeStrongLifetimeRAII Strong(Policy);
1650 T->getTemplateName().print(OS, Policy);
1651 spaceBeforePlaceHolder(OS);
1659 if (Policy.IncludeTagDefinition &&
T->getOwnedTagDecl()) {
1660 TagDecl *OwnedTagDecl =
T->getOwnedTagDecl();
1661 assert(OwnedTagDecl->
getTypeForDecl() ==
T->getNamedType().getTypePtr() &&
1662 "OwnedTagDecl expected to be a declaration for the type");
1665 OwnedTagDecl->
print(OS, SubPolicy, Indentation);
1666 spaceBeforePlaceHolder(OS);
1670 if (Policy.SuppressElaboration) {
1671 printBefore(
T->getNamedType(), OS);
1676 if (!Policy.IncludeTagDefinition)
1682 if (!Policy.SuppressTagKeyword && Policy.SuppressScope &&
1683 !Policy.SuppressUnwrittenScope) {
1684 bool OldTagKeyword = Policy.SuppressTagKeyword;
1685 bool OldSupressScope = Policy.SuppressScope;
1686 Policy.SuppressTagKeyword =
true;
1687 Policy.SuppressScope =
false;
1688 printBefore(
T->getNamedType(), OS);
1689 Policy.SuppressTagKeyword = OldTagKeyword;
1690 Policy.SuppressScope = OldSupressScope;
1697 ElaboratedTypePolicyRAII PolicyRAII(Policy);
1698 printBefore(
T->getNamedType(), OS);
1703 if (Policy.IncludeTagDefinition &&
T->getOwnedTagDecl())
1706 if (Policy.SuppressElaboration) {
1707 printAfter(
T->getNamedType(), OS);
1711 ElaboratedTypePolicyRAII PolicyRAII(Policy);
1712 printAfter(
T->getNamedType(), OS);
1715void TypePrinter::printParenBefore(
const ParenType *
T, raw_ostream &OS) {
1716 if (!HasEmptyPlaceHolder && !isa<FunctionType>(
T->getInnerType())) {
1717 printBefore(
T->getInnerType(), OS);
1720 printBefore(
T->getInnerType(), OS);
1723void TypePrinter::printParenAfter(
const ParenType *
T, raw_ostream &OS) {
1724 if (!HasEmptyPlaceHolder && !isa<FunctionType>(
T->getInnerType())) {
1726 printAfter(
T->getInnerType(), OS);
1728 printAfter(
T->getInnerType(), OS);
1737 T->getQualifier()->print(OS, Policy);
1739 OS <<
T->getIdentifier()->getName();
1740 spaceBeforePlaceHolder(OS);
1746void TypePrinter::printDependentTemplateSpecializationBefore(
1748 IncludeStrongLifetimeRAII Strong(Policy);
1754 if (
T->getQualifier())
1755 T->getQualifier()->print(OS, Policy);
1756 OS <<
"template " <<
T->getIdentifier()->getName();
1758 spaceBeforePlaceHolder(OS);
1761void TypePrinter::printDependentTemplateSpecializationAfter(
1766 printBefore(
T->getPattern(), OS);
1771 printAfter(
T->getPattern(), OS);
1779 if (
T->isCountInBytes() &&
T->isOrNull())
1780 OS <<
"__sized_by_or_null(";
1781 else if (
T->isCountInBytes())
1782 OS <<
"__sized_by(";
1783 else if (
T->isOrNull())
1784 OS <<
"__counted_by_or_null(";
1786 OS <<
"__counted_by(";
1787 if (
T->getCountExpr())
1788 T->getCountExpr()->printPretty(OS,
nullptr, Policy);
1811 if (
T->getAttrKind() == attr::ObjCGC ||
1812 T->getAttrKind() == attr::ObjCOwnership)
1813 return printBefore(
T->getEquivalentType(), OS);
1815 if (
T->getAttrKind() == attr::ObjCKindOf)
1818 if (
T->getAttrKind() == attr::AddressSpace)
1819 printBefore(
T->getEquivalentType(), OS);
1821 printBefore(
T->getModifiedType(), OS);
1823 if (
T->isMSTypeSpec()) {
1824 switch (
T->getAttrKind()) {
1826 case attr::Ptr32: OS <<
" __ptr32";
break;
1827 case attr::Ptr64: OS <<
" __ptr64";
break;
1828 case attr::SPtr: OS <<
" __sptr";
break;
1829 case attr::UPtr: OS <<
" __uptr";
break;
1831 spaceBeforePlaceHolder(OS);
1834 if (
T->isWebAssemblyFuncrefSpec())
1838 if (
T->getImmediateNullability()) {
1839 if (
T->getAttrKind() == attr::TypeNonNull)
1841 else if (
T->getAttrKind() == attr::TypeNullable)
1843 else if (
T->getAttrKind() == attr::TypeNullUnspecified)
1844 OS <<
" _Null_unspecified";
1845 else if (
T->getAttrKind() == attr::TypeNullableResult)
1846 OS <<
" _Nullable_result";
1848 llvm_unreachable(
"unhandled nullability");
1849 spaceBeforePlaceHolder(OS);
1858 if (
T->getAttrKind() == attr::ObjCGC ||
1859 T->getAttrKind() == attr::ObjCOwnership)
1860 return printAfter(
T->getEquivalentType(), OS);
1864 SaveAndRestore MaybeSuppressCC(InsideCCAttribute,
T->isCallingConv());
1866 printAfter(
T->getModifiedType(), OS);
1870 if (
T->getAttrKind() == attr::ObjCKindOf ||
T->isMSTypeSpec() ||
1871 T->getImmediateNullability() ||
T->isWebAssemblyFuncrefSpec())
1875 if (
T->getAttrKind() == attr::ObjCInertUnsafeUnretained)
1879 if (
T->getAttrKind() == attr::NSReturnsRetained &&
1884 if (
T->getAttrKind() == attr::LifetimeBound) {
1885 OS <<
" [[clang::lifetimebound]]";
1892 if (
T->getAttrKind() == attr::AddressSpace)
1895 if (
T->getAttrKind() == attr::AnnotateType) {
1900 OS <<
" [[clang::annotate_type(...)]]";
1904 if (
T->getAttrKind() == attr::ArmStreaming) {
1905 OS <<
"__arm_streaming";
1908 if (
T->getAttrKind() == attr::ArmStreamingCompatible) {
1909 OS <<
"__arm_streaming_compatible";
1913 OS <<
" __attribute__((";
1914 switch (
T->getAttrKind()) {
1915#define TYPE_ATTR(NAME)
1916#define DECL_OR_TYPE_ATTR(NAME)
1917#define ATTR(NAME) case attr::NAME:
1918#include "clang/Basic/AttrList.inc"
1919 llvm_unreachable(
"non-type attribute attached to type");
1921 case attr::BTFTypeTag:
1922 llvm_unreachable(
"BTFTypeTag attribute handled separately");
1924 case attr::OpenCLPrivateAddressSpace:
1925 case attr::OpenCLGlobalAddressSpace:
1926 case attr::OpenCLGlobalDeviceAddressSpace:
1927 case attr::OpenCLGlobalHostAddressSpace:
1928 case attr::OpenCLLocalAddressSpace:
1929 case attr::OpenCLConstantAddressSpace:
1930 case attr::OpenCLGenericAddressSpace:
1931 case attr::HLSLGroupSharedAddressSpace:
1936 case attr::CountedBy:
1937 case attr::CountedByOrNull:
1939 case attr::SizedByOrNull:
1940 case attr::LifetimeBound:
1941 case attr::TypeNonNull:
1942 case attr::TypeNullable:
1943 case attr::TypeNullableResult:
1944 case attr::TypeNullUnspecified:
1946 case attr::ObjCInertUnsafeUnretained:
1947 case attr::ObjCKindOf:
1948 case attr::ObjCOwnership:
1953 case attr::AddressSpace:
1954 case attr::CmseNSCall:
1955 case attr::AnnotateType:
1956 case attr::WebAssemblyFuncref:
1957 case attr::ArmStreaming:
1958 case attr::ArmStreamingCompatible:
1961 case attr::ArmInOut:
1962 case attr::ArmPreserves:
1963 case attr::NonBlocking:
1964 case attr::NonAllocating:
1965 case attr::Blocking:
1966 case attr::Allocating:
1967 llvm_unreachable(
"This attribute should have been handled already");
1969 case attr::NSReturnsRetained:
1970 OS <<
"ns_returns_retained";
1975 case attr::AnyX86NoCfCheck: OS <<
"nocf_check";
break;
1976 case attr::CDecl: OS <<
"cdecl";
break;
1977 case attr::FastCall: OS <<
"fastcall";
break;
1978 case attr::StdCall: OS <<
"stdcall";
break;
1979 case attr::ThisCall: OS <<
"thiscall";
break;
1980 case attr::SwiftCall: OS <<
"swiftcall";
break;
1981 case attr::SwiftAsyncCall: OS <<
"swiftasynccall";
break;
1982 case attr::VectorCall: OS <<
"vectorcall";
break;
1983 case attr::Pascal: OS <<
"pascal";
break;
1984 case attr::MSABI: OS <<
"ms_abi";
break;
1985 case attr::SysVABI: OS <<
"sysv_abi";
break;
1986 case attr::RegCall: OS <<
"regcall";
break;
1993 "\"aapcs\"" :
"\"aapcs-vfp\"");
1997 case attr::AArch64VectorPcs: OS <<
"aarch64_vector_pcs";
break;
1998 case attr::AArch64SVEPcs: OS <<
"aarch64_sve_pcs";
break;
1999 case attr::AMDGPUKernelCall: OS <<
"amdgpu_kernel";
break;
2000 case attr::IntelOclBicc: OS <<
"inteloclbicc";
break;
2001 case attr::PreserveMost:
2002 OS <<
"preserve_most";
2005 case attr::PreserveAll:
2006 OS <<
"preserve_all";
2011 case attr::PreserveNone:
2012 OS <<
"preserve_none";
2014 case attr::RISCVVectorCC:
2015 OS <<
"riscv_vector_cc";
2020 case attr::AcquireHandle:
2021 OS <<
"acquire_handle";
2023 case attr::ArmMveStrictPolymorphism:
2024 OS <<
"__clang_arm_mve_strict_polymorphism";
2028 case attr::HLSLParamModifier:
2036 printBefore(
T->getWrappedType(), OS);
2037 OS <<
" __attribute__((btf_type_tag(\"" <<
T->getAttr()->getBTFTypeTag() <<
"\")))";
2042 printAfter(
T->getWrappedType(), OS);
2047 OS <<
T->getDecl()->getName();
2048 spaceBeforePlaceHolder(OS);
2056 OS <<
T->getDecl()->getName();
2057 if (!
T->qual_empty()) {
2058 bool isFirst =
true;
2060 for (
const auto *I :
T->quals()) {
2070 spaceBeforePlaceHolder(OS);
2078 if (
T->qual_empty() &&
T->isUnspecializedAsWritten() &&
2079 !
T->isKindOfTypeAsWritten())
2080 return printBefore(
T->getBaseType(), OS);
2082 if (
T->isKindOfTypeAsWritten())
2085 print(
T->getBaseType(), OS, StringRef());
2087 if (
T->isSpecializedAsWritten()) {
2088 bool isFirst =
true;
2090 for (
auto typeArg :
T->getTypeArgsAsWritten()) {
2096 print(typeArg, OS, StringRef());
2101 if (!
T->qual_empty()) {
2102 bool isFirst =
true;
2104 for (
const auto *I :
T->quals()) {
2114 spaceBeforePlaceHolder(OS);
2119 if (
T->qual_empty() &&
T->isUnspecializedAsWritten() &&
2120 !
T->isKindOfTypeAsWritten())
2121 return printAfter(
T->getBaseType(), OS);
2131 if (HasEmptyPlaceHolder)
2148 llvm::raw_ostream &OS,
bool IncludeType) {
2149 A.
print(PP, OS, IncludeType);
2173 if (TTPT->getDepth() == Depth && TTPT->getIndex() < Args.size() &&
2176 Args[TTPT->getIndex()].getAsType(), Pattern.
getQualifiers());
2188 if (TQual != PatQual)
2206 Template = TTST->getTemplateName();
2207 TemplateArgs = TTST->template_arguments();
2208 }
else if (
auto *CTSD = dyn_cast_or_null<ClassTemplateSpecializationDecl>(
2210 Template =
TemplateName(CTSD->getSpecializedTemplate());
2211 TemplateArgs = CTSD->getTemplateArgs().asArray();
2219 if (TemplateArgs.size() != PTST->template_arguments().size())
2221 for (
unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
2223 Ctx, TemplateArgs[I], PTST->template_arguments()[I], Args, Depth))
2274 if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl()))
2275 return NTTP->getDepth() == Depth && Args.size() > NTTP->getIndex() &&
2276 Args[NTTP->getIndex()].structurallyEquals(Arg);
2292 if (
auto *TTPD = dyn_cast_or_null<TemplateTemplateParmDecl>(PatTD))
2293 return TTPD->getDepth() == Depth && Args.size() > TTPD->getIndex() &&
2310 if (
auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Param)) {
2311 return TTPD->hasDefaultArgument() &&
2313 Ctx, Arg, TTPD->getDefaultArgument().getArgument(), Args, Depth);
2314 }
else if (
auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
2315 return TTPD->hasDefaultArgument() &&
2317 Ctx, Arg, TTPD->getDefaultArgument().getArgument(), Args, Depth);
2318 }
else if (
auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
2319 return NTTPD->hasDefaultArgument() &&
2321 Ctx, Arg, NTTPD->getDefaultArgument().getArgument(), Args,
2327template <
typename TA>
2334 Args.size() <= TPL->
size()) {
2336 for (
const TA &A : Args)
2339 Args = Args.drop_back();
2346 bool NeedSpace =
false;
2347 bool FirstArg =
true;
2348 for (
const auto &Arg : Args) {
2351 llvm::raw_svector_ostream ArgOS(Buf);
2364 Policy, TPL, ParmIndex));
2366 StringRef ArgString = ArgOS.str();
2371 if (FirstArg && ArgString.starts_with(
":"))
2378 if (!ArgString.empty()) {
2406 printTo(OS, Args, Policy, TPL,
false, 0);
2413 printTo(OS, Args, Policy, TPL,
false, 0);
2426 llvm::raw_svector_ostream StrOS(Buf);
2427 print(StrOS, Policy);
2428 return std::string(StrOS.str());
2462 return "__constant";
2467 return "__global_device";
2470 return "__global_host";
2472 return "__device__";
2474 return "__constant__";
2476 return "__shared__";
2478 return "__sptr __ptr32";
2480 return "__uptr __ptr32";
2486 return "groupshared";
2496 bool appendSpaceIfNonEmpty)
const {
2497 bool addSpace =
false;
2507 OS <<
"__unaligned";
2511 if (!ASStr.empty()) {
2517 OS <<
"__attribute__((address_space(" << ASStr <<
")))";
2551 if (appendSpaceIfNonEmpty && addSpace)
2573 const Twine &PlaceHolder,
unsigned Indentation)
const {
2580 const Twine &PlaceHolder,
unsigned Indentation) {
2582 StringRef PH = PlaceHolder.toStringRef(PHBuf);
2584 TypePrinter(policy, Indentation).print(ty, qs, OS, PH);
2594 std::string &buffer,
2597 llvm::raw_svector_ostream StrOS(Buf);
2598 TypePrinter(policy).print(ty, qs, StrOS, buffer);
2599 std::string str = std::string(StrOS.str());
2605 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.
An immutable set of FunctionEffects and possibly conditions attached to them.
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
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().
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.
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.
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.
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.