crash: fix bundled gdb build for C++20

std::allocator::construct was removed in C++20 (GCC 16 default).

Rewrite 0006-gdbsupport-fix-default-init-alloc to include <memory>
guard the using-declaration to pre-C++17, and add a forwarding
construct() overload.

Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
This commit is contained in:
Khem Raj
2026-06-24 09:58:22 -07:00
parent a9d4a92025
commit a7428c96bf
2 changed files with 83 additions and 0 deletions
+1
View File
@@ -27,6 +27,7 @@ SRC_URI = "git://github.com/crash-utility/${BPN}.git;branch=master;protocol=http
file://0004-tools.c-do-not-use-keywords-nullptr-as-a-variable-in.patch \ file://0004-tools.c-do-not-use-keywords-nullptr-as-a-variable-in.patch \
file://0005-Fix-build-failure-on-32bit-machine-i686.patch \ file://0005-Fix-build-failure-on-32bit-machine-i686.patch \
file://0001-Use-CC-env-var-to-get-compiler-version.patch \ file://0001-Use-CC-env-var-to-get-compiler-version.patch \
file://0006-gdbsupport-fix-default-init-alloc-for-C-20.patch \
" "
SRCREV = "f13853cef53f5c5463a51021edbc81977e2b1405" SRCREV = "f13853cef53f5c5463a51021edbc81977e2b1405"
@@ -0,0 +1,82 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Mon, 23 Jun 2026 00:00:00 +0000
Subject: [PATCH] gdbsupport: fix default-init-alloc for C++20
std::allocator::construct() and std::allocator::destroy() were
deprecated in C++17 and removed in C++20. gdb-10.2's
gdbsupport/default-init-alloc.h pulls them into scope with
using A::construct;
where A defaults to std::allocator<T>. With GCC 16 (which defaults to
C++20 or newer) std::vector instantiations such as gdb::def_vector<char>
(= std::vector<char, gdb::default_init_allocator<char>>) fail to build:
default-init-alloc.h:52:12: error: 'construct' has not been declared
in 'class std::allocator<char>'
Note that def-vector.h instantiates default_init_allocator with the
explicit std::allocator<T> base, so changing only the template's default
allocator argument is not sufficient to fix this.
Pull in "using A::construct;" only for standards older than C++17 (where
std::allocator still provides construct()), and for C++17 and later add a
variadic construct() overload that forwards to
std::allocator_traits<A>::construct(). This both keeps non-default
construction working and avoids referring to the removed
std::allocator::construct() member. The existing default-init
construct(U*) overload is preserved unchanged.
This patch only touches the bundled gdb-10.2 sources downloaded by the
crash recipe.
Upstream-Status: Pending
Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
gdbsupport/default-init-alloc.h | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
--- a/gdb-10.2/gdbsupport/default-init-alloc.h
+++ b/gdb-10.2/gdbsupport/default-init-alloc.h
@@ -18,6 +18,8 @@
#ifndef COMMON_DEFAULT_INIT_ALLOC_H
#define COMMON_DEFAULT_INIT_ALLOC_H
+#include <memory>
+
namespace gdb {
/* An allocator that default constructs using default-initialization
@@ -48,8 +50,13 @@ public:
typedef default_init_allocator<U, alloc_> other;
};
- /* Make the base allocator's construct method(s) visible. */
+ /* Make the base allocator's construct method(s) visible. std::allocator
+ lost its construct() member in C++20, so only pull it in for older
+ standards; for C++20 and later we forward non-default construction to
+ std::allocator_traits below instead. */
+#if __cplusplus < 201703L
using A::construct;
+#endif
/* .. and provide an override/overload for the case of default
construction (i.e., no arguments). This is where we construct
@@ -60,6 +67,16 @@ public:
{
::new ((void *) ptr) U; /* default-init */
}
+
+ /* Forward all other construct() calls to the base allocator. This
+ replaces the "using A::construct;" pulled in above for standards
+ where std::allocator still provides construct(). */
+ template <typename U, typename... Args>
+ void construct (U *ptr, Args&&... args)
+ {
+ std::allocator_traits<A>::construct (static_cast<A &> (*this), ptr,
+ std::forward<Args> (args)...);
+ }
};
} /* namespace gdb */