On using C++17 for compilerplugins (not possible for now)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread 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.

_______________________________________________
LibreOffice mailing list
LibreOffice@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/libreoffice




[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux