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() { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits