зеркало из https://github.com/microsoft/clang-1.git
Tighten up checking of non-dependent arguments as part of template
argument deduction. This fixes the new test case (since partial ordering does not have a "verify the results of deduction" step), and will allow failed template argument deductions to return more quickly for, e.g., matching class template partial specializations. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81779 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
a7c5b0832c
Коммит
1282029f3d
|
@ -39,7 +39,11 @@ namespace clang {
|
|||
/// \brief Within template argument deduction from a function call,
|
||||
/// we are matching in a case where we can perform template argument
|
||||
/// deduction from a template-id of a derived class of the argument type.
|
||||
TDF_DerivedClass = 0x04
|
||||
TDF_DerivedClass = 0x04,
|
||||
/// \brief Allow non-dependent types to differ, e.g., when performing
|
||||
/// template argument deduction from a function call where conversions
|
||||
/// may apply.
|
||||
TDF_SkipNonDependent = 0x08
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -378,8 +382,14 @@ DeduceTemplateArguments(ASTContext &Context,
|
|||
}
|
||||
|
||||
// If the parameter type is not dependent, there is nothing to deduce.
|
||||
if (!Param->isDependentType())
|
||||
if (!Param->isDependentType()) {
|
||||
if (!(TDF & TDF_SkipNonDependent) && Param != Arg) {
|
||||
|
||||
return Sema::TDK_NonDeducedMismatch;
|
||||
}
|
||||
|
||||
return Sema::TDK_Success;
|
||||
}
|
||||
|
||||
// C++ [temp.deduct.type]p9:
|
||||
// A template type argument T, a template template argument TT or a
|
||||
|
@ -1368,7 +1378,7 @@ Sema::DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,
|
|||
// In general, the deduction process attempts to find template argument
|
||||
// values that will make the deduced A identical to A (after the type A
|
||||
// is transformed as described above). [...]
|
||||
unsigned TDF = 0;
|
||||
unsigned TDF = TDF_SkipNonDependent;
|
||||
|
||||
// - If the original P is a reference type, the deduced A (i.e., the
|
||||
// type referred to by the reference) can be more cv-qualified than
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
// RUN: clang-cc -fsyntax-only %s
|
||||
|
||||
template <class T> T* f(int); // #1
|
||||
template <class T, class U> T& f(U); // #2
|
||||
|
||||
void g() {
|
||||
int *ip = f<int>(1); // calls #1
|
||||
}
|
||||
|
||||
// FIXME: test occurrences of template parameters in non-deduced contexts.
|
Загрузка…
Ссылка в новой задаче