From 46bd53278c521831f71234907f84d7a05125491c Mon Sep 17 00:00:00 2001 From: mvoelkle-cern <54059203+mvoelkle-cern@users.noreply.github.com> Date: Fri, 16 Apr 2021 11:26:53 +0200 Subject: [PATCH 1/2] Fix compilation with gcc < 5 When the user defines _GLIBCXX_USE_CXX11_ABI=0 to force the pre-c++11 ABI, numpy.h assumes that is_trivially_copyable is available. It is not necessarily the case. This patch uses clang's feature detection instead. --- include/pybind11/numpy.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/include/pybind11/numpy.h b/include/pybind11/numpy.h index d1ddc4a9db..5095364369 100644 --- a/include/pybind11/numpy.h +++ b/include/pybind11/numpy.h @@ -319,12 +319,10 @@ template using remove_all_extents_t = typename array_info::type; template using is_pod_struct = all_of< std::is_standard_layout, // since we're accessing directly in memory we need a standard layout type -#if !defined(__GNUG__) || defined(_LIBCPP_VERSION) || defined(_GLIBCXX_USE_CXX11_ABI) - // _GLIBCXX_USE_CXX11_ABI indicates that we're using libstdc++ from GCC 5 or newer, independent - // of the actual compiler (Clang can also use libstdc++, but it always defines __GNUC__ == 4). +#if !defined(__GNUC__) || __GNUC__ >= 5 || (defined(__clang__) && __has_feature(is_trivially_copyable)) std::is_trivially_copyable, #else - // GCC 4 doesn't implement is_trivially_copyable, so approximate it + // libstdc++ < 5 doesn't implement is_trivially_copyable, so approximate it std::is_trivially_destructible, satisfies_any_of, #endif From c68170087a31a942eb0d0ad620d3a63ae5294236 Mon Sep 17 00:00:00 2001 From: mvoelkle-cern <54059203+mvoelkle-cern@users.noreply.github.com> Date: Mon, 19 Apr 2021 10:54:41 +0200 Subject: [PATCH 2/2] Only test for libstdc++ specialty The workaround is for certain libstdc++ versions, so the test should target these particular versions. --- include/pybind11/numpy.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/include/pybind11/numpy.h b/include/pybind11/numpy.h index 5095364369..dd7f43d16a 100644 --- a/include/pybind11/numpy.h +++ b/include/pybind11/numpy.h @@ -319,12 +319,13 @@ template using remove_all_extents_t = typename array_info::type; template using is_pod_struct = all_of< std::is_standard_layout, // since we're accessing directly in memory we need a standard layout type -#if !defined(__GNUC__) || __GNUC__ >= 5 || (defined(__clang__) && __has_feature(is_trivially_copyable)) - std::is_trivially_copyable, -#else - // libstdc++ < 5 doesn't implement is_trivially_copyable, so approximate it +#if defined(__GLIBCXX__) && (__GLIBCXX__ < 20150422 || __GLIBCXX__ == 20150623 || __GLIBCXX__ == 20150626 || __GLIBCXX__ == 20160803) + // libstdc++ < 5 (including versions 4.8.5, 4.9.3 and 4.9.4 which were released after 5) + // don't implement is_trivially_copyable, so approximate it std::is_trivially_destructible, satisfies_any_of, +#else + std::is_trivially_copyable, #endif satisfies_none_of >;