From e08a58111dbea38d667b209f7543864d51a3b185 Mon Sep 17 00:00:00 2001 From: mvoelkle-cern <54059203+mvoelkle-cern@users.noreply.github.com> Date: Mon, 19 Apr 2021 19:53:57 +0200 Subject: [PATCH] Fix compilation with gcc < 5 (#2956) 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. The workaround is for certain libstdc++ versions, so the test should target these particular versions. --- include/pybind11/numpy.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/include/pybind11/numpy.h b/include/pybind11/numpy.h index d1ddc4a9d..dd7f43d16 100644 --- a/include/pybind11/numpy.h +++ b/include/pybind11/numpy.h @@ -319,14 +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(__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). - std::is_trivially_copyable, -#else - // GCC 4 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 >;