Skip to content

Commit

Permalink
[clangd] Only emit default error/fatal diagnostices from included files.
Browse files Browse the repository at this point in the history
Summary:
This would avoid adding too much noise when there is a "-Wall" in the
compile command.

Reviewers: sammccall

Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D79923
  • Loading branch information
hokein committed May 14, 2020
1 parent 9ffaba8 commit dbc9e1c
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
7 changes: 5 additions & 2 deletions clang-tools-extra/clangd/Diagnostics.cpp
Expand Up @@ -124,7 +124,9 @@ Range diagnosticRange(const clang::Diagnostic &D, const LangOptions &L) {
bool adjustDiagFromHeader(Diag &D, const clang::Diagnostic &Info,
const LangOptions &LangOpts) {
// We only report diagnostics with at least error severity from headers.
if (D.Severity < DiagnosticsEngine::Level::Error)
// Use default severity to avoid noise with -Werror.
if (!Info.getDiags()->getDiagnosticIDs()->isDefaultMappingAsError(
Info.getID()))
return false;

const SourceManager &SM = Info.getSourceManager();
Expand Down Expand Up @@ -514,7 +516,8 @@ void StoreDiags::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
if (Info.getLocation().isInvalid()) {
// Handle diagnostics coming from command-line arguments. The source manager
// is *not* available at this point, so we cannot use it.
if (DiagLevel < DiagnosticsEngine::Level::Error) {
if (!Info.getDiags()->getDiagnosticIDs()->isDefaultMappingAsError(
Info.getID())) {
IgnoreDiagnostics::log(DiagLevel, Info);
return; // non-errors add too much noise, do not show them.
}
Expand Down
14 changes: 14 additions & 0 deletions clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
Expand Up @@ -1033,6 +1033,20 @@ TEST(DiagsInHeaders, OnlyErrorOrFatal) {
WithNote(Diag(Header.range(), "error occurred here")))));
}

TEST(DiagsInHeaders, OnlyDefaultErrorOrFatal) {
Annotations Main(R"cpp(
#include [["a.h"]] // get unused "foo" warning when building preamble.
)cpp");
Annotations Header(R"cpp(
namespace { void foo() {} }
void func() {foo();} ;)cpp");
TestTU TU = TestTU::withCode(Main.code());
TU.AdditionalFiles = {{"a.h", std::string(Header.code())}};
// promote warnings to errors.
TU.ExtraArgs = {"-Werror", "-Wunused"};
EXPECT_THAT(TU.build().getDiagnostics(), IsEmpty());
}

TEST(DiagsInHeaders, FromNonWrittenSources) {
Annotations Main(R"cpp(
#include [["a.h"]]
Expand Down

0 comments on commit dbc9e1c

Please sign in to comment.