[clang-tools-extra] e6a971b - [clangd] Respect diagnostic suppression during preamble build
Nathan Ridge via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 25 14:40:02 PDT 2021
Author: Nathan Ridge
Date: 2021-10-25T17:39:32-04:00
New Revision: e6a971b1baecbeab612600337c1d2f06e3dea702
URL: https://github.com/llvm/llvm-project/commit/e6a971b1baecbeab612600337c1d2f06e3dea702
DIFF: https://github.com/llvm/llvm-project/commit/e6a971b1baecbeab612600337c1d2f06e3dea702.diff
LOG: [clangd] Respect diagnostic suppression during preamble build
Fixes https://github.com/clangd/clangd/issues/906
Differential Revision: https://reviews.llvm.org/D112403
Added:
Modified:
clang-tools-extra/clangd/Preamble.cpp
clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/Preamble.cpp b/clang-tools-extra/clangd/Preamble.cpp
index b307f99821b1..8b80ee1bc265 100644
--- a/clang-tools-extra/clangd/Preamble.cpp
+++ b/clang-tools-extra/clangd/Preamble.cpp
@@ -8,6 +8,7 @@
#include "Preamble.h"
#include "Compiler.h"
+#include "Config.h"
#include "Headers.h"
#include "SourceCode.h"
#include "support/Logger.h"
@@ -347,20 +348,24 @@ buildPreamble(PathRef FileName, CompilerInvocation CI,
llvm::IntrusiveRefCntPtr<DiagnosticsEngine> PreambleDiagsEngine =
CompilerInstance::createDiagnostics(&CI.getDiagnosticOpts(),
&PreambleDiagnostics, false);
- PreambleDiagnostics.setLevelAdjuster(
- [&](DiagnosticsEngine::Level DiagLevel, const clang::Diagnostic &Info) {
- switch (Info.getID()) {
- case diag::warn_no_newline_eof:
- case diag::warn_cxx98_compat_no_newline_eof:
- case diag::ext_no_newline_eof:
- // If the preamble doesn't span the whole file, drop the no newline at
- // eof warnings.
- return Bounds.Size != ContentsBuffer->getBufferSize()
- ? DiagnosticsEngine::Level::Ignored
- : DiagLevel;
- }
- return DiagLevel;
- });
+ const Config &Cfg = Config::current();
+ PreambleDiagnostics.setLevelAdjuster([&](DiagnosticsEngine::Level DiagLevel,
+ const clang::Diagnostic &Info) {
+ if (Cfg.Diagnostics.SuppressAll ||
+ isBuiltinDiagnosticSuppressed(Info.getID(), Cfg.Diagnostics.Suppress))
+ return DiagnosticsEngine::Ignored;
+ switch (Info.getID()) {
+ case diag::warn_no_newline_eof:
+ case diag::warn_cxx98_compat_no_newline_eof:
+ case diag::ext_no_newline_eof:
+ // If the preamble doesn't span the whole file, drop the no newline at
+ // eof warnings.
+ return Bounds.Size != ContentsBuffer->getBufferSize()
+ ? DiagnosticsEngine::Level::Ignored
+ : DiagLevel;
+ }
+ return DiagLevel;
+ });
// Skip function bodies when building the preamble to speed up building
// the preamble and make it smaller.
diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
index 45e55585ad5d..1b778e4d0388 100644
--- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
@@ -449,6 +449,21 @@ TEST(DiagnosticTest, RespectsDiagnosticConfig) {
"use of undeclared identifier 'unknown'")));
}
+TEST(DiagnosticTest, RespectsDiagnosticConfigInHeader) {
+ Annotations Header(R"cpp(
+ int x = "42"; // error-ok
+ )cpp");
+ Annotations Main(R"cpp(
+ #include "header.hpp"
+ )cpp");
+ auto TU = TestTU::withCode(Main.code());
+ TU.AdditionalFiles["header.hpp"] = std::string(Header.code());
+ Config Cfg;
+ Cfg.Diagnostics.Suppress.insert("init_conversion_failed");
+ WithContextValue WithCfg(Config::Key, std::move(Cfg));
+ EXPECT_THAT(*TU.build().getDiagnostics(), IsEmpty());
+}
+
TEST(DiagnosticTest, ClangTidySuppressionComment) {
Annotations Main(R"cpp(
int main() {
More information about the cfe-commits
mailing list