aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-elf
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2024-06-29 22:42:43 -0700
committerH.J. Lu <hjl.tools@gmail.com>2024-06-30 15:43:58 -0700
commitadf584eb92b0aaf134db99f4238eedb3e5bacb4a (patch)
treed9a4e745647849f789b14137ffcb0573c95b989e /ld/testsuite/ld-elf
parentebe3f6d0f18505e3f6a1800d3a3ee4b3403d726f (diff)
downloadgdb-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/testsuite/ld-elf')
-rw-r--r--ld/testsuite/ld-elf/dl5.cc13
-rw-r--r--ld/testsuite/ld-elf/dl5.h10
-rw-r--r--ld/testsuite/ld-elf/new.cc6
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 *)
+{
+}