[clang-tools-extra] 004acbb - [clangd] Suppress warning about system_header pragma when editing headers
Sam McCall via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 13 13:24:11 PST 2022
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.
More information about the cfe-commits
mailing list