aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/TreeTransform.h
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-01-10 20:53:55 +0000
committerDouglas Gregor <dgregor@apple.com>2011-01-10 20:53:55 +0000
commit3cae5c9a79bfd2e27eb44c32b13dfacd2ce5c66f (patch)
treecd4c94c262457dba148216d46f19fbb579577a80 /lib/Sema/TreeTransform.h
parent8dbfbf4c95251c69a455d4d016d6c7890c932007 (diff)
Implement more of C++0x [temp.arg.explicit]p9, allowing extension of
pack expansions in template argument lists and function parameter lists. The implementation of this paragraph should be complete *except* for cases where we're substituting into one of the unexpanded packs in a pack expansion; that's a general issue I haven't solved yet. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123188 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/TreeTransform.h')
-rw-r--r--lib/Sema/TreeTransform.h28
1 files changed, 26 insertions, 2 deletions
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index 7eee444174..bc1ac1e6ae 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -2850,7 +2850,20 @@ bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First,
Outputs.addArgument(Out);
}
- // FIXME: Variadic templates retain expansion!
+ // If we're supposed to retain a pack expansion, do so by temporarily
+ // forgetting the partially-substituted parameter pack.
+ if (RetainExpansion) {
+ ForgetPartiallySubstitutedPackRAII Forget(getDerived());
+
+ if (getDerived().TransformTemplateArgument(Pattern, Out))
+ return true;
+
+ Out = getDerived().RebuildPackExpansion(Out, Ellipsis);
+ if (Out.getArgument().isNull())
+ return true;
+
+ Outputs.addArgument(Out);
+ }
continue;
}
@@ -3564,7 +3577,18 @@ bool TreeTransform<Derived>::
continue;
}
- // FIXME: Variadic templates retain pack expansion!
+ // If we're supposed to retain a pack expansion, do so by temporarily
+ // forgetting the partially-substituted parameter pack.
+ if (RetainExpansion) {
+ ForgetPartiallySubstitutedPackRAII Forget(getDerived());
+ QualType NewType = getDerived().TransformType(Pattern);
+ if (NewType.isNull())
+ return true;
+
+ OutParamTypes.push_back(NewType);
+ if (PVars)
+ PVars->push_back(0);
+ }
// We'll substitute the parameter now without expanding the pack
// expansion.