diff options
| author | Douglas Gregor <dgregor@apple.com> | 2011-01-14 23:41:42 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2011-01-14 23:41:42 +0000 |
| commit | e1d60df0fc2f1083844edc40821a2545d4d40a72 (patch) | |
| tree | 26b5902b8b863a4caebe5e5e49db9c380f70f702 /clang/lib/AST | |
| parent | 714ab86491d2e8686b4d53fa98739e193f276d11 (diff) | |
| download | bcm5719-llvm-e1d60df0fc2f1083844edc40821a2545d4d40a72.tar.gz bcm5719-llvm-e1d60df0fc2f1083844edc40821a2545d4d40a72.zip | |
Teach template template argument pack expansions to keep track of the
number of expansions, when we know it, and propagate that information
through Sema.
llvm-svn: 123493
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/AST/ASTImporter.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/AST/DeclTemplate.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/AST/TemplateBase.cpp | 12 |
4 files changed, 16 insertions, 5 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index a98e0636d49..e1e6fd08aa2 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -2768,7 +2768,7 @@ ASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const { case TemplateArgument::TemplateExpansion: return TemplateArgument(getCanonicalTemplateName( Arg.getAsTemplateOrTemplatePattern()), - true); + Arg.getNumTemplateExpansions()); case TemplateArgument::Integral: return TemplateArgument(*Arg.getAsIntegral(), diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 7989b9f278b..f9fe18f5dfb 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -1823,7 +1823,7 @@ ASTNodeImporter::ImportTemplateArgument(const TemplateArgument &From) { if (ToTemplate.isNull()) return TemplateArgument(); - return TemplateArgument(ToTemplate, true); + return TemplateArgument(ToTemplate, From.getNumTemplateExpansions()); } case TemplateArgument::Expression: diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index e7902e996a9..b6716b34bdf 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -337,7 +337,10 @@ ClassTemplateDecl::getInjectedClassNameSpecialization() { Arg = TemplateArgument(E); } else { TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); - Arg = TemplateArgument(TemplateName(TTP), TTP->isParameterPack()); + if (TTP->isParameterPack()) + Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>()); + else + Arg = TemplateArgument(TemplateName(TTP)); } if ((*Param)->isTemplateParameterPack()) diff --git a/clang/lib/AST/TemplateBase.cpp b/clang/lib/AST/TemplateBase.cpp index 26c0c089718..f3def3eff2c 100644 --- a/clang/lib/AST/TemplateBase.cpp +++ b/clang/lib/AST/TemplateBase.cpp @@ -135,6 +135,14 @@ bool TemplateArgument::containsUnexpandedParameterPack() const { return false; } +llvm::Optional<unsigned> TemplateArgument::getNumTemplateExpansions() const { + assert(Kind == TemplateExpansion); + if (TemplateArg.NumExpansions) + return TemplateArg.NumExpansions - 1; + + return llvm::Optional<unsigned>(); +} + void TemplateArgument::Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const { ID.AddInteger(Kind); @@ -223,7 +231,7 @@ TemplateArgument TemplateArgument::getPackExpansionPattern() const { return cast<PackExpansionExpr>(getAsExpr())->getPattern(); case TemplateExpansion: - return TemplateArgument(getAsTemplateOrTemplatePattern(), false); + return TemplateArgument(getAsTemplateOrTemplatePattern()); case Declaration: case Integral: @@ -389,8 +397,8 @@ TemplateArgumentLoc::getPackExpansionPattern(SourceLocation &Ellipsis, } case TemplateArgument::TemplateExpansion: - // FIXME: Variadic templates num expansions Ellipsis = getTemplateEllipsisLoc(); + NumExpansions = Argument.getNumTemplateExpansions(); return TemplateArgumentLoc(Argument.getPackExpansionPattern(), getTemplateQualifierRange(), getTemplateNameLoc()); |

