diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-05 18:58:31 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-05 18:58:31 +0000 |
commit | a7fc901a2e39bfe55bfcff5934b2d9fdf9656491 (patch) | |
tree | f6b1e6428fb15d6d480a43252cffba3607577fd7 /lib/AST/TemplateBase.cpp | |
parent | cbf40f913aa2aa5de6e0540fed209405d00a2c69 (diff) |
Replace the representation of template template argument pack
expansions with something that is easier to use correctly: a new
template argment kind, rather than a bit on an existing kind. Update
all of the switch statements that deal with template arguments, fixing
a few latent bugs in the process. I"m happy with this representation,
now.
And, oh look! Template instantiation and deduction work for template
template argument pack expansions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122896 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/TemplateBase.cpp')
-rw-r--r-- | lib/AST/TemplateBase.cpp | 87 |
1 files changed, 49 insertions, 38 deletions
diff --git a/lib/AST/TemplateBase.cpp b/lib/AST/TemplateBase.cpp index 6eae6a4192..de5531f0f7 100644 --- a/lib/AST/TemplateBase.cpp +++ b/lib/AST/TemplateBase.cpp @@ -39,7 +39,10 @@ bool TemplateArgument::isDependent() const { case Template: return getAsTemplate().isDependent(); - + + case TemplateExpansion: + return true; + case Declaration: if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl())) return DC->isDependentContext(); @@ -70,14 +73,15 @@ bool TemplateArgument::isPackExpansion() const { case Declaration: case Integral: case Pack: + case Template: return false; + case TemplateExpansion: + return true; + case Type: return isa<PackExpansionType>(getAsType()); - - case Template: - return TemplateArg.PackExpansion; - + case Expression: return isa<PackExpansionExpr>(getAsExpr()); } @@ -90,6 +94,7 @@ bool TemplateArgument::containsUnexpandedParameterPack() const { case Null: case Declaration: case Integral: + case TemplateExpansion: break; case Type: @@ -98,8 +103,7 @@ bool TemplateArgument::containsUnexpandedParameterPack() const { break; case Template: - if (!TemplateArg.PackExpansion && - getAsTemplate().containsUnexpandedParameterPack()) + if (getAsTemplate().containsUnexpandedParameterPack()) return true; break; @@ -135,20 +139,22 @@ void TemplateArgument::Profile(llvm::FoldingSetNodeID &ID, break; case Template: - ID.AddBoolean(TemplateArg.PackExpansion); + case TemplateExpansion: { + TemplateName Template = getAsTemplateOrTemplatePattern(); if (TemplateTemplateParmDecl *TTP = dyn_cast_or_null<TemplateTemplateParmDecl>( - getAsTemplate().getAsTemplateDecl())) { + Template.getAsTemplateDecl())) { ID.AddBoolean(true); ID.AddInteger(TTP->getDepth()); ID.AddInteger(TTP->getPosition()); ID.AddBoolean(TTP->isParameterPack()); } else { ID.AddBoolean(false); - ID.AddPointer(Context.getCanonicalTemplateName(getAsTemplate()) - .getAsVoidPointer()); + ID.AddPointer(Context.getCanonicalTemplateName(Template) + .getAsVoidPointer()); } break; + } case Integral: getAsIntegral()->Profile(ID); @@ -173,13 +179,11 @@ bool TemplateArgument::structurallyEquals(const TemplateArgument &Other) const { case Null: case Type: case Declaration: - case Expression: + case Expression: + case Template: + case TemplateExpansion: return TypeOrValue == Other.TypeOrValue; - case Template: - return TemplateArg.Template == Other.TemplateArg.Template && - TemplateArg.PackExpansion == Other.TemplateArg.PackExpansion; - case Integral: return getIntegralType() == Other.getIntegralType() && *getAsIntegral() == *Other.getAsIntegral(); @@ -206,13 +210,14 @@ TemplateArgument TemplateArgument::getPackExpansionPattern() const { case Expression: return cast<PackExpansionExpr>(getAsExpr())->getPattern(); - case Template: - return TemplateArgument(getAsTemplate(), false); + case TemplateExpansion: + return TemplateArgument(getAsTemplateOrTemplatePattern(), false); case Declaration: case Integral: case Pack: case Null: + case Template: return TemplateArgument(); } @@ -248,13 +253,15 @@ void TemplateArgument::print(const PrintingPolicy &Policy, break; } - case Template: { + case Template: getAsTemplate().print(Out, Policy); - if (TemplateArg.PackExpansion) - Out << "..."; break; - } - + + case TemplateExpansion: + getAsTemplateOrTemplatePattern().print(Out, Policy); + Out << "..."; + break; + case Integral: { Out << getAsIntegral()->toString(10); break; @@ -299,15 +306,18 @@ SourceRange TemplateArgumentLoc::getSourceRange() const { else return SourceRange(); - case TemplateArgument::Template: { - SourceLocation End = getTemplateNameLoc(); - if (getTemplateEllipsisLoc().isValid()) - End = getTemplateEllipsisLoc(); + case TemplateArgument::Template: if (getTemplateQualifierRange().isValid()) - return SourceRange(getTemplateQualifierRange().getBegin(), End); - return SourceRange(getTemplateNameLoc(), End); - } - + return SourceRange(getTemplateQualifierRange().getBegin(), + getTemplateNameLoc()); + return SourceRange(getTemplateNameLoc()); + + case TemplateArgument::TemplateExpansion: + if (getTemplateQualifierRange().isValid()) + return SourceRange(getTemplateQualifierRange().getBegin(), + getTemplateEllipsisLoc()); + return SourceRange(getTemplateNameLoc(), getTemplateEllipsisLoc()); + case TemplateArgument::Integral: case TemplateArgument::Pack: case TemplateArgument::Null: @@ -355,13 +365,14 @@ TemplateArgumentLoc::getPackExpansionPattern(SourceLocation &Ellipsis, Expr *Pattern = cast<PackExpansionExpr>(Argument.getAsExpr())->getPattern(); return TemplateArgumentLoc(Pattern, Pattern); } - - case TemplateArgument::Template: + + case TemplateArgument::TemplateExpansion: return TemplateArgumentLoc(Argument.getPackExpansionPattern(), getTemplateQualifierRange(), getTemplateNameLoc()); case TemplateArgument::Declaration: + case TemplateArgument::Template: case TemplateArgument::Integral: case TemplateArgument::Pack: case TemplateArgument::Null: @@ -389,11 +400,11 @@ const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB, return DB << Arg.getAsIntegral()->toString(10); case TemplateArgument::Template: - DB << Arg.getAsTemplate(); - if (Arg.isPackExpansion()) - DB << "..."; - return DB; - + return DB << Arg.getAsTemplate(); + + case TemplateArgument::TemplateExpansion: + return DB << Arg.getAsTemplateOrTemplatePattern() << "..."; + case TemplateArgument::Expression: { // This shouldn't actually ever happen, so it's okay that we're // regurgitating an expression here. |