summaryrefslogtreecommitdiffstats
path: root/clang/lib
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
commit48d2411597e8a1d21eca6e9ad078d1ed220460e4 (patch)
tree5f23f28d6efd3743b150d0120c2849c4b6593f46 /clang/lib
parent02960224aa5ebbdd2a7940a5f64231157d5aad2f (diff)
downloadbcm5719-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.cpp15
-rw-r--r--clang/lib/Sema/TreeTransform.h28
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.
OpenPOWER on IntegriCloud