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
- On using C++17 for compilerplugins (not possible for now) · Stephan Bergmann
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.