From: reichelt Date: Tue, 24 Jan 2006 11:55:58 +0000 (+0000) Subject: PR c++/25552 X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=a32f68f58d919e02f885b817337f5ad369dfd156 PR c++/25552 * parser.c (cp_parser_unqualified_id): Check that destructor name and scope match. * call.c (check_dtor_name): Do not expect a BIT_NOT_EXPR. Adjust comment. Return early if possible. Use same_type_p to compare types. * typeck.c (lookup_destructor): Adjust call to check_dtor_name. * g++.dg/parse/dtor8.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@110168 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f68f278500d..3ff6c91434c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2006-01-24 Volker Reichelt + + PR c++/25552 + * parser.c (cp_parser_unqualified_id): Check that destructor name + and scope match. + * call.c (check_dtor_name): Do not expect a BIT_NOT_EXPR. + Adjust comment. Return early if possible. + Use same_type_p to compare types. + * typeck.c (lookup_destructor): Adjust call to check_dtor_name. + 2006-01-24 Mark Mitchell * semantics.c: Remove outdated comment. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 0c23caa20a3..79001763016 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -198,15 +198,12 @@ typedef void (*diagnostic_fn_t) (const char *, ...) ATTRIBUTE_GCC_CXXDIAG(1,2); static tree build_temp (tree, tree, int, diagnostic_fn_t *); static void check_constructor_callable (tree, tree); -/* Returns nonzero iff the destructor name specified in NAME - (a BIT_NOT_EXPR) matches BASETYPE. The operand of NAME can take many - forms... */ +/* Returns nonzero iff the destructor name specified in NAME matches BASETYPE. + NAME can take many forms... */ bool check_dtor_name (tree basetype, tree name) { - name = TREE_OPERAND (name, 0); - /* Just accept something we've already complained about. */ if (name == error_mark_node) return true; @@ -220,7 +217,7 @@ check_dtor_name (tree basetype, tree name) if ((IS_AGGR_TYPE (basetype) && name == constructor_name (basetype)) || (TREE_CODE (basetype) == ENUMERAL_TYPE && name == TYPE_IDENTIFIER (basetype))) - name = basetype; + return true; else name = get_type_value (name); } @@ -237,9 +234,9 @@ check_dtor_name (tree basetype, tree name) return false; } - if (name && TYPE_MAIN_VARIANT (basetype) == TYPE_MAIN_VARIANT (name)) - return true; - return false; + if (!name) + return false; + return same_type_p (TYPE_MAIN_VARIANT (basetype), TYPE_MAIN_VARIANT (name)); } /* We want the address of a function or method. We avoid creating a diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 4c09b2fde9b..3ba92852a77 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -3434,6 +3434,15 @@ cp_parser_unqualified_id (cp_parser* parser, else if (type_decl == error_mark_node) return error_mark_node; + /* Check that destructor name and scope match. */ + if (declarator_p && scope && !check_dtor_name (scope, type_decl)) + { + if (!cp_parser_uncommitted_to_tentative_parse_p (parser)) + error ("declaration of %<~%T%> as member of %qT", + type_decl, scope); + return error_mark_node; + } + /* [class.dtor] A typedef-name that names a class shall not be used as the diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 49deccc0ad3..5eb4b644426 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1828,7 +1828,7 @@ lookup_destructor (tree object, tree scope, tree dtor_name) tree dtor_type = TREE_OPERAND (dtor_name, 0); tree expr; - if (scope && !check_dtor_name (scope, dtor_name)) + if (scope && !check_dtor_name (scope, dtor_type)) { error ("qualified type %qT does not match destructor name ~%qT", scope, dtor_type); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aa0ed47e635..3434543725a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-01-24 Volker Reichelt + + PR c++/25552 + * g++.dg/parse/dtor8.C: New test. + 2006-01-24 Hans-Peter Nilsson PR testsuite/25891 diff --git a/gcc/testsuite/g++.dg/parse/dtor8.C b/gcc/testsuite/g++.dg/parse/dtor8.C new file mode 100644 index 00000000000..2fe0a974bb9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor8.C @@ -0,0 +1,8 @@ +// { dg-do compile } + +struct A {}; + +struct B +{ + friend A::~B(); // { dg-error "as member of" } +};