re PR c++/2136 (g++ seems to disregard '::' in '::delete')
authorJason Merrill <jason@redhat.com>
Wed, 20 Mar 2002 19:50:24 +0000 (14:50 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 20 Mar 2002 19:50:24 +0000 (14:50 -0500)
        PR c++/2136
        * init.c (build_delete): Check access for a member op delete here.
        * decl2.c (delete_sanity): Not here.

From-SVN: r51079

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/cp/init.c
gcc/testsuite/g++.dg/lookup/delete1.C [new file with mode: 0644]

index 38ce231d87fb9ea7f6fca82b90aeafb1ee8a1c6e..0a796024ffe896dff79b7c78d891640e55de5567 100644 (file)
@@ -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
index 5246a7f019aea8212274199cdc0ef8375a8edf1c..2dbb6636a98d552b578da7cb2b69a3a7418e8c9d 100644 (file)
@@ -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
index 53c9eef17493d1b1545ea5837caa2b47bfbda375..a1d6578fa41efe640003af1f1acbdd0a17d0a3c5 100644 (file)
@@ -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 (file)
index 0000000..beaed20
--- /dev/null
@@ -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;
+}