lmi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lmi-commits] [lmi] master e46db7c 21/28: Work around std::allocator::si


From: Greg Chicares
Subject: [lmi-commits] [lmi] master e46db7c 21/28: Work around std::allocator::size_type problem in clang 11 libc++
Date: Wed, 12 May 2021 18:14:45 -0400 (EDT)

branch: master
commit e46db7cbbea49c80cfd626666c916f43dd62d4dd
Author: Vadim Zeitlin <vadim@tt-solutions.com>
Commit: Gregory W. Chicares <gchicares@sbcglobal.net>

    Work around std::allocator::size_type problem in clang 11 libc++
    
    This (and only this) version of libc++ has apparently mistakenly removed
    std::allocator::size_type definition, which is still present in C++20,
    and requires predefining a special symbol in order to do it -- which we
    must do to compile boost/regex.hpp as it (indirectly) uses this type.
    
    Add a configure test checking if we really need to do it and do define
    it if it is required.
---
 configure.ac | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/configure.ac b/configure.ac
index 1788619..911138d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -365,6 +365,36 @@ dnl Restore pre-wx CPPFLAGS value only now, we needed wx 
flags for
 dnl wxPdfDocument checks.
 CPPFLAGS=$save_CPPFLAGS
 
+dnl Add clang-specific workaround before checking for Boost, as its headers use
+dnl std::allocator::size_type.
+dnl
+dnl This is necessary because libc++ used by clang 11 mistakenly removed
+dnl std::allocator::size_type, which is finally not removed by C++20. Luckily,
+dnl we still can predefine _LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS to
+dnl get its declaration, but we don't want to do this unconditionally because
+dnl this also reintroduces other, really removed, members in later clang
+dnl versions, so only do it if we need it.
+if test "$CLANG" = "yes"; then
+    m4_define([lmi_cxx_alloc_test], [[
+#include <memory>
+std::allocator<char*>::size_type s = 17;
+    ]])
+    AC_CACHE_CHECK([whether clang requires workaround for 
std::allocator::size_type],
+        lmi_cv_cxx_alloc_workaround_needed,
+        [
+            AC_LANG_PUSH([C++])
+            AC_COMPILE_IFELSE([AC_LANG_SOURCE([lmi_cxx_alloc_test])],
+                lmi_cv_cxx_alloc_workaround_needed=no,
+                [CXXFLAGS="$CXXFLAGS 
-D_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS"
+                 AC_COMPILE_IFELSE([AC_LANG_SOURCE([lmi_cxx_alloc_test])],
+                    lmi_cv_cxx_alloc_workaround_needed=yes,
+                    AC_MSG_ERROR([std::allocator::size_type unavailable]))]
+            )
+            AC_LANG_POP([C++])
+        ]
+    )
+fi
+
 dnl --- Boost (required) ---
 if test "x$lmi_boost_headers" != "x"; then
     CPPFLAGS="$CPPFLAGS -I$lmi_boost_headers"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]