diff options
Diffstat (limited to 'clang/lib/AST/TemplateBase.cpp')
-rw-r--r-- | clang/lib/AST/TemplateBase.cpp | 142 |
1 files changed, 39 insertions, 103 deletions
diff --git a/clang/lib/AST/TemplateBase.cpp b/clang/lib/AST/TemplateBase.cpp index db16c2a06b64..6a3d2b30e46e 100644 --- a/clang/lib/AST/TemplateBase.cpp +++ b/clang/lib/AST/TemplateBase.cpp @@ -16,6 +16,7 @@ #include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" #include "clang/AST/DeclTemplate.h" +#include "clang/AST/DependenceFlags.h" #include "clang/AST/Expr.h" #include "clang/AST/ExprCXX.h" #include "clang/AST/PrettyPrinter.h" @@ -111,84 +112,60 @@ TemplateArgument::CreatePackCopy(ASTContext &Context, return TemplateArgument(Args.copy(Context)); } -bool TemplateArgument::isDependent() const { +TemplateArgumentDependence TemplateArgument::getDependence() const { + auto Deps = TemplateArgumentDependence::None; switch (getKind()) { case Null: llvm_unreachable("Should not have a NULL template argument"); case Type: - return getAsType()->isDependentType() || - isa<PackExpansionType>(getAsType()); + Deps = toTemplateArgumentDependence(getAsType()->getDependence()); + if (isa<PackExpansionType>(getAsType())) + Deps |= TemplateArgumentDependence::Dependent; + return Deps; case Template: - return getAsTemplate().isDependent(); + return toTemplateArgumentDependence(getAsTemplate().getDependence()); case TemplateExpansion: - return true; + return TemplateArgumentDependence::Dependent | + TemplateArgumentDependence::Instantiation; - case Declaration: - if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl())) - return DC->isDependentContext(); - return getAsDecl()->getDeclContext()->isDependentContext(); + case Declaration: { + auto *DC = dyn_cast<DeclContext>(getAsDecl()); + if (!DC) + DC = getAsDecl()->getDeclContext(); + if (DC->isDependentContext()) + Deps = TemplateArgumentDependence::Dependent | + TemplateArgumentDependence::Instantiation; + return Deps; + } case NullPtr: - return false; - case Integral: - // Never dependent - return false; + return TemplateArgumentDependence::None; case Expression: - return (getAsExpr()->isTypeDependent() || getAsExpr()->isValueDependent() || - isa<PackExpansionExpr>(getAsExpr())); + Deps = toTemplateArgumentDependence(getAsExpr()->getDependence()); + if (isa<PackExpansionExpr>(getAsExpr())) + Deps |= TemplateArgumentDependence::Dependent | + TemplateArgumentDependence::Instantiation; + return Deps; case Pack: for (const auto &P : pack_elements()) - if (P.isDependent()) - return true; - return false; + Deps |= P.getDependence(); + return Deps; } + llvm_unreachable("unhandled ArgKind"); +} - llvm_unreachable("Invalid TemplateArgument Kind!"); +bool TemplateArgument::isDependent() const { + return getDependence() & TemplateArgumentDependence::Dependent; } bool TemplateArgument::isInstantiationDependent() const { - switch (getKind()) { - case Null: - llvm_unreachable("Should not have a NULL template argument"); - - case Type: - return getAsType()->isInstantiationDependentType(); - - case Template: - return getAsTemplate().isInstantiationDependent(); - - case TemplateExpansion: - return true; - - case Declaration: - if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl())) - return DC->isDependentContext(); - return getAsDecl()->getDeclContext()->isDependentContext(); - - case NullPtr: - return false; - - case Integral: - // Never dependent - return false; - - case Expression: - return getAsExpr()->isInstantiationDependent(); - - case Pack: - for (const auto &P : pack_elements()) - if (P.isInstantiationDependent()) - return true; - return false; - } - - llvm_unreachable("Invalid TemplateArgument Kind!"); + return getDependence() & TemplateArgumentDependence::Instantiation; } bool TemplateArgument::isPackExpansion() const { @@ -215,38 +192,7 @@ bool TemplateArgument::isPackExpansion() const { } bool TemplateArgument::containsUnexpandedParameterPack() const { - switch (getKind()) { - case Null: - case Declaration: - case Integral: - case TemplateExpansion: - case NullPtr: - break; - - case Type: - if (getAsType()->containsUnexpandedParameterPack()) - return true; - break; - - case Template: - if (getAsTemplate().containsUnexpandedParameterPack()) - return true; - break; - - case Expression: - if (getAsExpr()->containsUnexpandedParameterPack()) - return true; - break; - - case Pack: - for (const auto &P : pack_elements()) - if (P.containsUnexpandedParameterPack()) - return true; - - break; - } - - return false; + return getDependence() & TemplateArgumentDependence::UnexpandedPack; } Optional<unsigned> TemplateArgument::getNumTemplateExpansions() const { @@ -406,13 +352,9 @@ void TemplateArgument::print(const PrintingPolicy &Policy, case Declaration: { NamedDecl *ND = getAsDecl(); - Out << '&'; - if (ND->getDeclName()) { - // FIXME: distinguish between pointer and reference args? - ND->printQualifiedName(Out); - } else { - Out << "(anonymous)"; - } + if (!getParamTypeForDecl()->isReferenceType()) + Out << '&'; + ND->printQualifiedName(Out); break; } @@ -561,7 +503,7 @@ const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB, } const ASTTemplateArgumentListInfo * -ASTTemplateArgumentListInfo::Create(ASTContext &C, +ASTTemplateArgumentListInfo::Create(const ASTContext &C, const TemplateArgumentListInfo &List) { std::size_t size = totalSizeToAlloc<TemplateArgumentLoc>(List.size()); void *Mem = C.Allocate(size, alignof(ASTTemplateArgumentListInfo)); @@ -601,20 +543,14 @@ void ASTTemplateKWAndArgsInfo::initializeFrom(SourceLocation TemplateKWLoc) { void ASTTemplateKWAndArgsInfo::initializeFrom( SourceLocation TemplateKWLoc, const TemplateArgumentListInfo &Info, - TemplateArgumentLoc *OutArgArray, bool &Dependent, - bool &InstantiationDependent, bool &ContainsUnexpandedParameterPack) { + TemplateArgumentLoc *OutArgArray, TemplateArgumentDependence &Deps) { this->TemplateKWLoc = TemplateKWLoc; LAngleLoc = Info.getLAngleLoc(); RAngleLoc = Info.getRAngleLoc(); NumTemplateArgs = Info.size(); for (unsigned i = 0; i != NumTemplateArgs; ++i) { - Dependent = Dependent || Info[i].getArgument().isDependent(); - InstantiationDependent = InstantiationDependent || - Info[i].getArgument().isInstantiationDependent(); - ContainsUnexpandedParameterPack = - ContainsUnexpandedParameterPack || - Info[i].getArgument().containsUnexpandedParameterPack(); + Deps |= Info[i].getArgument().getDependence(); new (&OutArgArray[i]) TemplateArgumentLoc(Info[i]); } |