Date: prev next · Thread: first prev next last
2019 Archives by date, by thread · List index


I had accidentally developed patch set 1 of <https://gerrit.libreoffice.org/#/c/82554/1> "Extend loplugin:salbool to loplugin:fakebool" in an environment where compilerplugins was built with -std=c++2a (and thus accidentally used some constructs that are not compatible with the Clang 5.0.2 baseline of C++11).

I thought it would be nice to be able to use at least C++17 in compilerplugins code, so I patched

diff --git a/configure.ac b/configure.ac
index 1711ea8a3623..fe4294b207cd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7040,6 +7040,26 @@ if test "$COM_IS_CLANG" = "TRUE"; then
                 COMPILER_PLUGINS_CXXFLAGS="$COMPILER_PLUGINS_CXXFLAGS 
-I$clangobjdir/tools/clang/include"
             fi
         fi
+        dnl Use at least C++17 when building compilerplugins.  There are three cases to consider:
+        dnl 1  If COMPILER_PLUGINS_CXX already contains a -std= option (i.e., passed in by the
+        dnl    user), use it unconditionally (drop any potential -std= from
+        dnl    COMPILER_PLUGINS_CXXFLAGS).
+        dnl 2  Otherwise, if COMPILER_PLUGINS_CXXFLAGS contains a -std= option (as is normally the
+        dnl    case for `llvm-config --cxxflags`):  If it is -std=c++11 or -std=c++14, replace it
+        dnl    with -std=c++17.  (And otherwise keep it.)
+        dnl 3  Otherwise (see e.g. <https://github.com/llvm/llvm-project/commit/
+        dnl    7a25de6d2073f77ea1a0d8f4cd715bec55678941> "llvm-config: emit the C++ standard flag
+        dnl    into CXXFLAGS" for cases where it had gone missing from `llvm-config --cxxflags'),
+        dnl    add -std=c++17 to COMPILER_PLUGINS_CXXFLAGS.
+        if printf '%s' "$COMPILER_PLUGINS_CXX" | grep -e -std=; then
+            COMPILER_PLUGINS_CXXFLAGS=$(printf '%s' "$COMPILER_PLUGINS_CXXFLAGS" \
+                | sed -e 's/-std=[[^ ]]*//')
+        elif printf '%s' "$COMPILER_PLUGINS_CXXFLAGS" | grep -e '-std=c++1[[14]]'; then
+            COMPILER_PLUGINS_CXXFLAGS=$(printf '%s' "$COMPILER_PLUGINS_CXXFLAGS" \
+                | sed -e 's/-std=[[^ ]]*/-std=c++17/')
+        elif ! printf '%s' "$COMPILER_PLUGINS_CXXFLAGS" | grep -e -std=; then
+            COMPILER_PLUGINS_CXXFLAGS="$COMPILER_PLUGINS_CXXFLAGS -std=c++17"
+        fi
         AC_MSG_NOTICE([compiler plugins compile flags: $COMPILER_PLUGINS_CXXFLAGS])
         AC_LANG_PUSH([C++])
         save_CXX=$CXX

in the hope that the Clang 5.0.2 baseline, and all the COMPILER_PLUGINS_CXX used by people out there to build compilerplugins, would be fine with -std=c++17.

However, both my local installs of Clang 5.0.2 and 6.0.0 would fail with

[GEN] compilerplugins/clang/sharedvisitor/dllprivate.plugininfo
analyzer: /data/sbergman/clang/5.0.2/src/tools/clang/lib/Serialization/ASTReader.cpp:7150: virtual clang::Stmt* 
clang::ASTReader::GetExternalDeclStmt(uint64_t): Assertion `NumCurrentElementsDeserializing == 0 && 
"should not be called while already deserializing"' failed.
/bin/sh: line 1: 569762 Aborted                 (core dumped) 
/data/sbergman/lo-clang/core/compilerplugins/clang/sharedvisitor/analyzer 
/data/sbergman/lo-clang/core/compilerplugins/clang/dllprivate.cxx > 
/data/sbergman/lo-clang/core/compilerplugins/clang/sharedvisitor/dllprivate.plugininfo
make[1]: *** [/data/sbergman/lo-clang/core/compilerplugins/Makefile-clang.mk:243: 
/data/sbergman/lo-clang/core/compilerplugins/clang/sharedvisitor/dllprivate.plugininfo] Error 134
make[1]: Leaving directory '/data/sbergman/lo-clang/core'

etc., and only Clang 7.0.0 appears to have that fixed.


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.