diff options
author | Jason Merrill <jason@redhat.com> | 2002-03-20 19:50:24 +0000 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2002-03-20 19:50:24 +0000 |
commit | 8fc43abac50e5a36fb2a9a717510734ef4fb71b2 (patch) | |
tree | 9dc11d4c1db2ba6a3e46b4e07fb2f522e2562784 | |
parent | 1ea15b025a0c9f6a57fd169e5b8c4ebeb9f0a36b (diff) |
PR c++/2136
* init.c (build_delete): Check access for a member op delete here.
* decl2.c (delete_sanity): Not here.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@51079 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 17 | ||||
-rw-r--r-- | gcc/cp/init.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/delete1.C | 16 |
4 files changed, 32 insertions, 15 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 38ce231d87f..0a796024ffe 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2002-03-20 Jason Merrill <jason@redhat.com> + + PR c++/2136 + * init.c (build_delete): Check access for a member op delete here. + * decl2.c (delete_sanity): Not here. + 2002-03-19 Jason Merrill <jason@redhat.com> PR c++/5118 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 5246a7f019a..2dbb6636a98 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1142,21 +1142,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 53c9eef1749..a1d6578fa41 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -3192,6 +3192,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), auto_delete, flags); diff --git a/gcc/testsuite/g++.dg/lookup/delete1.C b/gcc/testsuite/g++.dg/lookup/delete1.C new file mode 100644 index 00000000000..beaed209dc9 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/delete1.C @@ -0,0 +1,16 @@ +// PR c++/2136 +// Test that overloaded op new and delete don't prevent us from using the +// global versions with an explicit scope. + +#include <stddef.h> + +struct A { + void *operator new (size_t, float); + void operator delete (void *, float); +}; + +int main () +{ + A *p = ::new A; + ::delete p; +} |