From 850ac7d8057f1ee39c275084cf5900bf5ec62219 Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Fri, 30 Nov 2018 12:19:55 +0100 Subject: [PATCH] Clang: Properly generate macros with clang-cl Clang-cl can work with different command line styles but it seems that it's a bad idea to mix them. So let's use gcc toolchain methods only when --driver-mode=g++ is specified and ones from msvc toolchain in other cases. Change-Id: I071a124a07b31bce2a0a5594ff8ca79d9ed84716 Reviewed-by: Nikolai Kosjar --- .../projectexplorer/abstractmsvctoolchain.cpp | 3 ++- src/plugins/projectexplorer/abstractmsvctoolchain.h | 3 ++- src/plugins/projectexplorer/msvctoolchain.cpp | 13 ++++++++++--- src/plugins/projectexplorer/msvctoolchain.h | 6 ++++-- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp index 33861c36815..0aea9695b47 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp @@ -129,7 +129,8 @@ ToolChain::MacroInspectionRunner AbstractMsvcToolChain::createMacroInspectionRun const Macros macros = msvcPredefinedMacros(filteredFlags, env); - const auto report = MacroInspectionReport{macros, msvcLanguageVersion(lang, macros)}; + const auto report = MacroInspectionReport{macros, + msvcLanguageVersion(filteredFlags, lang, macros)}; macroCache->insert(filteredFlags, report); return report; diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.h b/src/plugins/projectexplorer/abstractmsvctoolchain.h index 8fc7c46be50..f1f74ec8a17 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.h +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.h @@ -98,7 +98,8 @@ protected: // Function must be thread-safe! virtual Macros msvcPredefinedMacros(const QStringList cxxflags, const Utils::Environment& env) const = 0; - virtual LanguageVersion msvcLanguageVersion(const Core::Id &language, + virtual LanguageVersion msvcLanguageVersion(const QStringList cxxflags, + const Core::Id &language, const Macros ¯os) const = 0; Utils::FileName m_debuggerCommand; diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index 5defb0b7449..020247b3cb7 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -525,7 +525,8 @@ Macros MsvcToolChain::msvcPredefinedMacros(const QStringList cxxflags, // // For _MSV_VER values, see https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2017. // -LanguageVersion MsvcToolChain::msvcLanguageVersion(const Core::Id &language, +LanguageVersion MsvcToolChain::msvcLanguageVersion(const QStringList /*cxxflags*/, + const Core::Id &language, const Macros ¯os) const { int mscVer = -1; @@ -1120,6 +1121,9 @@ bool ClangClToolChain::operator ==(const ToolChain &other) const Macros ClangClToolChain::msvcPredefinedMacros(const QStringList cxxflags, const Utils::Environment &env) const { + if (!cxxflags.contains("--driver-mode=g++")) + return MsvcToolChain::msvcPredefinedMacros(cxxflags, env); + Utils::SynchronousProcess cpp; cpp.setEnvironment(env.toStringList()); cpp.setWorkingDirectory(Utils::TemporaryDirectory::masterDirectoryPath()); @@ -1138,10 +1142,13 @@ Macros ClangClToolChain::msvcPredefinedMacros(const QStringList cxxflags, return Macro::toMacros(response.allRawOutput()); } -LanguageVersion ClangClToolChain::msvcLanguageVersion(const Core::Id &language, +LanguageVersion ClangClToolChain::msvcLanguageVersion(const QStringList cxxflags, + const Core::Id &language, const Macros ¯os) const { - return ToolChain::languageVersion(language, macros); + if (cxxflags.contains("--driver-mode=g++")) + return ToolChain::languageVersion(language, macros); + return MsvcToolChain::msvcLanguageVersion(cxxflags, language, macros); } // -------------------------------------------------------------------------- diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h index 73c683daf96..b6a205e83bd 100644 --- a/src/plugins/projectexplorer/msvctoolchain.h +++ b/src/plugins/projectexplorer/msvctoolchain.h @@ -94,7 +94,8 @@ protected: // Function must be thread-safe! Macros msvcPredefinedMacros(const QStringList cxxflags, const Utils::Environment &env) const override; - LanguageVersion msvcLanguageVersion(const Core::Id &language, + LanguageVersion msvcLanguageVersion(const QStringList cxxflags, + const Core::Id &language, const Macros ¯os) const override; struct GenerateEnvResult @@ -141,7 +142,8 @@ public: void resetMsvcToolChain(const MsvcToolChain *base = nullptr); Macros msvcPredefinedMacros(const QStringList cxxflags, const Utils::Environment &env) const override; - LanguageVersion msvcLanguageVersion(const Core::Id &language, + LanguageVersion msvcLanguageVersion(const QStringList cxxflags, + const Core::Id &language, const Macros ¯os) const override; bool operator ==(const ToolChain &) const override;