mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-11-16 12:34:43 +00:00
With gcc 10 and -std=c++20, we run into the same problem as reported in commit6feae66da1("[gdb/build, c++20] Handle deprecated std::allocator::construct"). The problem was fixed using: ... -template<typename T, typename A = std::allocator<T>> +template<typename T, + typename A +#if __cplusplus >= 202002L + = std::pmr::polymorphic_allocator<T> +#else + = std::allocator<T> +#endif + > ... but that doesn't work for gcc 10, because it defines __cplusplus differently: ... $ echo | g++-10 -E -dD -x c++ - -std=c++20 2>&1 | grep __cplusplus #define __cplusplus 201709L $ echo | g++-11 -E -dD -x c++ - -std=c++20 2>&1 | grep __cplusplus #define __cplusplus 202002L ... Fix this by using the library feature test macro __cpp_lib_polymorphic_allocator [1], which is undefined for c++17 and defined for c++20: ... $ echo | g++-10 -E -dD -x c++ - -include memory_resource -std=c++17 2>&1 \ | grep __cpp_lib_polymorphic_allocator $ echo | g++-10 -E -dD -x c++ - -include memory_resource -std=c++20 2>&1 \ | grep __cpp_lib_polymorphic_allocator #define __cpp_lib_polymorphic_allocator 201902L $ ... A similar problem exists for commit3173529d7d("[gdb/guile, c++20] Work around Werror=volatile in libguile.h"). Fix this by testing for 201709L instead. Tested on x86_64-linux, by building gdb with {gcc 10, clang 17.0.6} x {-std=c++17, -std=c++20}. PR build/32503 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32503 Approved-By: Tom Tromey <tom@tromey.com> [1] https://en.cppreference.com/w/cpp/feature_test#cpp_lib_polymorphic_allocator
79 lines
2.3 KiB
C++
79 lines
2.3 KiB
C++
/* Copyright (C) 2017-2024 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef GDBSUPPORT_DEFAULT_INIT_ALLOC_H
|
|
#define GDBSUPPORT_DEFAULT_INIT_ALLOC_H
|
|
|
|
#if __has_include(<memory_resource>)
|
|
#include <memory_resource>
|
|
#endif
|
|
|
|
namespace gdb {
|
|
|
|
/* An allocator that default constructs using default-initialization
|
|
rather than value-initialization. The idea is to use this when you
|
|
don't want to default construct elements of containers of trivial
|
|
types using zero-initialization. */
|
|
|
|
/* Mostly as implementation convenience, this is implemented as an
|
|
adapter that given an allocator A, overrides 'A::construct()'. 'A'
|
|
defaults to std::allocator<T>. */
|
|
|
|
template<typename T,
|
|
typename A
|
|
#ifdef __cpp_lib_polymorphic_allocator
|
|
= std::pmr::polymorphic_allocator<T>
|
|
#else
|
|
= std::allocator<T>
|
|
#endif
|
|
>
|
|
class default_init_allocator : public A
|
|
{
|
|
public:
|
|
/* Pull in A's ctors. */
|
|
using A::A;
|
|
|
|
/* Override rebind. */
|
|
template<typename U>
|
|
struct rebind
|
|
{
|
|
/* A couple helpers just to make it a bit more readable. */
|
|
typedef std::allocator_traits<A> traits_;
|
|
typedef typename traits_::template rebind_alloc<U> alloc_;
|
|
|
|
/* This is what we're after. */
|
|
typedef default_init_allocator<U, alloc_> other;
|
|
};
|
|
|
|
/* Make the base allocator's construct method(s) visible. */
|
|
using A::construct;
|
|
|
|
/* .. and provide an override/overload for the case of default
|
|
construction (i.e., no arguments). This is where we construct
|
|
with default-init. */
|
|
template <typename U>
|
|
void construct (U *ptr)
|
|
noexcept (std::is_nothrow_default_constructible<U>::value)
|
|
{
|
|
::new ((void *) ptr) U; /* default-init */
|
|
}
|
|
};
|
|
|
|
} /* namespace gdb */
|
|
|
|
#endif /* GDBSUPPORT_DEFAULT_INIT_ALLOC_H */
|