From adf584eb92b0aaf134db99f4238eedb3e5bacb4a Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 29 Jun 2024 22:42:43 -0700 Subject: 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 --- ld/testsuite/ld-elf/dl5.cc | 13 +++---------- ld/testsuite/ld-elf/dl5.h | 10 ++++++++++ ld/testsuite/ld-elf/new.cc | 6 ++++++ 3 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 ld/testsuite/ld-elf/dl5.h (limited to 'ld/testsuite/ld-elf') diff --git a/ld/testsuite/ld-elf/dl5.cc b/ld/testsuite/ld-elf/dl5.cc index cc40455..77dbb62 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 0000000..0d4a7c1 --- /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 513cf2f..b038d77 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 *) +{ +} -- cgit v1.1