From debed3db4887483552103da36d180967ef0dca5f Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 25 Apr 2017 10:58:57 +0100 Subject: Fix build on gcc < 5 (std::is_trivially_copyable missing) Ref: https://sourceware.org/ml/gdb-patches/2017-04/msg00660.html Simply skip the poisoning on older compilers. gdb/ChangeLog: 2017-04-25 Pedro Alves * common/poison.h [!HAVE_IS_TRIVIALLY_COPYABLE] (IsRelocatable) (BothAreRelocatable, memcopy, memmove): Don't define. * common/traits.h (__has_feature, HAVE_IS_TRIVIALLY_COPYABLE): New macros. --- gdb/ChangeLog | 7 +++++++ gdb/common/poison.h | 4 ++++ gdb/common/traits.h | 13 +++++++++++++ 3 files changed, 24 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 26e6370..d1c1942 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,12 @@ 2017-04-25 Pedro Alves + * common/poison.h [!HAVE_IS_TRIVIALLY_COPYABLE] (IsRelocatable) + (BothAreRelocatable, memcopy, memmove): Don't define. + * common/traits.h (__has_feature, HAVE_IS_TRIVIALLY_COPYABLE): New + macros. + +2017-04-25 Pedro Alves + * common/common-defs.h: Include "common/poison.h". * common/function-view.h: (Not, Or, Requires): Move to traits.h and adjust. diff --git a/gdb/common/poison.h b/gdb/common/poison.h index a875568..37dd35e 100644 --- a/gdb/common/poison.h +++ b/gdb/common/poison.h @@ -55,6 +55,8 @@ template >>> void *memset (T *s, int c, size_t n) = delete; +#if HAVE_IS_TRIVIALLY_COPYABLE + /* Similarly, poison memcpy and memmove of non trivially-copyable types, which is undefined. */ @@ -80,4 +82,6 @@ template >>> void *memmove (D *dest, const S *src, size_t n) = delete; +#endif /* HAVE_IS_TRIVIALLY_COPYABLE */ + #endif /* COMMON_POISON_H */ diff --git a/gdb/common/traits.h b/gdb/common/traits.h index 4f7161b..8c41b03 100644 --- a/gdb/common/traits.h +++ b/gdb/common/traits.h @@ -20,6 +20,19 @@ #include +/* GCC does not understand __has_feature. */ +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif + +/* HAVE_IS_TRIVIALLY_COPYABLE is defined as 1 iff + std::is_trivially_copyable is available. GCC only implemented it + in GCC 5. */ +#if (__has_feature(is_trivially_copyable) \ + || (defined __GNUC__ && __GNUC__ >= 5)) +# define HAVE_IS_TRIVIALLY_COPYABLE 1 +#endif + namespace gdb { /* Pre C++14-safe (CWG 1558) version of C++17's std::void_t. See -- cgit v1.1