Author: Sam McCall Date: 2022-01-13T22:24:05+01:00 New Revision: 004acbb47d61ffcc52da0c85ef6e6747a7cc7c14
URL: https://github.com/llvm/llvm-project/commit/004acbb47d61ffcc52da0c85ef6e6747a7cc7c14 DIFF: https://github.com/llvm/llvm-project/commit/004acbb47d61ffcc52da0c85ef6e6747a7cc7c14.diff LOG: [clangd] Suppress warning about system_header pragma when editing headers Not sure it's OK to suppress this in clang itself - if we're building a PCH or module, maybe it matters? Differential Revision: https://reviews.llvm.org/D116925 Added: Modified: clang-tools-extra/clangd/Diagnostics.cpp clang-tools-extra/clangd/Diagnostics.h clang-tools-extra/clangd/ParsedAST.cpp clang-tools-extra/clangd/Preamble.cpp clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/Diagnostics.cpp b/clang-tools-extra/clangd/Diagnostics.cpp index f3482c14184f..044ef1934426 100644 --- a/clang-tools-extra/clangd/Diagnostics.cpp +++ b/clang-tools-extra/clangd/Diagnostics.cpp @@ -879,7 +879,14 @@ void StoreDiags::flushLastDiag() { } bool isBuiltinDiagnosticSuppressed(unsigned ID, - const llvm::StringSet<> &Suppress) { + const llvm::StringSet<> &Suppress, + const LangOptions &LangOpts) { + // Don't complain about header-only stuff in mainfiles if it's a header. + // FIXME: would be cleaner to suppress in clang, once we decide whether the + // behavior should be to silently-ignore or respect the pragma. + if (ID == diag::pp_pragma_sysheader_in_main_file && LangOpts.IsHeaderFile) + return true; + if (const char *CodePtr = getDiagnosticCode(ID)) { if (Suppress.contains(normalizeSuppressedCode(CodePtr))) return true; diff --git a/clang-tools-extra/clangd/Diagnostics.h b/clang-tools-extra/clangd/Diagnostics.h index 99de0e1a611e..718a5583a36d 100644 --- a/clang-tools-extra/clangd/Diagnostics.h +++ b/clang-tools-extra/clangd/Diagnostics.h @@ -180,7 +180,8 @@ class StoreDiags : public DiagnosticConsumer { /// Determine whether a (non-clang-tidy) diagnostic is suppressed by config. bool isBuiltinDiagnosticSuppressed(unsigned ID, - const llvm::StringSet<> &Suppressed); + const llvm::StringSet<> &Suppressed, + const LangOptions &); /// Take a user-specified diagnostic code, and convert it to a normalized form /// stored in the config and consumed by isBuiltinDiagnosticsSuppressed. /// diff --git a/clang-tools-extra/clangd/ParsedAST.cpp b/clang-tools-extra/clangd/ParsedAST.cpp index 42552e9831a0..9c64c645130b 100644 --- a/clang-tools-extra/clangd/ParsedAST.cpp +++ b/clang-tools-extra/clangd/ParsedAST.cpp @@ -445,7 +445,8 @@ ParsedAST::build(llvm::StringRef Filename, const ParseInputs &Inputs, ASTDiags.setLevelAdjuster([&](DiagnosticsEngine::Level DiagLevel, const clang::Diagnostic &Info) { if (Cfg.Diagnostics.SuppressAll || - isBuiltinDiagnosticSuppressed(Info.getID(), Cfg.Diagnostics.Suppress)) + isBuiltinDiagnosticSuppressed(Info.getID(), Cfg.Diagnostics.Suppress, + Clang->getLangOpts())) return DiagnosticsEngine::Ignored; auto It = OverriddenSeverity.find(Info.getID()); diff --git a/clang-tools-extra/clangd/Preamble.cpp b/clang-tools-extra/clangd/Preamble.cpp index 34f3caa5e34b..f3328df3f51f 100644 --- a/clang-tools-extra/clangd/Preamble.cpp +++ b/clang-tools-extra/clangd/Preamble.cpp @@ -350,7 +350,8 @@ buildPreamble(PathRef FileName, CompilerInvocation CI, PreambleDiagnostics.setLevelAdjuster([&](DiagnosticsEngine::Level DiagLevel, const clang::Diagnostic &Info) { if (Cfg.Diagnostics.SuppressAll || - isBuiltinDiagnosticSuppressed(Info.getID(), Cfg.Diagnostics.Suppress)) + isBuiltinDiagnosticSuppressed(Info.getID(), Cfg.Diagnostics.Suppress, + *CI.getLangOpts())) return DiagnosticsEngine::Ignored; switch (Info.getID()) { case diag::warn_no_newline_eof: diff --git a/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp b/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp index 661784256af8..53406c09e92d 100644 --- a/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp +++ b/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp @@ -277,19 +277,20 @@ TEST_F(ConfigCompileTests, DiagnosticSuppression) { "unreachable-code", "unused-variable", "typecheck_bool_condition", "unexpected_friend", "warn_alloca")); - EXPECT_TRUE(isBuiltinDiagnosticSuppressed(diag::warn_unreachable, - Conf.Diagnostics.Suppress)); + EXPECT_TRUE(isBuiltinDiagnosticSuppressed( + diag::warn_unreachable, Conf.Diagnostics.Suppress, LangOptions())); // Subcategory not respected/suppressed. - EXPECT_FALSE(isBuiltinDiagnosticSuppressed(diag::warn_unreachable_break, - Conf.Diagnostics.Suppress)); - EXPECT_TRUE(isBuiltinDiagnosticSuppressed(diag::warn_unused_variable, - Conf.Diagnostics.Suppress)); + EXPECT_FALSE(isBuiltinDiagnosticSuppressed( + diag::warn_unreachable_break, Conf.Diagnostics.Suppress, LangOptions())); + EXPECT_TRUE(isBuiltinDiagnosticSuppressed( + diag::warn_unused_variable, Conf.Diagnostics.Suppress, LangOptions())); EXPECT_TRUE(isBuiltinDiagnosticSuppressed(diag::err_typecheck_bool_condition, - Conf.Diagnostics.Suppress)); - EXPECT_TRUE(isBuiltinDiagnosticSuppressed(diag::err_unexpected_friend, - Conf.Diagnostics.Suppress)); - EXPECT_TRUE(isBuiltinDiagnosticSuppressed(diag::warn_alloca, - Conf.Diagnostics.Suppress)); + Conf.Diagnostics.Suppress, + LangOptions())); + EXPECT_TRUE(isBuiltinDiagnosticSuppressed( + diag::err_unexpected_friend, Conf.Diagnostics.Suppress, LangOptions())); + EXPECT_TRUE(isBuiltinDiagnosticSuppressed( + diag::warn_alloca, Conf.Diagnostics.Suppress, LangOptions())); Frag.Diagnostics.Suppress.emplace_back("*"); EXPECT_TRUE(compileAndApply()); diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp index 40a5d557d720..5303917402af 100644 --- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp @@ -771,6 +771,17 @@ TEST(DiagnosticsTest, NoFixItInMacro) { Not(WithFix(_))))); } +TEST(DiagnosticsTest, PragmaSystemHeader) { + Annotations Test("#pragma clang [[system_header]]\n"); + auto TU = TestTU::withCode(Test.code()); + EXPECT_THAT( + *TU.build().getDiagnostics(), + ElementsAre(AllOf( + Diag(Test.range(), "#pragma system_header ignored in main file")))); + TU.Filename = "TestTU.h"; + EXPECT_THAT(*TU.build().getDiagnostics(), IsEmpty()); +} + TEST(ClangdTest, MSAsm) { // Parsing MS assembly tries to use the target MCAsmInfo, which we don't link. // We used to crash here. Now clang emits a diagnostic, which we filter out. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits