forked from qt-creator/qt-creator
ClangStaticAnalyzer: Undefine clang version macros for MSVC Kits
This fixes parsing of Qt 5.7.0 headers with a MSVC Kit. Re-produce with: 1) Open qt-essential-includes.pro or the *.qbs and configure it with a Qt 5.7.0 MSVC2013 Kit. 2) Run the analyzer. Errors during analyzing occur in qtypetraits.h [1] because * Q_COMPILER_UNICODE_STRINGS is defined in qcompilerdetection.h because... * Q_CC_CLANG is defined because... * __clang* is defined. Undefine the __clang* macros so the "right" compiler will be detected. [1] In file included from D:\dev\creator\creator-4.1\src\plugins\clangstaticanalyzer\unit-tests\qt-essential-includes\main.cpp:1: In file included from D:/usr/qt-5.7.0-msvc2013_32/5.7/msvc2013/include/QtCore\QtCore:4: In file included from D:/usr/qt-5.7.0-msvc2013_32/5.7/msvc2013/include/QtCore/qabstractanimation.h:43: In file included from D:/usr/qt-5.7.0-msvc2013_32/5.7/msvc2013/include\QtCore/qobject.h:46: In file included from D:/usr/qt-5.7.0-msvc2013_32/5.7/msvc2013/include\QtCore/qobjectdefs.h:48: In file included from D:/usr/qt-5.7.0-msvc2013_32/5.7/msvc2013/include\QtCore/qnamespace.h:43: In file included from D:/usr/qt-5.7.0-msvc2013_32/5.7/msvc2013/include\QtCore/qglobal.h:1139: In file included from D:/usr/qt-5.7.0-msvc2013_32/5.7/msvc2013/include\QtCore/qtypeinfo.h:41: D:/usr/qt-5.7.0-msvc2013_32/5.7/msvc2013/include\QtCore/qtypetraits.h(251,19) : error: redefinition of 'QtPrivate::is_integral<unsigned short>' template<> struct is_integral<char16_t> : true_type { }; ^~~~~~~~~~~~~~~~~~~~~ D:/usr/qt-5.7.0-msvc2013_32/5.7/msvc2013/include\QtCore/qtypetraits.h(235,19) : note: previous definition is here template<> struct is_integral<unsigned short> : true_type { }; Change-Id: I10da2a1daa6f5ea2828f7ea4bcf594050a585b61 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -184,6 +184,7 @@ public:
|
||||
optionsBuilder.addDefine("#define _X86INTRIN_H_INCLUDED\n");
|
||||
|
||||
optionsBuilder.addToolchainAndProjectDefines();
|
||||
optionsBuilder.undefineClangVersionMacrosForMsvc();
|
||||
optionsBuilder.undefineCppLanguageFeatureMacrosForMsvc2015();
|
||||
optionsBuilder.addHeaderPathOptions();
|
||||
optionsBuilder.addMsvcCompatibilityVersion();
|
||||
@@ -203,6 +204,23 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
void undefineClangVersionMacrosForMsvc()
|
||||
{
|
||||
if (m_projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) {
|
||||
static QStringList macroNames {
|
||||
"__clang__",
|
||||
"__clang_major__",
|
||||
"__clang_minor__",
|
||||
"__clang_patchlevel__",
|
||||
"__clang_version__"
|
||||
};
|
||||
|
||||
foreach (const QString ¯oName, macroNames)
|
||||
add(QLatin1String("/U") + macroName);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
void addTargetTriple() override
|
||||
{
|
||||
@@ -272,6 +290,14 @@ static QStringList createOptionsToUndefineCppLanguageFeatureMacrosForMsvc2015(
|
||||
return optionsBuilder.options();
|
||||
}
|
||||
|
||||
static QStringList createOptionsToUndefineClangVersionMacrosForMsvc(const ProjectPart &projectPart)
|
||||
{
|
||||
ClangStaticAnalyzerOptionsBuilder optionsBuilder(projectPart);
|
||||
optionsBuilder.undefineClangVersionMacrosForMsvc();
|
||||
|
||||
return optionsBuilder.options();
|
||||
}
|
||||
|
||||
static QStringList tweakedArguments(const ProjectPart &projectPart,
|
||||
const QString &filePath,
|
||||
const QStringList &arguments,
|
||||
@@ -281,6 +307,7 @@ static QStringList tweakedArguments(const ProjectPart &projectPart,
|
||||
prependWordWidthArgumentIfNotIncluded(&newArguments, extraParams.wordWidth);
|
||||
prependTargetTripleIfNotIncludedAndNotEmpty(&newArguments, extraParams.targetTriple);
|
||||
newArguments.append(createMsCompatibilityVersionOption(projectPart));
|
||||
newArguments.append(createOptionsToUndefineClangVersionMacrosForMsvc(projectPart));
|
||||
newArguments.append(createOptionsToUndefineCppLanguageFeatureMacrosForMsvc2015(projectPart));
|
||||
|
||||
return newArguments;
|
||||
|
Reference in New Issue
Block a user