aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2002-03-20 19:50:24 +0000
committerJason Merrill <jason@redhat.com>2002-03-20 19:50:24 +0000
commit8fc43abac50e5a36fb2a9a717510734ef4fb71b2 (patch)
tree9dc11d4c1db2ba6a3e46b4e07fb2f522e2562784
parent1ea15b025a0c9f6a57fd169e5b8c4ebeb9f0a36b (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/ChangeLog6
-rw-r--r--gcc/cp/decl2.c17
-rw-r--r--gcc/cp/init.c8
-rw-r--r--gcc/testsuite/g++.dg/lookup/delete1.C16
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;
+}