Core issue 901
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Jul 2009 03:57:20 +0000 (03:57 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Jul 2009 03:57:20 +0000 (03:57 +0000)
* libsupc++/vec.cc (__cxa_vec_new2, __cxa_vec_new3): Handle NULL
dealloc.
* call.c (build_op_delete_call): If this is for a new-expression
and the op delete is deleted, do nothing.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@150073 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/defaulted11.C [new file with mode: 0644]
libstdc++-v3/ChangeLog
libstdc++-v3/libsupc++/vec.cc

index 6bb4a57..2ee951c 100644 (file)
@@ -1,5 +1,9 @@
 2009-07-24  Jason Merrill  <jason@redhat.com>
 
+       Core issue 901
+       * call.c (build_op_delete_call): If this is for a new-expression
+       and the op delete is deleted, do nothing.
+
        Core issue 702
        * call.c (compare_ics): Give list-initialization of std::init_list
        priority over conversion to scalar, too.
index d396aff..0254ecb 100644 (file)
@@ -4595,6 +4595,10 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
       if (DECL_CLASS_SCOPE_P (fn))
        perform_or_defer_access_check (TYPE_BINFO (type), fn, fn);
 
+      /* Core issue 901: It's ok to new a type with deleted delete.  */
+      if (DECL_DELETED_FN (fn) && alloc_fn)
+       return NULL_TREE;
+
       if (placement)
        {
          /* The placement args might not be suitable for overload
index ea7a034..00dbba7 100644 (file)
@@ -1,5 +1,7 @@
 2009-07-24  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/cpp0x/defaulted11.C: New.
+
        * g++.dg/cpp0x/initlist23.C: New.
 
 2009-07-24  Janus Weil  <janus@gcc.gnu.org>
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted11.C b/gcc/testsuite/g++.dg/cpp0x/defaulted11.C
new file mode 100644 (file)
index 0000000..b9bed7e
--- /dev/null
@@ -0,0 +1,15 @@
+// Core issue 901
+// { dg-options "-std=c++0x" }
+
+struct A
+{
+  A(); ~A();
+  void operator delete (void *) = delete;
+  void operator delete[] (void *) = delete;
+};
+
+int main()
+{
+  A* ap = new A;
+  ap = new A[2];
+}
index a89a4a6..21f67c5 100644 (file)
@@ -1,3 +1,9 @@
+2009-07-24  Jason Merrill  <jason@redhat.com>
+
+       Core issue 901
+       * libsupc++/vec.cc (__cxa_vec_new2, __cxa_vec_new3): Handle NULL
+       dealloc.
+
 2009-07-24  Joseph Myers  <joseph@codesourcery.com>
 
        * include/c_global/cwchar (swprintf, vswprintf): Do not use if
index f132289..e44a023 100644 (file)
@@ -104,7 +104,10 @@ namespace __cxxabiv1
       {
        {
          uncatch_exception ue;
-         dealloc(base - padding_size);
+         // Core issue 901 will probably be resolved such that a
+         // deleted operator delete means not freeing memory here.
+         if (dealloc)
+           dealloc(base - padding_size);
        }
        __throw_exception_again;
       }
@@ -142,7 +145,8 @@ namespace __cxxabiv1
       {
        {
          uncatch_exception ue;
-         dealloc(base - padding_size, size);
+         if (dealloc)
+           dealloc(base - padding_size, size);
        }
        __throw_exception_again;
       }