aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-01-03 21:37:45 +0000
committerDouglas Gregor <dgregor@apple.com>2011-01-03 21:37:45 +0000
commit7a21fd45d4f04643cbfb5df96a01f84bc6d3dd14 (patch)
treed762ecc339711bceb432d81219247f98284c6e19 /lib/Sema
parentbacb9493770ff19cfd8f7bc46a075f14b4d08159 (diff)
Properly rebuild pack expansions whose pattern is a non-type template
argument. As part of this, be more careful when determining if there are any parameter packs that cannot be expanded. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122776 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema')
-rw-r--r--lib/Sema/SemaTemplate.cpp2
-rw-r--r--lib/Sema/SemaTemplateVariadic.cpp3
-rw-r--r--lib/Sema/TreeTransform.h13
3 files changed, 13 insertions, 5 deletions
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp
index c3cfbb8c25..1835899e80 100644
--- a/lib/Sema/SemaTemplate.cpp
+++ b/lib/Sema/SemaTemplate.cpp
@@ -3937,7 +3937,7 @@ static bool CheckNonTypeClassTemplatePartialSpecializationArgs(Sema &S,
continue;
}
- // We can have a pack expansion of any of the above.
+ // We can have a pack expansion of any of the bullets below.
if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(ArgExpr))
ArgExpr = Expansion->getPattern();
diff --git a/lib/Sema/SemaTemplateVariadic.cpp b/lib/Sema/SemaTemplateVariadic.cpp
index 828d2a3539..a3e308fe11 100644
--- a/lib/Sema/SemaTemplateVariadic.cpp
+++ b/lib/Sema/SemaTemplateVariadic.cpp
@@ -428,7 +428,8 @@ bool Sema::CheckParameterPacksForExpansion(SourceLocation EllipsisLoc,
// If we don't have a template argument at this depth/index, then we
// cannot expand the pack expansion. Make a note of this, but we still
// want to check any parameter packs we *do* have arguments for.
- if (!TemplateArgs.hasTemplateArgument(Depth, Index)) {
+ if (Depth >= TemplateArgs.getNumLevels() ||
+ !TemplateArgs.hasTemplateArgument(Depth, Index)) {
ShouldExpand = false;
continue;
}
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index 9088ae0fef..c38902a3e9 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -2102,11 +2102,18 @@ public:
TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
SourceLocation EllipsisLoc) {
switch (Pattern.getArgument().getKind()) {
- case TemplateArgument::Expression:
- // FIXME: We should be able to handle this now!
+ case TemplateArgument::Expression: {
+ ExprResult Result
+ = getSema().ActOnPackExpansion(Pattern.getSourceExpression(),
+ EllipsisLoc);
+ if (Result.isInvalid())
+ return TemplateArgumentLoc();
+
+ return TemplateArgumentLoc(Result.get(), Result.get());
+ }
case TemplateArgument::Template:
- llvm_unreachable("Unsupported pack expansion of expressions/templates");
+ llvm_unreachable("Unsupported pack expansion of templates");
case TemplateArgument::Null:
case TemplateArgument::Integral: