diff options
Diffstat (limited to 'lib/Sema/TreeTransform.h')
-rw-r--r-- | lib/Sema/TreeTransform.h | 28 |
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. |