diff options
author | Jason Merrill <jason@redhat.com> | 2002-03-20 14:50:24 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2002-03-20 14:50:24 -0500 |
commit | e3fe84e5dc1d98095a9b29c55b396bc342f6266f (patch) | |
tree | 9dc11d4c1db2ba6a3e46b4e07fb2f522e2562784 | |
parent | 3a307de4312c07a7a4c4f84bbd4bdf1de57b24f9 (diff) | |
download | gcc-e3fe84e5dc1d98095a9b29c55b396bc342f6266f.zip gcc-e3fe84e5dc1d98095a9b29c55b396bc342f6266f.tar.gz gcc-e3fe84e5dc1d98095a9b29c55b396bc342f6266f.tar.bz2 |
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: r51079
-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 38ce231..0a79602 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 5246a7f..2dbb663 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 53c9eef..a1d6578 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 0000000..beaed20 --- /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; +} |