forked from qt-creator/qt-creator
ClangStaticAnalyzer: Fix path for intrinsics for clang toolchains
Ignore the include path for intrinsics coming from the toolchain. The clang static analyzer comes with its own intrinsics and does not cope well with intrinsics from other clang versions. Move the relevant implementation from LibClangOptionsBuilder into the base class so that ClangStaticAnalyzer profits from this, too. Task-number: QTCREATORBUG-17102 Change-Id: Id9a28ddebb889c862939332dce888a80b3bb7e63 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -38,7 +38,6 @@
|
|||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QRegularExpression>
|
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
using namespace ClangCodeModel;
|
using namespace ClangCodeModel;
|
||||||
@@ -118,18 +117,12 @@ private:
|
|||||||
|
|
||||||
bool excludeHeaderPath(const QString &path) const override
|
bool excludeHeaderPath(const QString &path) const override
|
||||||
{
|
{
|
||||||
if (path.contains(QLatin1String("lib/gcc/i686-apple-darwin")))
|
if (m_projectPart.toolchainType == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID) {
|
||||||
return true;
|
if (path.contains(QLatin1String("lib/gcc/i686-apple-darwin")))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// We already provide a custom clang include path matching the used libclang version,
|
return CompilerOptionsBuilder::excludeHeaderPath(path);
|
||||||
// so better ignore the clang include paths from the system as this might lead to an
|
|
||||||
// unfavorable order with regard to include_next.
|
|
||||||
static QRegularExpression clangIncludeDir(
|
|
||||||
QLatin1String("\\A.*/lib/clang/\\d+\\.\\d+(\\.\\d+)?/include\\z"));
|
|
||||||
if (clangIncludeDir.match(path).hasMatch())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void addPredefinedMacrosAndHeaderPathsOptions()
|
void addPredefinedMacrosAndHeaderPathsOptions()
|
||||||
|
@@ -56,18 +56,12 @@ RefactoringCompilerOptionsBuilder::RefactoringCompilerOptionsBuilder(CppTools::P
|
|||||||
|
|
||||||
bool RefactoringCompilerOptionsBuilder::excludeHeaderPath(const QString &path) const
|
bool RefactoringCompilerOptionsBuilder::excludeHeaderPath(const QString &path) const
|
||||||
{
|
{
|
||||||
if (path.contains(QLatin1String("lib/gcc/i686-apple-darwin")))
|
if (m_projectPart.toolchainType == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID) {
|
||||||
return true;
|
if (path.contains(QLatin1String("lib/gcc/i686-apple-darwin")))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// We already provide a custom clang include path matching the used libclang version,
|
return CompilerOptionsBuilder::excludeHeaderPath(path);
|
||||||
// so better ignore the clang include paths from the system as this might lead to an
|
|
||||||
// unfavorable order with regard to include_next.
|
|
||||||
static QRegularExpression clangIncludeDir(
|
|
||||||
QLatin1String("\\A.*/lib/clang/\\d+\\.\\d+(\\.\\d+)?/include\\z"));
|
|
||||||
if (clangIncludeDir.match(path).hasMatch())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RefactoringCompilerOptionsBuilder::addPredefinedMacrosAndHeaderPathsOptions()
|
void RefactoringCompilerOptionsBuilder::addPredefinedMacrosAndHeaderPathsOptions()
|
||||||
|
@@ -34,7 +34,6 @@
|
|||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QRegularExpression>
|
|
||||||
|
|
||||||
namespace ClangRefactoring {
|
namespace ClangRefactoring {
|
||||||
|
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
#include <projectexplorer/projectexplorerconstants.h>
|
#include <projectexplorer/projectexplorerconstants.h>
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QRegularExpression>
|
||||||
|
|
||||||
namespace CppTools {
|
namespace CppTools {
|
||||||
|
|
||||||
@@ -393,7 +394,15 @@ bool CompilerOptionsBuilder::excludeDefineLine(const QByteArray &defineLine) con
|
|||||||
|
|
||||||
bool CompilerOptionsBuilder::excludeHeaderPath(const QString &headerPath) const
|
bool CompilerOptionsBuilder::excludeHeaderPath(const QString &headerPath) const
|
||||||
{
|
{
|
||||||
Q_UNUSED(headerPath);
|
// A clang tool chain might have another version and passing in the
|
||||||
|
// intrinsics path from that version will lead to errors (unknown
|
||||||
|
// intrinsics, unfavorable order with regard to include_next).
|
||||||
|
if (m_projectPart.toolchainType == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID) {
|
||||||
|
static QRegularExpression clangIncludeDir(
|
||||||
|
QLatin1String("\\A.*/lib/clang/\\d+\\.\\d+(\\.\\d+)?/include\\z"));
|
||||||
|
return clangIncludeDir.match(headerPath).hasMatch();
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user