mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-11 02:16:50 +00:00
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:
parent
5e985ee5b5
commit
3298368de9
@ -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()
|
||||
|
@ -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<>'}}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user