diff options
author | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2016-04-11 11:53:50 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@theqtcompany.com> | 2016-04-12 12:59:03 +0000 |
commit | 5ff5211a2570e0e894f53bfedb1f1102bde4d58c (patch) | |
tree | 809350fbe5c0a9b591f3d6119dbc4b79991c1214 /src/plugins/cpptools/compileroptionsbuilder.cpp | |
parent | b0959ee66f086f3a818d34d1ebc763622feddfd4 (diff) | |
download | qt-creator-5ff5211a2570e0e894f53bfedb1f1102bde4d58c.tar.gz |
Clang: Set -fms-compatibility-version explicitly
Infer the version from the _MSC_FULL_VER macro, so it cannot get out of sync
with that.
Adapt the analyzer to do the same.
Based on
commit daf08d8702905335e3fc63c629f917e99715b915
Clang Static Analyzer: Workaround analyzing MSVC2015 projects with clang 3.8.0
Change-Id: I9d34abdbe2c83fe271eadd8d051caad43aca6772
Reviewed-by: Christian Kandeler <christian.kandeler@theqtcompany.com>
Diffstat (limited to 'src/plugins/cpptools/compileroptionsbuilder.cpp')
-rw-r--r-- | src/plugins/cpptools/compileroptionsbuilder.cpp | 80 |
1 files changed, 73 insertions, 7 deletions
diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp index b520babef1..6de6a44d5d 100644 --- a/src/plugins/cpptools/compileroptionsbuilder.cpp +++ b/src/plugins/cpptools/compileroptionsbuilder.cpp @@ -44,16 +44,39 @@ void CompilerOptionsBuilder::add(const QString &option) m_options.append(option); } -QString CompilerOptionsBuilder::defineLineToDefineOption(const QByteArray &defineLine) +struct Macro { + static Macro fromDefineDirective(const QByteArray &defineDirective); + QByteArray toDefineOption(const QByteArray &option) const; + + QByteArray name; + QByteArray value; +}; + +Macro Macro::fromDefineDirective(const QByteArray &defineDirective) { - QByteArray str = defineLine.mid(8); - int spaceIdx = str.indexOf(' '); - const QString option = defineOption(); + const QByteArray str = defineDirective.mid(8); + const int spaceIdx = str.indexOf(' '); const bool hasValue = spaceIdx != -1; - QString arg = option + QLatin1String(str.left(hasValue ? spaceIdx : str.size()) + '='); + + Macro macro; + macro.name = str.left(hasValue ? spaceIdx : str.size()); if (hasValue) - arg += QLatin1String(str.mid(spaceIdx + 1)); - return arg; + macro.value = str.mid(spaceIdx + 1); + + return macro; +} + +QByteArray Macro::toDefineOption(const QByteArray &option) const +{ + QByteArray result; + + result.append(option); + result.append(name); + result.append('='); + if (!value.isEmpty()) + result.append(value); + + return result; } void CompilerOptionsBuilder::addDefine(const QByteArray &defineLine) @@ -225,11 +248,54 @@ void CompilerOptionsBuilder::addOptionsForLanguage(bool checkForBorlandExtension m_options.append(opts); } +static QByteArray toMsCompatibilityVersionFormat(const QByteArray &mscFullVer) +{ + return mscFullVer.left(2) + + QByteArray(".") + + mscFullVer.mid(2, 2); +} + +static QByteArray msCompatibilityVersionFromDefines(const QByteArray &defineDirectives) +{ + foreach (QByteArray defineDirective, defineDirectives.split('\n')) { + if (defineDirective.isEmpty()) + continue; + + const Macro macro = Macro::fromDefineDirective(defineDirective); + if (macro.name == "_MSC_FULL_VER") + return toMsCompatibilityVersionFormat(macro.value); + } + + return QByteArray(); +} + +void CompilerOptionsBuilder::addMsvcCompatibilityVersion() +{ + if (m_projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) { + const QByteArray defines = m_projectPart.toolchainDefines + m_projectPart.projectDefines; + const QByteArray msvcVersion = msCompatibilityVersionFromDefines(defines); + + if (!msvcVersion.isEmpty()) { + const QString option = QLatin1String("-fms-compatibility-version=") + + QLatin1String(msvcVersion); + m_options.append(option); + } + } +} + QString CompilerOptionsBuilder::includeOption() const { return QLatin1String("-I"); } +QString CompilerOptionsBuilder::defineLineToDefineOption(const QByteArray &defineLine) +{ + const Macro macro = Macro::fromDefineDirective(defineLine); + const QByteArray option = macro.toDefineOption(defineOption().toLatin1()); + + return QString::fromLatin1(option); +} + QString CompilerOptionsBuilder::defineOption() const { return QLatin1String("-D"); |