aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2002-03-20 14:50:24 -0500
committerJason Merrill <jason@gcc.gnu.org>2002-03-20 14:50:24 -0500
commite3fe84e5dc1d98095a9b29c55b396bc342f6266f (patch)
tree9dc11d4c1db2ba6a3e46b4e07fb2f522e2562784
parent3a307de4312c07a7a4c4f84bbd4bdf1de57b24f9 (diff)
downloadgcc-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/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 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;
+}