From: H.J. Lu Date: Sun, 30 Jun 2024 05:42:43 +0000 (-0700) Subject: ld: Avoid folding new and delete pairs X-Git-Tag: binutils-2_43~235 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=adf584eb92b0aaf134db99f4238eedb3e5bacb4a;p=thirdparty%2Fbinutils-gdb.git ld: Avoid folding new and delete pairs GCC 15 may fold new and delete pairs, like A *bb = new A[10]; delete [] bb; bb = new (std::nothrow) A [10]; delete [] bb; as shown in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115712 Avoid folding new and delete pairs by adding a function call between new and delete. * testsuite/ld-elf/dl5.cc: Include "dl5.h". (A): Removed. Call foo between new and delete. * testsuite/ld-elf/dl5.h: New file. * testsuite/ld-elf/new.cc: Include "dl5.h". (foo): New function. Signed-off-by: H.J. Lu --- diff --git a/ld/testsuite/ld-elf/dl5.cc b/ld/testsuite/ld-elf/dl5.cc index cc404553f93..77dbb62f3d5 100644 --- a/ld/testsuite/ld-elf/dl5.cc +++ b/ld/testsuite/ld-elf/dl5.cc @@ -1,6 +1,7 @@ #include #include #include +#include "dl5.h" int pass = 0; @@ -30,22 +31,14 @@ operator delete (void *ptr) throw () free (ptr); } -class A -{ -public: - A() {} - ~A() { } - int a; - int b; -}; - - int main (void) { A *bb = new A[10]; delete [] bb; + foo (bb); bb = new (std::nothrow) A [10]; + foo (bb); delete [] bb; if (pass == 4) diff --git a/ld/testsuite/ld-elf/dl5.h b/ld/testsuite/ld-elf/dl5.h new file mode 100644 index 00000000000..0d4a7c1bfa3 --- /dev/null +++ b/ld/testsuite/ld-elf/dl5.h @@ -0,0 +1,10 @@ +class A +{ +public: + A() {} + ~A() { } + int a; + int b; +}; + +extern void foo (A *); diff --git a/ld/testsuite/ld-elf/new.cc b/ld/testsuite/ld-elf/new.cc index 513cf2f3ad6..b038d770c6d 100644 --- a/ld/testsuite/ld-elf/new.cc +++ b/ld/testsuite/ld-elf/new.cc @@ -1,4 +1,5 @@ #include +#include "dl5.h" using std::bad_alloc; @@ -45,3 +46,8 @@ operator new[] (std::size_t sz, const std::nothrow_t& nothrow) throw() { return ::operator new(sz, nothrow); } + +void +foo (A *) +{ +}