From: Douglas Gregor Date: Fri, 4 Mar 2011 22:45:55 +0000 (+0000) Subject: Diagnose destructor templates. Fixes PR7904. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cb710a4df50b79659399f0722ea29e90251ea834;p=clang Diagnose destructor templates. Fixes PR7904. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@127042 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 38e072e8de..f661bdb274 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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 " diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 10d92029f8..e6c459504e 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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, diff --git a/test/SemaCXX/friend.cpp b/test/SemaCXX/friend.cpp index 1222dd0940..b1ef220e53 100644 --- a/test/SemaCXX/friend.cpp +++ b/test/SemaCXX/friend.cpp @@ -64,11 +64,11 @@ namespace test4 { } namespace rdar8529993 { -struct A { ~A(); }; // expected-note {{nearly matches}} +struct A { ~A(); }; struct B : A { - template friend A::~A(); // expected-error {{does not match}} + template friend A::~A(); // expected-error {{destructor cannot be declared as a template}} }; } diff --git a/test/SemaTemplate/destructor-template.cpp b/test/SemaTemplate/destructor-template.cpp index 6fe7f69cdd..07beda40aa 100644 --- a/test/SemaTemplate/destructor-template.cpp +++ b/test/SemaTemplate/destructor-template.cpp @@ -50,3 +50,10 @@ namespace PR7239 { } }; } + +namespace PR7904 { + struct Foo { + template ~Foo() {} // expected-error{{destructor cannot be declared as a template}} + }; + Foo f; +}