forked from qt-creator/qt-creator
Clang: Ignore certain warnings in header files
We already had this workarounded, but it got lost in the refactorings. Task-number: QTCREATORBUG-12067 Change-Id: Ie01f9d41f25d17d1b595204748634bc87ef44378 Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com> Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
@@ -25,6 +25,10 @@
|
|||||||
|
|
||||||
#include "clangdiagnosticfilter.h"
|
#include "clangdiagnosticfilter.h"
|
||||||
|
|
||||||
|
#include <cpptools/cppprojectfile.h>
|
||||||
|
|
||||||
|
#include <utf8stringvector.h>
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
bool isWarningOrNote(ClangBackEnd::DiagnosticSeverity severity)
|
bool isWarningOrNote(ClangBackEnd::DiagnosticSeverity severity)
|
||||||
@@ -41,6 +45,17 @@ bool isWarningOrNote(ClangBackEnd::DiagnosticSeverity severity)
|
|||||||
Q_UNREACHABLE();
|
Q_UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isBlackListedDiagnostic(const ClangBackEnd::DiagnosticContainer &diagnostic,
|
||||||
|
bool isHeaderFile)
|
||||||
|
{
|
||||||
|
static const Utf8StringVector blackList {
|
||||||
|
Utf8StringLiteral("warning: #pragma once in main file"),
|
||||||
|
Utf8StringLiteral("warning: #include_next in primary source file")
|
||||||
|
};
|
||||||
|
|
||||||
|
return isHeaderFile && blackList.contains(diagnostic.text());
|
||||||
|
}
|
||||||
|
|
||||||
template <class Condition>
|
template <class Condition>
|
||||||
QVector<ClangBackEnd::DiagnosticContainer>
|
QVector<ClangBackEnd::DiagnosticContainer>
|
||||||
filterDiagnostics(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics,
|
filterDiagnostics(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics,
|
||||||
@@ -76,8 +91,13 @@ namespace Internal {
|
|||||||
void ClangDiagnosticFilter::filterDocumentRelatedWarnings(
|
void ClangDiagnosticFilter::filterDocumentRelatedWarnings(
|
||||||
const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics)
|
const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics)
|
||||||
{
|
{
|
||||||
const auto isLocalWarning = [this] (const ClangBackEnd::DiagnosticContainer &diagnostic) {
|
using namespace CppTools;
|
||||||
|
const bool isHeaderFile = ProjectFile::isHeader(ProjectFile::classify(m_filePath));
|
||||||
|
|
||||||
|
const auto isLocalWarning = [this, isHeaderFile]
|
||||||
|
(const ClangBackEnd::DiagnosticContainer &diagnostic) {
|
||||||
return isWarningOrNote(diagnostic.severity())
|
return isWarningOrNote(diagnostic.severity())
|
||||||
|
&& !isBlackListedDiagnostic(diagnostic, isHeaderFile)
|
||||||
&& diagnostic.location().filePath() == m_filePath;
|
&& diagnostic.location().filePath() == m_filePath;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ contains(CONFIG, dll) {
|
|||||||
DEFINES += CPPTOOLS_STATIC_LIBRARY
|
DEFINES += CPPTOOLS_STATIC_LIBRARY
|
||||||
}
|
}
|
||||||
|
|
||||||
HEADERS += $$PWD/senddocumenttracker.h
|
HEADERS += \
|
||||||
|
$$PWD/cppprojectfile.h \
|
||||||
|
$$PWD/senddocumenttracker.h \
|
||||||
|
|
||||||
SOURCES += $$PWD/senddocumenttracker.cpp
|
SOURCES += \
|
||||||
|
$$PWD/cppprojectfile.cpp \
|
||||||
|
$$PWD/senddocumenttracker.cpp
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ DiagnosticContainer createDiagnostic(const QString &text,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QString mainFileHeaderPath = QString::fromUtf8(TESTDATA_DIR "/someHeader.h");
|
||||||
const QString mainFilePath = QString::fromUtf8(TESTDATA_DIR "/diagnostic_erroneous_source.cpp");
|
const QString mainFilePath = QString::fromUtf8(TESTDATA_DIR "/diagnostic_erroneous_source.cpp");
|
||||||
const QString includedFilePath = QString::fromUtf8(TESTDATA_DIR "/diagnostic_erroneous_header.cpp");
|
const QString includedFilePath = QString::fromUtf8(TESTDATA_DIR "/diagnostic_erroneous_header.cpp");
|
||||||
|
|
||||||
@@ -91,6 +92,22 @@ DiagnosticContainer warningFromMainFile()
|
|||||||
mainFilePath);
|
mainFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DiagnosticContainer pragmaOnceWarningInHeader()
|
||||||
|
{
|
||||||
|
return createDiagnostic(
|
||||||
|
QStringLiteral("warning: #pragma once in main file"),
|
||||||
|
ClangBackEnd::DiagnosticSeverity::Warning,
|
||||||
|
mainFileHeaderPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
DiagnosticContainer includeNextInPrimarySourceFileWarningInHeader()
|
||||||
|
{
|
||||||
|
return createDiagnostic(
|
||||||
|
QStringLiteral("warning: #include_next in primary source file"),
|
||||||
|
ClangBackEnd::DiagnosticSeverity::Warning,
|
||||||
|
mainFileHeaderPath);
|
||||||
|
}
|
||||||
|
|
||||||
DiagnosticContainer errorFromMainFile()
|
DiagnosticContainer errorFromMainFile()
|
||||||
{
|
{
|
||||||
return createDiagnostic(
|
return createDiagnostic(
|
||||||
@@ -193,6 +210,16 @@ TEST_F(ClangDiagnosticFilter, WarningsAreEmptyAfterTaking)
|
|||||||
ASSERT_TRUE(clangDiagnosticFilter.takeWarnings().isEmpty());
|
ASSERT_TRUE(clangDiagnosticFilter.takeWarnings().isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ClangDiagnosticFilter, IgnoreCertainWarningsInHeaderFiles)
|
||||||
|
{
|
||||||
|
ClangCodeModel::Internal::ClangDiagnosticFilter myClangDiagnosticFilter{mainFileHeaderPath};
|
||||||
|
|
||||||
|
myClangDiagnosticFilter.filter({pragmaOnceWarningInHeader(),
|
||||||
|
includeNextInPrimarySourceFileWarningInHeader()});
|
||||||
|
|
||||||
|
ASSERT_TRUE(myClangDiagnosticFilter.takeWarnings().isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(ClangDiagnosticFilter, ErrorsAreEmptyAfterTaking)
|
TEST_F(ClangDiagnosticFilter, ErrorsAreEmptyAfterTaking)
|
||||||
{
|
{
|
||||||
clangDiagnosticFilter.filter({errorFromMainFile()});
|
clangDiagnosticFilter.filter({errorFromMainFile()});
|
||||||
|
|||||||
Reference in New Issue
Block a user