diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-10 20:53:55 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-10 20:53:55 +0000 |
commit | 48d2411597e8a1d21eca6e9ad078d1ed220460e4 (patch) | |
tree | 5f23f28d6efd3743b150d0120c2849c4b6593f46 /clang/lib | |
parent | 02960224aa5ebbdd2a7940a5f64231157d5aad2f (diff) | |
download | bcm5719-llvm-48d2411597e8a1d21eca6e9ad078d1ed220460e4.tar.gz bcm5719-llvm-48d2411597e8a1d21eca6e9ad078d1ed220460e4.zip |
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.
llvm-svn: 123188
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaTemplateDeduction.cpp | 15 | ||||
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 28 |
2 files changed, 32 insertions, 11 deletions
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 02e1a42dc39..842ad5c188c 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -636,8 +636,7 @@ DeduceTemplateArguments(Sema &S, if (NumParams != NumArgs && !(NumParams && isa<PackExpansionType>(Params[NumParams - 1])) && !(NumArgs && isa<PackExpansionType>(Args[NumArgs - 1]))) - return NumArgs < NumParams ? Sema::TDK_TooFewArguments - : Sema::TDK_TooManyArguments; + return Sema::TDK_NonDeducedMismatch; // C++0x [temp.deduct.type]p10: // Similarly, if P has a form that contains (T), then each parameter type @@ -654,7 +653,7 @@ DeduceTemplateArguments(Sema &S, // Make sure we have an argument. if (ArgIdx >= NumArgs) - return Sema::TDK_TooFewArguments; + return Sema::TDK_NonDeducedMismatch; if (Sema::TemplateDeductionResult Result = DeduceTemplateArguments(S, TemplateParams, @@ -736,7 +735,7 @@ DeduceTemplateArguments(Sema &S, // Make sure we don't have any extra arguments. if (ArgIdx < NumArgs) - return Sema::TDK_TooManyArguments; + return Sema::TDK_NonDeducedMismatch; return Sema::TDK_Success; } @@ -788,10 +787,8 @@ DeduceTemplateArguments(Sema &S, // If the parameter type is not dependent, there is nothing to deduce. if (!Param->isDependentType()) { - if (!(TDF & TDF_SkipNonDependent) && Param != Arg) { - + if (!(TDF & TDF_SkipNonDependent) && Param != Arg) return Sema::TDK_NonDeducedMismatch; - } return Sema::TDK_Success; } @@ -1365,7 +1362,7 @@ DeduceTemplateArguments(Sema &S, // Check whether we have enough arguments. if (!hasTemplateArgumentForDeduction(Args, ArgIdx, NumArgs)) - return NumberOfArgumentsMustMatch? Sema::TDK_TooFewArguments + return NumberOfArgumentsMustMatch? Sema::TDK_NonDeducedMismatch : Sema::TDK_Success; // Perform deduction for this Pi/Ai pair. @@ -1459,7 +1456,7 @@ DeduceTemplateArguments(Sema &S, // If there is an argument remaining, then we had too many arguments. if (NumberOfArgumentsMustMatch && hasTemplateArgumentForDeduction(Args, ArgIdx, NumArgs)) - return Sema::TDK_TooManyArguments; + return Sema::TDK_NonDeducedMismatch; return Sema::TDK_Success; } diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 7eee4441740..bc1ac1e6ae9 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/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. |