PR18246: When performing template argument deduction to decide which template

is specialized by an explicit specialization, start from the first declaration
in case we've got a member of a class template (redeclarations might not number
the template parameters the same way).

Our recover here is still far from ideal.

llvm-svn: 197305
This commit is contained in:
Richard Smith 2013-12-14 03:18:05 +00:00
parent 5e985ee5b5
commit 3298368de9
2 changed files with 22 additions and 3 deletions

View File

@ -6521,9 +6521,9 @@ bool Sema::CheckFunctionTemplateSpecialization(
// FIXME: It is somewhat wasteful to build
TemplateDeductionInfo Info(FailedCandidates.getLocation());
FunctionDecl *Specialization = 0;
if (TemplateDeductionResult TDK
= DeduceTemplateArguments(FunTmpl, ExplicitTemplateArgs, FT,
Specialization, Info)) {
if (TemplateDeductionResult TDK = DeduceTemplateArguments(
cast<FunctionTemplateDecl>(FunTmpl->getFirstDecl()),
ExplicitTemplateArgs, FT, Specialization, Info)) {
// Template argument deduction failed; record why it failed, so
// that we can provide nifty diagnostics.
FailedCandidates.addCandidate()

View File

@ -28,3 +28,22 @@ namespace PR12331 {
};
template<> struct S<int>::U { static const int n = sizeof(int); }; // expected-error {{explicit specialization of 'U' after instantiation}}
}
namespace PR18246 {
template<typename T>
class Baz {
public:
template<int N> void bar();
};
template<typename T>
template<int N>
void Baz<T>::bar() {
}
// FIXME: Don't suggest the 'template<>' correction here, because this cannot
// be an explicit specialization.
template<typename T>
void Baz<T>::bar<0>() { // expected-error {{requires 'template<>'}}
}
}