From: Paolo Carlini Date: Sat, 25 May 2013 08:39:44 +0000 (+0000) Subject: re PR c++/25666 (Bad diagnostic for templated destructor as friend) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a544998ee31436a079b74ff6e29c5d4ade7b6ba7;p=gcc.git re PR c++/25666 (Bad diagnostic for templated destructor as friend) /cp 2013-05-25 Paolo Carlini PR c++/25666 * decl2.c (check_classfn): Check for destructors declared as member templates. /testsuite 2013-05-25 Paolo Carlini PR c++/25666 * g++.dg/parse/dtor16.C: New. * g++.dg/parse/dtor6.C: Adjust. From-SVN: r199324 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4d139557523..ed1d4796624 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-05-25 Paolo Carlini + + PR c++/25666 + * decl2.c (check_classfn): Check for destructors declared as member + templates. + 2013-05-24 Jason Merrill PR c++/56971 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 358a26f4a00..8119210fb06 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -646,6 +646,15 @@ check_classfn (tree ctype, tree function, tree template_parms) /* OK, is this a definition of a member template? */ is_template = (template_parms != NULL_TREE); + /* [temp.mem] + + A destructor shall not be a member template. */ + if (DECL_DESTRUCTOR_P (function) && is_template) + { + error ("destructor %qD declared as member template", function); + return error_mark_node; + } + /* We must enter the scope here, because conversion operators are named by target type, and type equivalence relies on typenames resolving within the scope of CTYPE. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a0278d5fe33..e0d4ccfd0b6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-05-25 Paolo Carlini + + PR c++/25666 + * g++.dg/parse/dtor16.C: New. + * g++.dg/parse/dtor6.C: Adjust. + 2013-05-24 Paolo Carlini PR c++/19618 diff --git a/gcc/testsuite/g++.dg/parse/dtor16.C b/gcc/testsuite/g++.dg/parse/dtor16.C new file mode 100644 index 00000000000..ff445c38865 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor16.C @@ -0,0 +1,8 @@ +// PR c++/25666 + +struct A { ~A(); }; + +struct B +{ + template friend A::~A(); // { dg-error "member template" } +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor6.C b/gcc/testsuite/g++.dg/parse/dtor6.C index 3333161c399..86370d5d402 100644 --- a/gcc/testsuite/g++.dg/parse/dtor6.C +++ b/gcc/testsuite/g++.dg/parse/dtor6.C @@ -1,8 +1,8 @@ // PR c++/25638 -struct A { ~A(); }; // { dg-error "candidate" } +struct A { ~A(); }; struct B : A { - template friend A::~A(); // { dg-error "match" } + template friend A::~A(); // { dg-error "member template" } };