[clang-tools-extra] [clang-tidy] Skip user headers named like C headers in `modernize-deprecated-headers` (PR #195507)
Zeyi Xu via cfe-commits
cfe-commits at lists.llvm.org
Sun May 3 01:06:35 PDT 2026
https://github.com/zeyi2 updated https://github.com/llvm/llvm-project/pull/195507
>From 7cf6958a40c1cc3e52371efa03959db74eac8524 Mon Sep 17 00:00:00 2001
From: Zeyi Xu <mitchell.xu2 at gmail.com>
Date: Sun, 3 May 2026 15:41:57 +0800
Subject: [PATCH 1/2] [clang-tidy] Skip user headers named like C headers
---
.../clang-tidy/modernize/DeprecatedHeadersCheck.cpp | 4 ++++
clang-tools-extra/docs/ReleaseNotes.rst | 5 +++++
.../modernize/Inputs/deprecated-headers/user/assert.h | 1 +
.../checkers/modernize/deprecated-headers-user.cpp | 9 +++++++++
4 files changed, 19 insertions(+)
create mode 100644 clang-tools-extra/test/clang-tidy/checkers/modernize/Inputs/deprecated-headers/user/assert.h
create mode 100644 clang-tools-extra/test/clang-tidy/checkers/modernize/deprecated-headers-user.cpp
diff --git a/clang-tools-extra/clang-tidy/modernize/DeprecatedHeadersCheck.cpp b/clang-tools-extra/clang-tidy/modernize/DeprecatedHeadersCheck.cpp
index eff7c2f36d49d..88c411fcc6633 100644
--- a/clang-tools-extra/clang-tidy/modernize/DeprecatedHeadersCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/DeprecatedHeadersCheck.cpp
@@ -175,6 +175,10 @@ void IncludeModernizePPCallbacks::InclusionDirective(
if (SM.isInSystemHeader(HashLoc))
return;
+ // Skip headers that happen to use the same name as a standard library header.
+ if (!File || !SrcMgr::isSystem(FileType))
+ return;
+
// FIXME: Take care of library symbols from the global namespace.
//
// Reasonable options for the check:
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index c9749df481bcd..ede3942d69106 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -408,6 +408,11 @@ Changes in existing checks
Because it only sees one file at a time, the check can't be sure
such entities aren't referenced in any other files of that module.
+- Improved :doc:`modernize-deprecated-headers
+ <clang-tidy/checks/modernize/deprecated-headers>` check by avoiding false
+ positives on project headers that use the same name as a standard library
+ header.
+
- Improved :doc:`modernize-pass-by-value
<clang-tidy/checks/modernize/pass-by-value>` check by adding `IgnoreMacros`
option to suppress warnings in macros.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/Inputs/deprecated-headers/user/assert.h b/clang-tools-extra/test/clang-tidy/checkers/modernize/Inputs/deprecated-headers/user/assert.h
new file mode 100644
index 0000000000000..1038e93a26f11
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/Inputs/deprecated-headers/user/assert.h
@@ -0,0 +1 @@
+#define USER_ASSERT_H 1
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/deprecated-headers-user.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/deprecated-headers-user.cpp
new file mode 100644
index 0000000000000..4fa74a63b9c37
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/deprecated-headers-user.cpp
@@ -0,0 +1,9 @@
+// RUN: %check_clang_tidy -std=c++11 %s modernize-deprecated-headers %t -- -extra-arg-before=-iquote%S/Inputs/deprecated-headers/user -extra-arg-before=-isystem%S/Inputs/deprecated-headers
+
+#include "assert.h"
+
+#include <assert.h>
+// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: inclusion of deprecated C++ header 'assert.h'; consider using 'cassert' instead [modernize-deprecated-headers]
+// CHECK-FIXES: #include <cassert>
+
+int user_header = USER_ASSERT_H;
>From 1e3bc79234891b5e32d0d66533d5c517a8d1df19 Mon Sep 17 00:00:00 2001
From: Zeyi Xu <mitchell.xu2 at gmail.com>
Date: Sun, 3 May 2026 16:06:11 +0800
Subject: [PATCH 2/2] fixup
---
clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
index 81df26f979ac3..861f3a7973a5a 100644
--- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
@@ -318,12 +318,13 @@ TEST(DiagnosticsTest, ClangTidy) {
}
)cpp");
auto TU = TestTU::withCode(Test.code());
- TU.HeaderFilename = "assert.h"; // Suppress "not found" error.
+ TU.AdditionalFiles["system/assert.h"] = ""; // Suppress "not found" error.
TU.ClangTidyProvider = addTidyChecks("bugprone-sizeof-expression,"
"bugprone-macro-repeated-side-effects,"
"modernize-deprecated-headers,"
"modernize-use-trailing-return-type,"
"misc-no-recursion");
+ TU.ExtraArgs.push_back("-isystem" + testPath("system"));
TU.ExtraArgs.push_back("-Wno-unsequenced");
EXPECT_THAT(
TU.build().getDiagnostics(),
More information about the cfe-commits
mailing list