compilerplugins/clang/reservedid.cxx          |    2 +-
 external/boost/UnpackedTarball_boost.mk       |    2 ++
 external/boost/libc++.patch.0                 |   12 ++++++++++++
 external/clucene/Library_clucene.mk           |   10 ++++++++--
 external/libmspub/ExternalProject_libmspub.mk |   10 +++++++++-
 vcl/source/window/layout.cxx                  |   17 +++++++++++++++++
 6 files changed, 49 insertions(+), 4 deletions(-)

New commits:
commit 7e30d784025d2c36c85d8f3defc7740ef8a2fe5a
Author:     Stephan Bergmann <sberg...@redhat.com>
AuthorDate: Tue Jun 28 16:57:14 2022 +0200
Commit:     Stephan Bergmann <sberg...@redhat.com>
CommitDate: Wed Jun 29 10:08:25 2022 +0200

    Adapt to LLVM 15 trunk libc++ dropping std::unary_/binary_function
    
    ...for C++17 and beyond with
    
<https://github.com/llvm/llvm-project/commit/681cde7dd8b5613dbafc9ca54e0288477f946be3>
    "[libc++] Complete the implementation of N4190".  (Unless explicitly 
opted-in
    with _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION.  This is similar 
to the
    MSVC standard library needing _HAS_AUTO_PTR_ETC=1 to enable those zombie
    functions for quite some time now.  Only libstdc++ still supports them
    unconditionally.)
    
    Most uses of those zombie functions across LibreOffice itself and the 
bundled
    external/* are indirectly within Boost include files.  And many (but not 
all) of
    those Boost include files only use those zombie functions conditionally, 
based
    on BOOST_NO_CXX98_FUNCTION_BASE.  For the (Dinkumware-derived) MSVC standard
    library, workdir/UnpackedTarball/boost/boost/config/stdlib/dinkumware.hpp
    already defined BOOST_NO_CXX98_FUNCTION_BASE.  So add a patch to define that
    also in workdir/UnpackedTarball/boost/boost/config/stdlib/libcpp.hpp (for 
all of
    C++11 and beyond, even if those functions were still available as 
deprecated in
    C++11 and C++14, but which shouldn't make a difference with our C++17 
baseline
    anyway; only make sure that things still work if those Boost include files 
ever
    get used by code built with gb_CXX03FLAGS).  (Patching our bundled
    external/boost of course doesn't help when building with such a new libc++ 
and
    --with-system-boost against an unpatched Boost, but lets consider that "not 
my
    problem".  Also, one could always use a sledgehammer like passing
    CPPFLAGS=-D_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION into gbuild in
    such a case.)
    
    Then there are two places that include boost/multi_array.hpp, which 
indirectly
    includes workdir/UnpackedTarball/boost/boost/functional.hpp, which still 
uses
    those zombie functions for non-MSVC builds (at least in the bundled
    Boost 1.79.0).  Lets do a targeted
    _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION in those cases.
    (Alternatively, we could patch
    workdir/UnpackedTarball/boost/boost/functional.hpp.  Also, I decided to make
    loplugin:reservedid support the new suppression mechanism, rather than 
extending
    its existing ignorelist even further.)
    
    And then there is external/clucene using those zombie functions even 
outside of
    a Boost include file, so extend the existing hack there that was already 
needed
    for MSVC.  (And adapt the accompanying comment:  For one, we are 
unconditionally
    "in C++17 mode" by now.  And for another, the exact places where
    external/clucene uses those functions have apparently changed over time.)
    
    Change-Id: Id0eec3bedcfddae86b16d33c02c7b5d3b3f8a16f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136579
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sberg...@redhat.com>

diff --git a/compilerplugins/clang/reservedid.cxx 
b/compilerplugins/clang/reservedid.cxx
index be0a2f209f71..477f8c3ffda9 100644
--- a/compilerplugins/clang/reservedid.cxx
+++ b/compilerplugins/clang/reservedid.cxx
@@ -113,7 +113,7 @@ void ReservedId::postRun() {
                 for (;;) {
                     if (d->getKind() == MacroDirective::MD_Define) {
                         auto loc = d->getLocation();
-                        if (loc.isValid() && !ignoreLocation(loc)) {
+                        if (loc.isValid() && !ignoreLocation(loc) && 
!suppressWarningAt(loc)) {
                             auto file = getFilenameOfLocation(loc);
                             if (!loplugin::isSameUnoIncludePathname(
                                     file,
diff --git a/external/boost/UnpackedTarball_boost.mk 
b/external/boost/UnpackedTarball_boost.mk
index 91a0e264a926..384782f586f0 100644
--- a/external/boost/UnpackedTarball_boost.mk
+++ b/external/boost/UnpackedTarball_boost.mk
@@ -31,6 +31,8 @@ boost_patches += windows-no-utf8-locales.patch.0
 
 boost_patches += msvc2017.patch.0
 
+boost_patches += libc++.patch.0
+
 $(eval $(call gb_UnpackedTarball_UnpackedTarball,boost))
 
 $(eval $(call gb_UnpackedTarball_set_tarball,boost,$(BOOST_TARBALL)))
diff --git a/external/boost/libc++.patch.0 b/external/boost/libc++.patch.0
new file mode 100644
index 000000000000..f912e6cdb6c7
--- /dev/null
+++ b/external/boost/libc++.patch.0
@@ -0,0 +1,12 @@
+--- boost/config/stdlib/libcpp.hpp
++++ boost/config/stdlib/libcpp.hpp
+@@ -167,5 +167,9 @@
+ #if !defined(BOOST_NO_CXX14_HDR_SHARED_MUTEX) && (_LIBCPP_VERSION < 5000)
+ #  define BOOST_NO_CXX14_HDR_SHARED_MUTEX
+ #endif
++
++#if __cplusplus >= 201103
++#  define BOOST_NO_CXX98_FUNCTION_BASE
++#endif
+ 
+ //  --- end ---
diff --git a/external/clucene/Library_clucene.mk 
b/external/clucene/Library_clucene.mk
index c6f2895501d6..e837f9f64fb6 100644
--- a/external/clucene/Library_clucene.mk
+++ b/external/clucene/Library_clucene.mk
@@ -31,11 +31,17 @@ $(eval $(call gb_Library_add_defs,clucene,\
     -Dclucene_contribs_lib_EXPORTS \
 ))
 
-# Needed when building against MSVC in C++17 mode, as
-# workdir/UnpackedTarball/clucene/src/core/CLucene/util/Equators.h uses 
std::binary_function:
+# Needed when building against either libc++ or MSVC's standard library 
(including clang-cl builds),
+# as e.g. workdir/UnpackedTarball/clucene/src/core/CLucene/util/_Arrays.h uses 
std::binary_function:
+ifeq ($(HAVE_LIBCPP),TRUE)
+$(eval $(call gb_Library_add_defs,clucene, \
+    -D_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION \
+))
+else ifeq ($(COM),MSC)
 $(eval $(call gb_Library_add_defs,clucene, \
     -D_HAS_AUTO_PTR_ETC=1 \
 ))
+endif
 
 ifeq ($(OS),LINUX)
 $(eval $(call gb_Library_add_libs,clucene,\
diff --git a/external/libmspub/ExternalProject_libmspub.mk 
b/external/libmspub/ExternalProject_libmspub.mk
index f84e5c9b2214..7e7153e75416 100644
--- a/external/libmspub/ExternalProject_libmspub.mk
+++ b/external/libmspub/ExternalProject_libmspub.mk
@@ -22,6 +22,14 @@ $(eval $(call gb_ExternalProject_use_externals,libmspub,\
        zlib \
 ))
 
+libmspub_CPPFLAGS := $(CPPFLAGS) $(ICU_UCHAR_TYPE) $(BOOST_CPPFLAGS)
+# Needed when workdir/UnpackedTarball/libmspub/src/lib/MSPUBCollector.cpp 
includes Boost 1.79.0
+# boost/multi_array.hpp, which indirectly includes
+# workdir/UnpackedTarball/boost/boost/functional.hpp using 
std::unary_/binary_function:
+ifeq ($(HAVE_LIBCPP),TRUE)
+libmspub_CPPFLAGS += -D_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION
+endif
+
 $(call gb_ExternalProject_get_state_target,libmspub,build) :
        $(call gb_Trace_StartRange,libmspub,EXTERNAL)
        $(call gb_ExternalProject_run,build,\
@@ -37,7 +45,7 @@ $(call gb_ExternalProject_get_state_target,libmspub,build) :
                        --disable-weffc \
                        $(if 
$(verbose),--disable-silent-rules,--enable-silent-rules) \
                        CXXFLAGS="$(gb_CXXFLAGS) $(call 
gb_ExternalProject_get_build_flags,libmspub)" \
-                       CPPFLAGS="$(CPPFLAGS) $(ICU_UCHAR_TYPE) 
$(BOOST_CPPFLAGS)" \
+                       CPPFLAGS="$(libmspub_CPPFLAGS)" \
                        LDFLAGS="$(call 
gb_ExternalProject_get_link_flags,libmspub)" \
                        $(gb_CONFIGURE_PLATFORMS) \
                && $(MAKE) \
diff --git a/vcl/source/window/layout.cxx b/vcl/source/window/layout.cxx
index 946e2cce2732..258ea8dc1105 100644
--- a/vcl/source/window/layout.cxx
+++ b/vcl/source/window/layout.cxx
@@ -9,6 +9,23 @@
 
 #include <sal/config.h>
 
+// Needed since LLVM 15 libc++ (hence the ignored -Wunused-macros for older 
libc++) when
+// #include <boost/multi_array.hpp> below includes Boost 1.79.0
+// workdir/UnpackedTarball/boost/boost/functional.hpp using 
std::unary_function, but must
+// come very early here in case <functional> is already (indirectly) included 
earlier:
+#include <config_libcxx.h>
+#if HAVE_LIBCPP
+#if defined __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-macros"
+#endif
+// [-loplugin:reservedid]:
+#define _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION
+#if defined __clang__
+#pragma clang diagnostic pop
+#endif
+#endif
+
 #include <string_view>
 
 #include <config_features.h>

Reply via email to