From 57811700d42143f211f94f83de8806a537e2a16a Mon Sep 17 00:00:00 2001 From: jason Date: Sat, 25 Jul 2009 03:57:20 +0000 Subject: [PATCH] Core issue 901 * 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 | 4 ++++ gcc/cp/call.c | 4 ++++ gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/cpp0x/defaulted11.C | 15 +++++++++++++++ libstdc++-v3/ChangeLog | 6 ++++++ libstdc++-v3/libsupc++/vec.cc | 8 ++++++-- 6 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/defaulted11.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6bb4a57..2ee951c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2009-07-24 Jason Merrill + 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. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index d396aff..0254ecb 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ea7a034..00dbba7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2009-07-24 Jason Merrill + * g++.dg/cpp0x/defaulted11.C: New. + * g++.dg/cpp0x/initlist23.C: New. 2009-07-24 Janus Weil diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted11.C b/gcc/testsuite/g++.dg/cpp0x/defaulted11.C new file mode 100644 index 0000000..b9bed7e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted11.C @@ -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]; +} diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index a89a4a6..21f67c5 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2009-07-24 Jason Merrill + + Core issue 901 + * libsupc++/vec.cc (__cxa_vec_new2, __cxa_vec_new3): Handle NULL + dealloc. + 2009-07-24 Joseph Myers * include/c_global/cwchar (swprintf, vswprintf): Do not use if diff --git a/libstdc++-v3/libsupc++/vec.cc b/libstdc++-v3/libsupc++/vec.cc index f132289..e44a023 100644 --- a/libstdc++-v3/libsupc++/vec.cc +++ b/libstdc++-v3/libsupc++/vec.cc @@ -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; } -- 2.7.4