mirror of
https://github.com/intel/llvm.git
synced 2026-02-04 03:26:06 +08:00
Diagnose destructor templates. Fixes PR7904.
llvm-svn: 127042
This commit is contained in:
@@ -799,6 +799,9 @@ def err_destructor_expr_type_mismatch : Error<
|
||||
def note_destructor_type_here : Note<
|
||||
"type %0 is declared here">;
|
||||
|
||||
def err_destructor_template : Error<
|
||||
"destructor cannot be declared as a template">;
|
||||
|
||||
// C++ initialization
|
||||
def err_init_conversion_failed : Error<
|
||||
"cannot initialize %select{a variable|a parameter|return object|an "
|
||||
|
||||
@@ -3755,7 +3755,7 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
|
||||
// determine whether we have a template or a template specialization.
|
||||
bool Invalid = false;
|
||||
if (TemplateParameterList *TemplateParams
|
||||
= MatchTemplateParametersToScopeSpecifier(
|
||||
= MatchTemplateParametersToScopeSpecifier(
|
||||
D.getDeclSpec().getSourceRange().getBegin(),
|
||||
D.getCXXScopeSpec(),
|
||||
TemplateParamLists.get(),
|
||||
@@ -3773,6 +3773,13 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
|
||||
if (CheckTemplateDeclScope(S, TemplateParams))
|
||||
return 0;
|
||||
|
||||
// A destructor cannot be a template.
|
||||
if (Name.getNameKind() == DeclarationName::CXXDestructorName) {
|
||||
Diag(NewFD->getLocation(), diag::err_destructor_template);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
FunctionTemplate = FunctionTemplateDecl::Create(Context, DC,
|
||||
NewFD->getLocation(),
|
||||
Name, TemplateParams,
|
||||
|
||||
@@ -64,11 +64,11 @@ namespace test4 {
|
||||
}
|
||||
|
||||
namespace rdar8529993 {
|
||||
struct A { ~A(); }; // expected-note {{nearly matches}}
|
||||
struct A { ~A(); };
|
||||
|
||||
struct B : A
|
||||
{
|
||||
template<int> friend A::~A(); // expected-error {{does not match}}
|
||||
template<int> friend A::~A(); // expected-error {{destructor cannot be declared as a template}}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -50,3 +50,10 @@ namespace PR7239 {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
namespace PR7904 {
|
||||
struct Foo {
|
||||
template <int i> ~Foo() {} // expected-error{{destructor cannot be declared as a template}}
|
||||
};
|
||||
Foo f;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user