diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:06:01 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:06:01 +0000 |
| commit | 486754660bb926339aefcf012a3f848592babb8b (patch) | |
| tree | ecdbc446c9876f4f120f701c243373cd3cb43db3 /lib/AST/TypePrinter.cpp | |
| parent | 55e6d896ad333f07bb3b1ba487df214fc268a4ab (diff) | |
Notes
Diffstat (limited to 'lib/AST/TypePrinter.cpp')
| -rw-r--r-- | lib/AST/TypePrinter.cpp | 254 |
1 files changed, 194 insertions, 60 deletions
diff --git a/lib/AST/TypePrinter.cpp b/lib/AST/TypePrinter.cpp index c28ada7dcb8b..c5e2244e26c5 100644 --- a/lib/AST/TypePrinter.cpp +++ b/lib/AST/TypePrinter.cpp @@ -1,4 +1,4 @@ -//===--- TypePrinter.cpp - Pretty-Print Clang Types -----------------------===// +//===- TypePrinter.cpp - Pretty-Print Clang Types -------------------------===// // // The LLVM Compiler Infrastructure // @@ -14,20 +14,40 @@ #include "clang/AST/PrettyPrinter.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" +#include "clang/AST/DeclBase.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/DeclObjC.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/Expr.h" +#include "clang/AST/NestedNameSpecifier.h" +#include "clang/AST/TemplateBase.h" +#include "clang/AST/TemplateName.h" #include "clang/AST/Type.h" +#include "clang/Basic/AddressSpaces.h" +#include "clang/Basic/ExceptionSpecificationType.h" +#include "clang/Basic/IdentifierTable.h" +#include "clang/Basic/LLVM.h" #include "clang/Basic/LangOptions.h" +#include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" +#include "clang/Basic/Specifiers.h" +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SmallString.h" -#include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/Twine.h" +#include "llvm/Support/Casting.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/SaveAndRestore.h" #include "llvm/Support/raw_ostream.h" +#include <cassert> +#include <string> + using namespace clang; namespace { - /// \brief RAII object that enables printing of the ARC __strong lifetime + + /// RAII object that enables printing of the ARC __strong lifetime /// qualifier. class IncludeStrongLifetimeRAII { PrintingPolicy &Policy; @@ -35,7 +55,7 @@ namespace { public: explicit IncludeStrongLifetimeRAII(PrintingPolicy &Policy) - : Policy(Policy), Old(Policy.SuppressStrongLifetime) { + : Policy(Policy), Old(Policy.SuppressStrongLifetime) { if (!Policy.SuppressLifetimeQualifiers) Policy.SuppressStrongLifetime = false; } @@ -51,7 +71,7 @@ namespace { public: explicit ParamPolicyRAII(PrintingPolicy &Policy) - : Policy(Policy), Old(Policy.SuppressSpecifiers) { + : Policy(Policy), Old(Policy.SuppressSpecifiers) { Policy.SuppressSpecifiers = false; } @@ -82,13 +102,12 @@ namespace { class TypePrinter { PrintingPolicy Policy; unsigned Indentation; - bool HasEmptyPlaceHolder; - bool InsideCCAttribute; + bool HasEmptyPlaceHolder = false; + bool InsideCCAttribute = false; public: explicit TypePrinter(const PrintingPolicy &Policy, unsigned Indentation = 0) - : Policy(Policy), Indentation(Indentation), - HasEmptyPlaceHolder(false), InsideCCAttribute(false) { } + : Policy(Policy), Indentation(Indentation) {} void print(const Type *ty, Qualifiers qs, raw_ostream &OS, StringRef PlaceHolder); @@ -111,7 +130,8 @@ namespace { void print##CLASS##After(const CLASS##Type *T, raw_ostream &OS); #include "clang/AST/TypeNodes.def" }; -} + +} // namespace static void AppendTypeQualList(raw_ostream &OS, unsigned TypeQuals, bool HasRestrictKeyword) { @@ -169,10 +189,9 @@ bool TypePrinter::canPrefixQualifiers(const Type *T, bool CanPrefixQualifiers = false; NeedARCStrongQualifier = false; Type::TypeClass TC = T->getTypeClass(); - if (const AutoType *AT = dyn_cast<AutoType>(T)) + if (const auto *AT = dyn_cast<AutoType>(T)) TC = AT->desugar()->getTypeClass(); - if (const SubstTemplateTypeParmType *Subst - = dyn_cast<SubstTemplateTypeParmType>(T)) + if (const auto *Subst = dyn_cast<SubstTemplateTypeParmType>(T)) TC = Subst->getReplacementType()->getTypeClass(); switch (TC) { @@ -223,6 +242,7 @@ bool TypePrinter::canPrefixQualifiers(const Type *T, case Type::RValueReference: case Type::MemberPointer: case Type::DependentAddressSpace: + case Type::DependentVector: case Type::DependentSizedExtVector: case Type::Vector: case Type::ExtVector: @@ -245,14 +265,13 @@ void TypePrinter::printBefore(QualType T, raw_ostream &OS) { // If we have cv1 T, where T is substituted for cv2 U, only print cv1 - cv2 // at this level. Qualifiers Quals = Split.Quals; - if (const SubstTemplateTypeParmType *Subst = - dyn_cast<SubstTemplateTypeParmType>(Split.Ty)) + if (const auto *Subst = dyn_cast<SubstTemplateTypeParmType>(Split.Ty)) Quals -= QualType(Subst, 0).getQualifiers(); printBefore(Split.Ty, Quals, OS); } -/// \brief Prints the part of the type string before an identifier, e.g. for +/// Prints the part of the type string before an identifier, e.g. for /// "int foo[10]" it prints "int ". void TypePrinter::printBefore(const Type *T,Qualifiers Quals, raw_ostream &OS) { if (Policy.SuppressSpecifiers && T->isSpecifierType()) @@ -305,7 +324,7 @@ void TypePrinter::printAfter(QualType t, raw_ostream &OS) { printAfter(split.Ty, split.Quals, OS); } -/// \brief Prints the part of the type string after an identifier, e.g. for +/// Prints the part of the type string after an identifier, e.g. for /// "int foo[10]" it prints "[10]". void TypePrinter::printAfter(const Type *T, Qualifiers Quals, raw_ostream &OS) { switch (T->getTypeClass()) { @@ -321,12 +340,14 @@ void TypePrinter::printBuiltinBefore(const BuiltinType *T, raw_ostream &OS) { OS << T->getName(Policy); spaceBeforePlaceHolder(OS); } -void TypePrinter::printBuiltinAfter(const BuiltinType *T, raw_ostream &OS) { } + +void TypePrinter::printBuiltinAfter(const BuiltinType *T, raw_ostream &OS) {} void TypePrinter::printComplexBefore(const ComplexType *T, raw_ostream &OS) { OS << "_Complex "; printBefore(T->getElementType(), OS); } + void TypePrinter::printComplexAfter(const ComplexType *T, raw_ostream &OS) { printAfter(T->getElementType(), OS); } @@ -341,6 +362,7 @@ void TypePrinter::printPointerBefore(const PointerType *T, raw_ostream &OS) { OS << '('; OS << '*'; } + void TypePrinter::printPointerAfter(const PointerType *T, raw_ostream &OS) { IncludeStrongLifetimeRAII Strong(Policy); SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); @@ -357,54 +379,69 @@ void TypePrinter::printBlockPointerBefore(const BlockPointerType *T, printBefore(T->getPointeeType(), OS); OS << '^'; } + void TypePrinter::printBlockPointerAfter(const BlockPointerType *T, raw_ostream &OS) { SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); printAfter(T->getPointeeType(), OS); } +// When printing a reference, the referenced type might also be a reference. +// If so, we want to skip that before printing the inner type. +static QualType skipTopLevelReferences(QualType T) { + if (auto *Ref = T->getAs<ReferenceType>()) + return skipTopLevelReferences(Ref->getPointeeTypeAsWritten()); + return T; +} + void TypePrinter::printLValueReferenceBefore(const LValueReferenceType *T, raw_ostream &OS) { IncludeStrongLifetimeRAII Strong(Policy); SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); - printBefore(T->getPointeeTypeAsWritten(), OS); + QualType Inner = skipTopLevelReferences(T->getPointeeTypeAsWritten()); + printBefore(Inner, OS); // Handle things like 'int (&A)[4];' correctly. // FIXME: this should include vectors, but vectors use attributes I guess. - if (isa<ArrayType>(T->getPointeeTypeAsWritten())) + if (isa<ArrayType>(Inner)) OS << '('; OS << '&'; } + void TypePrinter::printLValueReferenceAfter(const LValueReferenceType *T, raw_ostream &OS) { IncludeStrongLifetimeRAII Strong(Policy); SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); + QualType Inner = skipTopLevelReferences(T->getPointeeTypeAsWritten()); // Handle things like 'int (&A)[4];' correctly. // FIXME: this should include vectors, but vectors use attributes I guess. - if (isa<ArrayType>(T->getPointeeTypeAsWritten())) + if (isa<ArrayType>(Inner)) OS << ')'; - printAfter(T->getPointeeTypeAsWritten(), OS); + printAfter(Inner, OS); } void TypePrinter::printRValueReferenceBefore(const RValueReferenceType *T, raw_ostream &OS) { IncludeStrongLifetimeRAII Strong(Policy); SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); - printBefore(T->getPointeeTypeAsWritten(), OS); + QualType Inner = skipTopLevelReferences(T->getPointeeTypeAsWritten()); + printBefore(Inner, OS); // Handle things like 'int (&&A)[4];' correctly. // FIXME: this should include vectors, but vectors use attributes I guess. - if (isa<ArrayType>(T->getPointeeTypeAsWritten())) + if (isa<ArrayType>(Inner)) OS << '('; OS << "&&"; } + void TypePrinter::printRValueReferenceAfter(const RValueReferenceType *T, raw_ostream &OS) { IncludeStrongLifetimeRAII Strong(Policy); SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); + QualType Inner = skipTopLevelReferences(T->getPointeeTypeAsWritten()); // Handle things like 'int (&&A)[4];' correctly. // FIXME: this should include vectors, but vectors use attributes I guess. - if (isa<ArrayType>(T->getPointeeTypeAsWritten())) + if (isa<ArrayType>(Inner)) OS << ')'; - printAfter(T->getPointeeTypeAsWritten(), OS); + printAfter(Inner, OS); } void TypePrinter::printMemberPointerBefore(const MemberPointerType *T, @@ -423,6 +460,7 @@ void TypePrinter::printMemberPointerBefore(const MemberPointerType *T, OS << "::*"; } + void TypePrinter::printMemberPointerAfter(const MemberPointerType *T, raw_ostream &OS) { IncludeStrongLifetimeRAII Strong(Policy); @@ -440,6 +478,7 @@ void TypePrinter::printConstantArrayBefore(const ConstantArrayType *T, SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); printBefore(T->getElementType(), OS); } + void TypePrinter::printConstantArrayAfter(const ConstantArrayType *T, raw_ostream &OS) { OS << '['; @@ -462,6 +501,7 @@ void TypePrinter::printIncompleteArrayBefore(const IncompleteArrayType *T, SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); printBefore(T->getElementType(), OS); } + void TypePrinter::printIncompleteArrayAfter(const IncompleteArrayType *T, raw_ostream &OS) { OS << "[]"; @@ -474,6 +514,7 @@ void TypePrinter::printVariableArrayBefore(const VariableArrayType *T, SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); printBefore(T->getElementType(), OS); } + void TypePrinter::printVariableArrayAfter(const VariableArrayType *T, raw_ostream &OS) { OS << '['; @@ -499,6 +540,7 @@ void TypePrinter::printAdjustedBefore(const AdjustedType *T, raw_ostream &OS) { // invisible. printBefore(T->getAdjustedType(), OS); } + void TypePrinter::printAdjustedAfter(const AdjustedType *T, raw_ostream &OS) { printAfter(T->getAdjustedType(), OS); } @@ -507,6 +549,7 @@ void TypePrinter::printDecayedBefore(const DecayedType *T, raw_ostream &OS) { // Print as though it's a pointer. printAdjustedBefore(T, OS); } + void TypePrinter::printDecayedAfter(const DecayedType *T, raw_ostream &OS) { printAdjustedAfter(T, OS); } @@ -518,6 +561,7 @@ void TypePrinter::printDependentSizedArrayBefore( SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); printBefore(T->getElementType(), OS); } + void TypePrinter::printDependentSizedArrayAfter( const DependentSizedArrayType *T, raw_ostream &OS) { @@ -532,6 +576,7 @@ void TypePrinter::printDependentAddressSpaceBefore( const DependentAddressSpaceType *T, raw_ostream &OS) { printBefore(T->getPointeeType(), OS); } + void TypePrinter::printDependentAddressSpaceAfter( const DependentAddressSpaceType *T, raw_ostream &OS) { OS << " __attribute__((address_space("; @@ -546,6 +591,7 @@ void TypePrinter::printDependentSizedExtVectorBefore( raw_ostream &OS) { printBefore(T->getElementType(), OS); } + void TypePrinter::printDependentSizedExtVectorAfter( const DependentSizedExtVectorType *T, raw_ostream &OS) { @@ -592,14 +638,64 @@ void TypePrinter::printVectorBefore(const VectorType *T, raw_ostream &OS) { } } } + void TypePrinter::printVectorAfter(const VectorType *T, raw_ostream &OS) { printAfter(T->getElementType(), OS); -} +} + +void TypePrinter::printDependentVectorBefore( + const DependentVectorType *T, raw_ostream &OS) { + switch (T->getVectorKind()) { + case VectorType::AltiVecPixel: + OS << "__vector __pixel "; + break; + case VectorType::AltiVecBool: + OS << "__vector __bool "; + printBefore(T->getElementType(), OS); + break; + case VectorType::AltiVecVector: + OS << "__vector "; + printBefore(T->getElementType(), OS); + break; + case VectorType::NeonVector: + OS << "__attribute__((neon_vector_type("; + if (T->getSizeExpr()) + T->getSizeExpr()->printPretty(OS, nullptr, Policy); + OS << "))) "; + printBefore(T->getElementType(), OS); + break; + case VectorType::NeonPolyVector: + OS << "__attribute__((neon_polyvector_type("; + if (T->getSizeExpr()) + T->getSizeExpr()->printPretty(OS, nullptr, Policy); + OS << "))) "; + printBefore(T->getElementType(), OS); + break; + case VectorType::GenericVector: { + // FIXME: We prefer to print the size directly here, but have no way + // to get the size of the type. + OS << "__attribute__((__vector_size__("; + if (T->getSizeExpr()) + T->getSizeExpr()->printPretty(OS, nullptr, Policy); + OS << " * sizeof("; + print(T->getElementType(), OS, StringRef()); + OS << ")))) "; + printBefore(T->getElementType(), OS); + break; + } + } +} + +void TypePrinter::printDependentVectorAfter( + const DependentVectorType *T, raw_ostream &OS) { + printAfter(T->getElementType(), OS); +} void TypePrinter::printExtVectorBefore(const ExtVectorType *T, raw_ostream &OS) { printBefore(T->getElementType(), OS); } + void TypePrinter::printExtVectorAfter(const ExtVectorType *T, raw_ostream &OS) { printAfter(T->getElementType(), OS); OS << " __attribute__((ext_vector_type("; @@ -611,7 +707,6 @@ void FunctionProtoType::printExceptionSpecification(raw_ostream &OS, const PrintingPolicy &Policy) const { - if (hasDynamicExceptionSpec()) { OS << " throw("; if (getExceptionSpecType() == EST_MSAny) @@ -626,7 +721,9 @@ FunctionProtoType::printExceptionSpecification(raw_ostream &OS, OS << ')'; } else if (isNoexceptExceptionSpec(getExceptionSpecType())) { OS << " noexcept"; - if (getExceptionSpecType() == EST_ComputedNoexcept) { + // FIXME:Is it useful to print out the expression for a non-dependent + // noexcept specification? + if (isComputedNoexcept(getExceptionSpecType())) { OS << '('; if (getNoexceptExpr()) getNoexceptExpr()->printPretty(OS, nullptr, Policy); @@ -650,7 +747,7 @@ void TypePrinter::printFunctionProtoBefore(const FunctionProtoType *T, } } -llvm::StringRef clang::getParameterABISpelling(ParameterABI ABI) { +StringRef clang::getParameterABISpelling(ParameterABI ABI) { switch (ABI) { case ParameterABI::Ordinary: llvm_unreachable("asking for spelling of ordinary parameter ABI"); @@ -801,6 +898,8 @@ void TypePrinter::printFunctionAfter(const FunctionType::ExtInfo &Info, << Info.getRegParm() << ")))"; if (Info.getNoCallerSavedRegs()) OS << " __attribute__((no_caller_saved_registers))"; + if (Info.getNoCfCheck()) + OS << " __attribute__((nocf_check))"; } void TypePrinter::printFunctionNoProtoBefore(const FunctionNoProtoType *T, @@ -811,6 +910,7 @@ void TypePrinter::printFunctionNoProtoBefore(const FunctionNoProtoType *T, if (!PrevPHIsEmpty.get()) OS << '('; } + void TypePrinter::printFunctionNoProtoAfter(const FunctionNoProtoType *T, raw_ostream &OS) { // If needed for precedence reasons, wrap the inner part in grouping parens. @@ -840,13 +940,15 @@ void TypePrinter::printUnresolvedUsingBefore(const UnresolvedUsingType *T, raw_ostream &OS) { printTypeSpec(T->getDecl(), OS); } + void TypePrinter::printUnresolvedUsingAfter(const UnresolvedUsingType *T, - raw_ostream &OS) { } + raw_ostream &OS) {} void TypePrinter::printTypedefBefore(const TypedefType *T, raw_ostream &OS) { printTypeSpec(T->getDecl(), OS); } -void TypePrinter::printTypedefAfter(const TypedefType *T, raw_ostream &OS) { } + +void TypePrinter::printTypedefAfter(const TypedefType *T, raw_ostream &OS) {} void TypePrinter::printTypeOfExprBefore(const TypeOfExprType *T, raw_ostream &OS) { @@ -855,8 +957,9 @@ void TypePrinter::printTypeOfExprBefore(const TypeOfExprType *T, T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy); spaceBeforePlaceHolder(OS); } + void TypePrinter::printTypeOfExprAfter(const TypeOfExprType *T, - raw_ostream &OS) { } + raw_ostream &OS) {} void TypePrinter::printTypeOfBefore(const TypeOfType *T, raw_ostream &OS) { OS << "typeof("; @@ -864,7 +967,8 @@ void TypePrinter::printTypeOfBefore(const TypeOfType *T, raw_ostream &OS) { OS << ')'; spaceBeforePlaceHolder(OS); } -void TypePrinter::printTypeOfAfter(const TypeOfType *T, raw_ostream &OS) { } + +void TypePrinter::printTypeOfAfter(const TypeOfType *T, raw_ostream &OS) {} void TypePrinter::printDecltypeBefore(const DecltypeType *T, raw_ostream &OS) { OS << "decltype("; @@ -873,7 +977,8 @@ void TypePrinter::printDecltypeBefore(const DecltypeType *T, raw_ostream &OS) { OS << ')'; spaceBeforePlaceHolder(OS); } -void TypePrinter::printDecltypeAfter(const DecltypeType *T, raw_ostream &OS) { } + +void TypePrinter::printDecltypeAfter(const DecltypeType *T, raw_ostream &OS) {} void TypePrinter::printUnaryTransformBefore(const UnaryTransformType *T, raw_ostream &OS) { @@ -890,6 +995,7 @@ void TypePrinter::printUnaryTransformBefore(const UnaryTransformType *T, printBefore(T->getBaseType(), OS); } + void TypePrinter::printUnaryTransformAfter(const UnaryTransformType *T, raw_ostream &OS) { IncludeStrongLifetimeRAII Strong(Policy); @@ -915,6 +1021,7 @@ void TypePrinter::printAutoBefore(const AutoType *T, raw_ostream &OS) { spaceBeforePlaceHolder(OS); } } + void TypePrinter::printAutoAfter(const AutoType *T, raw_ostream &OS) { // If the type has been deduced, do not print 'auto'. if (!T->getDeducedType().isNull()) @@ -932,6 +1039,7 @@ void TypePrinter::printDeducedTemplateSpecializationBefore( spaceBeforePlaceHolder(OS); } } + void TypePrinter::printDeducedTemplateSpecializationAfter( const DeducedTemplateSpecializationType *T, raw_ostream &OS) { // If the type has been deduced, print the deduced type. @@ -947,7 +1055,8 @@ void TypePrinter::printAtomicBefore(const AtomicType *T, raw_ostream &OS) { OS << ')'; spaceBeforePlaceHolder(OS); } -void TypePrinter::printAtomicAfter(const AtomicType *T, raw_ostream &OS) { } + +void TypePrinter::printAtomicAfter(const AtomicType *T, raw_ostream &OS) {} void TypePrinter::printPipeBefore(const PipeType *T, raw_ostream &OS) { IncludeStrongLifetimeRAII Strong(Policy); @@ -961,15 +1070,15 @@ void TypePrinter::printPipeBefore(const PipeType *T, raw_ostream &OS) { spaceBeforePlaceHolder(OS); } -void TypePrinter::printPipeAfter(const PipeType *T, raw_ostream &OS) { -} +void TypePrinter::printPipeAfter(const PipeType *T, raw_ostream &OS) {} + /// Appends the given scope to the end of a string. void TypePrinter::AppendScope(DeclContext *DC, raw_ostream &OS) { if (DC->isTranslationUnit()) return; if (DC->isFunctionOrMethod()) return; AppendScope(DC->getParent(), OS); - if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) { + if (const auto *NS = dyn_cast<NamespaceDecl>(DC)) { if (Policy.SuppressUnwrittenScope && (NS->isAnonymousNamespace() || NS->isInline())) return; @@ -977,14 +1086,13 @@ void TypePrinter::AppendScope(DeclContext *DC, raw_ostream &OS) { OS << NS->getName() << "::"; else OS << "(anonymous namespace)::"; - } else if (ClassTemplateSpecializationDecl *Spec - = dyn_cast<ClassTemplateSpecializationDecl>(DC)) { + } else if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) { IncludeStrongLifetimeRAII Strong(Policy); OS << Spec->getIdentifier()->getName(); const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); printTemplateArgumentList(OS, TemplateArgs.asArray(), Policy); OS << "::"; - } else if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) { + } else if (const auto *Tag = dyn_cast<TagDecl>(DC)) { if (TypedefNameDecl *Typedef = Tag->getTypedefNameForAnonDecl()) OS << Typedef->getIdentifier()->getName() << "::"; else if (Tag->getIdentifier()) @@ -1057,8 +1165,7 @@ void TypePrinter::printTag(TagDecl *D, raw_ostream &OS) { // If this is a class template specialization, print the template // arguments. - if (ClassTemplateSpecializationDecl *Spec - = dyn_cast<ClassTemplateSpecializationDecl>(D)) { + if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(D)) { ArrayRef<TemplateArgument> Args; if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) { const TemplateSpecializationType *TST = @@ -1078,12 +1185,14 @@ void TypePrinter::printTag(TagDecl *D, raw_ostream &OS) { void TypePrinter::printRecordBefore(const RecordType *T, raw_ostream &OS) { printTag(T->getDecl(), OS); } -void TypePrinter::printRecordAfter(const RecordType *T, raw_ostream &OS) { } + +void TypePrinter::printRecordAfter(const RecordType *T, raw_ostream &OS) {} void TypePrinter::printEnumBefore(const EnumType *T, raw_ostream &OS) { printTag(T->getDecl(), OS); } -void TypePrinter::printEnumAfter(const EnumType *T, raw_ostream &OS) { } + +void TypePrinter::printEnumAfter(const EnumType *T, raw_ostream &OS) {} void TypePrinter::printTemplateTypeParmBefore(const TemplateTypeParmType *T, raw_ostream &OS) { @@ -1093,8 +1202,9 @@ void TypePrinter::printTemplateTypeParmBefore(const TemplateTypeParmType *T, OS << "type-parameter-" << T->getDepth() << '-' << T->getIndex(); spaceBeforePlaceHolder(OS); } + void TypePrinter::printTemplateTypeParmAfter(const TemplateTypeParmType *T, - raw_ostream &OS) { } + raw_ostream &OS) {} void TypePrinter::printSubstTemplateTypeParmBefore( const SubstTemplateTypeParmType *T, @@ -1102,6 +1212,7 @@ void TypePrinter::printSubstTemplateTypeParmBefore( IncludeStrongLifetimeRAII Strong(Policy); printBefore(T->getReplacementType(), OS); } + void TypePrinter::printSubstTemplateTypeParmAfter( const SubstTemplateTypeParmType *T, raw_ostream &OS) { @@ -1115,6 +1226,7 @@ void TypePrinter::printSubstTemplateTypeParmPackBefore( IncludeStrongLifetimeRAII Strong(Policy); printTemplateTypeParmBefore(T->getReplacedParameter(), OS); } + void TypePrinter::printSubstTemplateTypeParmPackAfter( const SubstTemplateTypeParmPackType *T, raw_ostream &OS) { @@ -1131,26 +1243,39 @@ void TypePrinter::printTemplateSpecializationBefore( printTemplateArgumentList(OS, T->template_arguments(), Policy); spaceBeforePlaceHolder(OS); } + void TypePrinter::printTemplateSpecializationAfter( const TemplateSpecializationType *T, - raw_ostream &OS) { } + raw_ostream &OS) {} void TypePrinter::printInjectedClassNameBefore(const InjectedClassNameType *T, raw_ostream &OS) { printTemplateSpecializationBefore(T->getInjectedTST(), OS); } + void TypePrinter::printInjectedClassNameAfter(const InjectedClassNameType *T, - raw_ostream &OS) { } + raw_ostream &OS) {} void TypePrinter::printElaboratedBefore(const ElaboratedType *T, raw_ostream &OS) { + if (Policy.IncludeTagDefinition && T->getOwnedTagDecl()) { + TagDecl *OwnedTagDecl = T->getOwnedTagDecl(); + assert(OwnedTagDecl->getTypeForDecl() == T->getNamedType().getTypePtr() && + "OwnedTagDecl expected to be a declaration for the type"); + PrintingPolicy SubPolicy = Policy; + SubPolicy.IncludeTagDefinition = false; + OwnedTagDecl->print(OS, SubPolicy, Indentation); + spaceBeforePlaceHolder(OS); + return; + } + // The tag definition will take care of these. if (!Policy.IncludeTagDefinition) { OS << TypeWithKeyword::getKeywordName(T->getKeyword()); if (T->getKeyword() != ETK_None) OS << " "; - NestedNameSpecifier* Qualifier = T->getQualifier(); + NestedNameSpecifier *Qualifier = T->getQualifier(); if (Qualifier) Qualifier->print(OS, Policy); } @@ -1158,8 +1283,11 @@ void TypePrinter::printElaboratedBefore(const ElaboratedType *T, ElaboratedTypePolicyRAII PolicyRAII(Policy); printBefore(T->getNamedType(), OS); } + void TypePrinter::printElaboratedAfter(const ElaboratedType *T, raw_ostream &OS) { + if (Policy.IncludeTagDefinition && T->getOwnedTagDecl()) + return; ElaboratedTypePolicyRAII PolicyRAII(Policy); printAfter(T->getNamedType(), OS); } @@ -1171,6 +1299,7 @@ void TypePrinter::printParenBefore(const ParenType *T, raw_ostream &OS) { } else printBefore(T->getInnerType(), OS); } + void TypePrinter::printParenAfter(const ParenType *T, raw_ostream &OS) { if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) { OS << ')'; @@ -1190,8 +1319,9 @@ void TypePrinter::printDependentNameBefore(const DependentNameType *T, OS << T->getIdentifier()->getName(); spaceBeforePlaceHolder(OS); } + void TypePrinter::printDependentNameAfter(const DependentNameType *T, - raw_ostream &OS) { } + raw_ostream &OS) {} void TypePrinter::printDependentTemplateSpecializationBefore( const DependentTemplateSpecializationType *T, raw_ostream &OS) { @@ -1209,12 +1339,13 @@ void TypePrinter::printDependentTemplateSpecializationBefore( } void TypePrinter::printDependentTemplateSpecializationAfter( - const DependentTemplateSpecializationType *T, raw_ostream &OS) { } + const DependentTemplateSpecializationType *T, raw_ostream &OS) {} void TypePrinter::printPackExpansionBefore(const PackExpansionType *T, raw_ostream &OS) { printBefore(T->getPattern(), OS); } + void TypePrinter::printPackExpansionAfter(const PackExpansionType *T, raw_ostream &OS) { printAfter(T->getPattern(), OS); @@ -1323,9 +1454,9 @@ void TypePrinter::printAttributedAfter(const AttributedType *T, OS << ')'; break; - case AttributedType::attr_vector_size: { + case AttributedType::attr_vector_size: OS << "__vector_size__("; - if (const VectorType *vector =T->getEquivalentType()->getAs<VectorType>()) { + if (const auto *vector = T->getEquivalentType()->getAs<VectorType>()) { OS << vector->getNumElements(); OS << " * sizeof("; print(vector->getElementType(), OS, StringRef()); @@ -1333,7 +1464,6 @@ void TypePrinter::printAttributedAfter(const AttributedType *T, } OS << ')'; break; - } case AttributedType::attr_neon_vector_type: case AttributedType::attr_neon_polyvector_type: { @@ -1341,7 +1471,7 @@ void TypePrinter::printAttributedAfter(const AttributedType *T, OS << "neon_vector_type("; else OS << "neon_polyvector_type("; - const VectorType *vector = T->getEquivalentType()->getAs<VectorType>(); + const auto *vector = T->getEquivalentType()->getAs<VectorType>(); OS << vector->getNumElements(); OS << ')'; break; @@ -1396,7 +1526,7 @@ void TypePrinter::printAttributedAfter(const AttributedType *T, // FIXME: When Sema learns to form this AttributedType, avoid printing the // attribute again in printFunctionProtoAfter. case AttributedType::attr_noreturn: OS << "noreturn"; break; - + case AttributedType::attr_nocf_check: OS << "nocf_check"; break; case AttributedType::attr_cdecl: OS << "cdecl"; break; case AttributedType::attr_fastcall: OS << "fastcall"; break; case AttributedType::attr_stdcall: OS << "stdcall"; break; @@ -1418,10 +1548,12 @@ void TypePrinter::printAttributedAfter(const AttributedType *T, OS << ')'; break; } + case AttributedType::attr_inteloclbicc: OS << "inteloclbicc"; break; case AttributedType::attr_preserve_most: OS << "preserve_most"; break; + case AttributedType::attr_preserve_all: OS << "preserve_all"; break; @@ -1434,8 +1566,9 @@ void TypePrinter::printObjCInterfaceBefore(const ObjCInterfaceType *T, OS << T->getDecl()->getName(); spaceBeforePlaceHolder(OS); } + void TypePrinter::printObjCInterfaceAfter(const ObjCInterfaceType *T, - raw_ostream &OS) { } + raw_ostream &OS) {} void TypePrinter::printObjCTypeParamBefore(const ObjCTypeParamType *T, raw_ostream &OS) { @@ -1457,7 +1590,7 @@ void TypePrinter::printObjCTypeParamBefore(const ObjCTypeParamType *T, } void TypePrinter::printObjCTypeParamAfter(const ObjCTypeParamType *T, - raw_ostream &OS) { } + raw_ostream &OS) {} void TypePrinter::printObjCObjectBefore(const ObjCObjectType *T, raw_ostream &OS) { @@ -1499,6 +1632,7 @@ void TypePrinter::printObjCObjectBefore(const ObjCObjectType *T, spaceBeforePlaceHolder(OS); } + void TypePrinter::printObjCObjectAfter(const ObjCObjectType *T, raw_ostream &OS) { if (T->qual_empty() && T->isUnspecializedAsWritten() && @@ -1520,7 +1654,7 @@ void TypePrinter::printObjCObjectPointerBefore(const ObjCObjectPointerType *T, } void TypePrinter::printObjCObjectPointerAfter(const ObjCObjectPointerType *T, - raw_ostream &OS) { } + raw_ostream &OS) {} static const TemplateArgument &getArgument(const TemplateArgument &A) { return A; } |
