const TemplateArgument &Param,
const TemplateArgument &Arg,
TemplateDeductionInfo &Info,
- llvm::SmallVectorImpl<DeducedTemplateArgument> &Deduced);
+ llvm::SmallVectorImpl<DeducedTemplateArgument> &Deduced);
static Sema::TemplateDeductionResult
DeduceTemplateArguments(Sema &S,
const TemplateArgument *Params, unsigned NumParams,
const TemplateArgument *Args, unsigned NumArgs,
TemplateDeductionInfo &Info,
- llvm::SmallVectorImpl<DeducedTemplateArgument> &Deduced);
+ llvm::SmallVectorImpl<DeducedTemplateArgument> &Deduced,
+ bool NumberOfArgumentsMustMatch = true);
/// \brief If the given expression is of a form that permits the deduction
/// of a non-type template parameter, return the declaration of that
// Perform template argument deduction on each template
- // argument.
- // FIXME: This "min" function isn't going to work in general. We should
- // probably pass down a flag that allows too few/too many arguments.
- unsigned NumArgs = std::min(SpecArg->getNumArgs(), Param->getNumArgs());
+ // argument. Ignore any missing/extra arguments, since they could be
+ // filled in by default arguments.
return DeduceTemplateArguments(S, TemplateParams,
- Param->getArgs(), NumArgs,
- SpecArg->getArgs(), NumArgs,
- Info, Deduced);
+ Param->getArgs(), Param->getNumArgs(),
+ SpecArg->getArgs(), SpecArg->getNumArgs(),
+ Info, Deduced,
+ /*NumberOfArgumentsMustMatch=*/false);
}
// If the argument type is a class template specialization, we
const TemplateArgument *Params, unsigned NumParams,
const TemplateArgument *Args, unsigned NumArgs,
TemplateDeductionInfo &Info,
- llvm::SmallVectorImpl<DeducedTemplateArgument> &Deduced) {
+ llvm::SmallVectorImpl<DeducedTemplateArgument> &Deduced,
+ bool NumberOfArgumentsMustMatch) {
unsigned ArgIdx = 0, ParamIdx = 0;
for (; hasTemplateArgumentForDeduction(Params, ParamIdx, NumParams);
++ParamIdx) {
// Check whether we have enough arguments.
if (!hasTemplateArgumentForDeduction(Args, ArgIdx, NumArgs))
- return Sema::TDK_TooFewArguments;
+ return NumberOfArgumentsMustMatch? Sema::TDK_TooFewArguments
+ : Sema::TDK_Success;
// Perform deduction for this P/A pair.
if (Sema::TemplateDeductionResult Result
}
// If there is an argument remaining, then we had too many arguments.
- if (hasTemplateArgumentForDeduction(Args, ArgIdx, NumArgs))
+ if (NumberOfArgumentsMustMatch &&
+ hasTemplateArgumentForDeduction(Args, ArgIdx, NumArgs))
return Sema::TDK_TooManyArguments;
return Sema::TDK_Success;
--- /dev/null
+// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s
+
+template<typename T, typename U>
+struct is_same {
+ static const bool value = false;
+};
+
+template<typename T>
+struct is_same<T, T> {
+ static const bool value = true;
+};
+
+// Simple metafunction that replaces the template arguments of
+// template template parameters with 'int'.
+template<typename T>
+struct EverythingToInt;
+
+template<template<typename ...> class TT, typename T1, typename T2>
+struct EverythingToInt<TT<T1, T2> > {
+ typedef TT<int, int> type;
+};
+
+template<typename...> struct tuple { };
+
+int check0[is_same<EverythingToInt<tuple<double, float>>::type,
+ tuple<int, int>>::value? 1 : -1];