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 <christian.kandeler@theqtcompany.com>
This commit is contained in:
Nikolai Kosjar
2016-04-01 12:38:12 +02:00
parent 1bf5ba8421
commit daf08d8702
2 changed files with 14 additions and 1 deletions

View File

@@ -82,7 +82,9 @@ ClangStaticAnalyzerRunControl::ClangStaticAnalyzerRunControl(
ToolChain *toolChain = ToolChainKitInformation::toolChain(target->kit()); ToolChain *toolChain = ToolChainKitInformation::toolChain(target->kit());
QTC_ASSERT(toolChain, return); 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(); m_extraToolChainInfo.targetTriple = toolChain->originalTargetTriple();
} }
@@ -140,6 +142,14 @@ QStringList inputAndOutputArgumentsRemoved(const QString &inputFile, const QStri
return newArguments; 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, static QStringList tweakedArguments(const QString &filePath,
const QStringList &arguments, const QStringList &arguments,
const ExtraToolChainInfo &extraParams) const ExtraToolChainInfo &extraParams)
@@ -147,6 +157,7 @@ static QStringList tweakedArguments(const QString &filePath,
QStringList newArguments = inputAndOutputArgumentsRemoved(filePath, arguments); QStringList newArguments = inputAndOutputArgumentsRemoved(filePath, arguments);
prependWordWidthArgumentIfNotIncluded(&newArguments, extraParams.wordWidth); prependWordWidthArgumentIfNotIncluded(&newArguments, extraParams.wordWidth);
prependTargetTripleIfNotIncludedAndNotEmpty(&newArguments, extraParams.targetTriple); prependTargetTripleIfNotIncludedAndNotEmpty(&newArguments, extraParams.targetTriple);
appendMsCompatibility2015OptionForMsvc2015(&newArguments, extraParams.isMsvc2015);
return newArguments; return newArguments;
} }
@@ -199,6 +210,7 @@ public:
QStringList options = optionsBuilder.options(); QStringList options = optionsBuilder.options();
prependWordWidthArgumentIfNotIncluded(&options, extraParams.wordWidth); prependWordWidthArgumentIfNotIncluded(&options, extraParams.wordWidth);
prependTargetTripleIfNotIncludedAndNotEmpty(&options, extraParams.targetTriple); prependTargetTripleIfNotIncludedAndNotEmpty(&options, extraParams.targetTriple);
appendMsCompatibility2015OptionForMsvc2015(&options, extraParams.isMsvc2015);
return options; return options;
} }

View File

@@ -51,6 +51,7 @@ typedef QList<AnalyzeUnit> AnalyzeUnits;
struct ExtraToolChainInfo { struct ExtraToolChainInfo {
unsigned char wordWidth = 0; unsigned char wordWidth = 0;
QString targetTriple; QString targetTriple;
bool isMsvc2015 = false;
}; };
class ClangStaticAnalyzerRunControl : public Debugger::AnalyzerRunControl class ClangStaticAnalyzerRunControl : public Debugger::AnalyzerRunControl