From daf08d8702905335e3fc63c629f917e99715b915 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 1 Apr 2016 12:38:12 +0200 Subject: [PATCH] Clang Static Analyzer: Workaround analyzing MSVC2015 projects with clang 3.8.0 Clang 3.8.0 does not detect the MSVC2015 build environment properly. Running $ clang.exe -v -fsyntax-only empty.cpp shows -fms-compatibility-version=18 (=MSVC2013) instead of the expected -fms-compatibility-version=19 (=MSVC2015) Workaround this by setting the version explicitly for MSVC2015 toolchains. This fixes parse issues with char16_t and friends. We do not explicitly check for the clang version since clang 3.6.2 is broken for MSVC2015 anyway and we do not know whether clang 3.8.1 will come with a fix. Task-number: QTCREATORBUG-15940 Change-Id: Ibe61af25f6d74f134cc9f9681db5a4d19ac67417 Reviewed-by: Christian Kandeler --- .../clangstaticanalyzerruncontrol.cpp | 14 +++++++++++++- .../clangstaticanalyzerruncontrol.h | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp index c632dc7a08d..2d955e255ad 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp @@ -82,7 +82,9 @@ ClangStaticAnalyzerRunControl::ClangStaticAnalyzerRunControl( ToolChain *toolChain = ToolChainKitInformation::toolChain(target->kit()); QTC_ASSERT(toolChain, return); - m_extraToolChainInfo.wordWidth = runConfiguration->abi().wordWidth(); + Abi abi = runConfiguration->abi(); + m_extraToolChainInfo.wordWidth = abi.wordWidth(); + m_extraToolChainInfo.isMsvc2015 = abi.osFlavor() == Abi::WindowsMsvc2015Flavor; m_extraToolChainInfo.targetTriple = toolChain->originalTargetTriple(); } @@ -140,6 +142,14 @@ QStringList inputAndOutputArgumentsRemoved(const QString &inputFile, const QStri return newArguments; } +static void appendMsCompatibility2015OptionForMsvc2015(QStringList *arguments, bool isMsvc2015) +{ + QTC_ASSERT(arguments, return); + + if (isMsvc2015) + arguments->append(QLatin1String("-fms-compatibility-version=19")); +} + static QStringList tweakedArguments(const QString &filePath, const QStringList &arguments, const ExtraToolChainInfo &extraParams) @@ -147,6 +157,7 @@ static QStringList tweakedArguments(const QString &filePath, QStringList newArguments = inputAndOutputArgumentsRemoved(filePath, arguments); prependWordWidthArgumentIfNotIncluded(&newArguments, extraParams.wordWidth); prependTargetTripleIfNotIncludedAndNotEmpty(&newArguments, extraParams.targetTriple); + appendMsCompatibility2015OptionForMsvc2015(&newArguments, extraParams.isMsvc2015); return newArguments; } @@ -199,6 +210,7 @@ public: QStringList options = optionsBuilder.options(); prependWordWidthArgumentIfNotIncluded(&options, extraParams.wordWidth); prependTargetTripleIfNotIncludedAndNotEmpty(&options, extraParams.targetTriple); + appendMsCompatibility2015OptionForMsvc2015(&options, extraParams.isMsvc2015); return options; } diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h index 525b2a351d2..c05a5714fd3 100644 --- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h +++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.h @@ -51,6 +51,7 @@ typedef QList AnalyzeUnits; struct ExtraToolChainInfo { unsigned char wordWidth = 0; QString targetTriple; + bool isMsvc2015 = false; }; class ClangStaticAnalyzerRunControl : public Debugger::AnalyzerRunControl