diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2024-06-29 22:42:43 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2024-06-30 15:43:58 -0700 |
commit | adf584eb92b0aaf134db99f4238eedb3e5bacb4a (patch) | |
tree | d9a4e745647849f789b14137ffcb0573c95b989e /ld | |
parent | ebe3f6d0f18505e3f6a1800d3a3ee4b3403d726f (diff) | |
download | gdb-adf584eb92b0aaf134db99f4238eedb3e5bacb4a.zip gdb-adf584eb92b0aaf134db99f4238eedb3e5bacb4a.tar.gz gdb-adf584eb92b0aaf134db99f4238eedb3e5bacb4a.tar.bz2 |
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 <hjl.tools@gmail.com>
Diffstat (limited to 'ld')
-rw-r--r-- | ld/testsuite/ld-elf/dl5.cc | 13 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/dl5.h | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/new.cc | 6 |
3 files changed, 19 insertions, 10 deletions
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 <stdio.h> #include <stdlib.h> #include <new> +#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 <new> +#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 *) +{ +} |