From: Jason Merrill Date: Wed, 20 Mar 2002 20:09:06 +0000 (-0500) Subject: re PR c++/2136 (g++ seems to disregard '::' in '::delete') X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=569c596016724a6dfe25b97ec3c75a9ab8fff6ac;p=thirdparty%2Fgcc.git re PR c++/2136 (g++ seems to disregard '::' in '::delete') PR c++/2136 * init.c (build_delete): Check access for a member op delete here. * decl2.c (delete_sanity): Not here. From-SVN: r51082 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3dc962156660..68f3be03c37a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2002-03-20 Jason Merrill + + PR c++/2136 + * init.c (build_delete): Check access for a member op delete here. + * decl2.c (delete_sanity): Not here. + 2002-03-18 Jason Merrill PR c++/4222, c++/5995 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 0f279bc0d53a..8cff1cb3e807 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1230,21 +1230,8 @@ delete_sanity (exp, size, doing_vec, use_global_delete) return build_vec_delete (t, maxindex, sfk_deleting_destructor, use_global_delete); else - { - if (IS_AGGR_TYPE (TREE_TYPE (type)) - && TYPE_GETS_REG_DELETE (TREE_TYPE (type))) - { - /* Only do access checking here; we'll be calling op delete - from the destructor. */ - tree tmp = build_op_delete_call (DELETE_EXPR, t, size_zero_node, - LOOKUP_NORMAL, NULL_TREE); - if (tmp == error_mark_node) - return error_mark_node; - } - - return build_delete (type, t, sfk_deleting_destructor, - LOOKUP_NORMAL, use_global_delete); - } + return build_delete (type, t, sfk_deleting_destructor, + LOOKUP_NORMAL, use_global_delete); } /* Report an error if the indicated template declaration is not the diff --git a/gcc/cp/init.c b/gcc/cp/init.c index e16e8be92936..0e150fdbfdae 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -3289,6 +3289,14 @@ build_delete (type, addr, auto_delete, flags, use_global_delete) /* Call the complete object destructor. */ auto_delete = sfk_complete_destructor; } + else if (auto_delete == sfk_deleting_destructor + && TYPE_GETS_REG_DELETE (type)) + { + /* Make sure we have access to the member op delete, even though + we'll actually be calling it from the destructor. */ + build_op_delete_call (DELETE_EXPR, addr, c_sizeof_nowarn (type), + LOOKUP_NORMAL, NULL_TREE); + } expr = build_dtor_call (build_indirect_ref (addr, NULL_PTR), auto_delete, flags);