[clang-tools-extra] [clang-tidy] Speed up deduplicating warnings from alias checks (PR #174237)
Victor Chernyakin via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 2 12:35:09 PST 2026
https://github.com/localspook updated https://github.com/llvm/llvm-project/pull/174237
>From d4b84182ffb5346df7a7d78d2df43a0c54f6d205 Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Fri, 2 Jan 2026 07:49:33 -0800
Subject: [PATCH 1/2] [clang-tidy] Speed up deduplicating warnings from alias
checks
---
.../ClangTidyDiagnosticConsumer.cpp | 45 +++++++++----------
1 file changed, 20 insertions(+), 25 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
index 0355eccc397e5..5718b3f602da9 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -783,38 +783,33 @@ std::vector<ClangTidyError> ClangTidyDiagnosticConsumer::take() {
return std::move(Errors);
}
-namespace {
-struct LessClangTidyErrorWithoutDiagnosticName {
- bool operator()(const ClangTidyError *LHS, const ClangTidyError *RHS) const {
- const tooling::DiagnosticMessage &M1 = LHS->Message;
- const tooling::DiagnosticMessage &M2 = RHS->Message;
-
- return std::tie(M1.FilePath, M1.FileOffset, M1.Message) <
- std::tie(M2.FilePath, M2.FileOffset, M2.Message);
- }
-};
-} // end anonymous namespace
-
void ClangTidyDiagnosticConsumer::removeDuplicatedDiagnosticsOfAliasCheckers() {
- using UniqueErrorSet =
- std::set<ClangTidyError *, LessClangTidyErrorWithoutDiagnosticName>;
- UniqueErrorSet UniqueErrors;
+ if (Errors.size() <= 1)
+ return;
+
+ static constexpr auto Projection = [](const ClangTidyError &E) {
+ const tooling::DiagnosticMessage &M = E.Message;
+ return std::tie(M.FilePath, M.FileOffset, M.Message);
+ };
- auto IT = Errors.begin();
- while (IT != Errors.end()) {
- ClangTidyError &Error = *IT;
- const std::pair<UniqueErrorSet::iterator, bool> Inserted =
- UniqueErrors.insert(&Error);
+ // This orders any duplicates into consecutive runs.
+ llvm::stable_sort(Errors,
+ [](const ClangTidyError &LHS, const ClangTidyError &RHS) {
+ return Projection(LHS) < Projection(RHS);
+ });
+ auto LastUniqueError = Errors.begin();
+ for (ClangTidyError &Error : llvm::drop_begin(Errors, 1)) {
+ ClangTidyError &ExistingError = *LastUniqueError;
// Unique error, we keep it and move along.
- if (Inserted.second) {
- ++IT;
+ if (Projection(Error) != Projection(ExistingError)) {
+ ++LastUniqueError;
+ *LastUniqueError = std::move(Error);
} else {
- ClangTidyError &ExistingError = **Inserted.first;
const llvm::StringMap<tooling::Replacements> &CandidateFix =
Error.Message.Fix;
const llvm::StringMap<tooling::Replacements> &ExistingFix =
- (*Inserted.first)->Message.Fix;
+ ExistingError.Message.Fix;
if (CandidateFix != ExistingFix) {
// In case of a conflict, don't suggest any fix-it.
@@ -833,7 +828,7 @@ void ClangTidyDiagnosticConsumer::removeDuplicatedDiagnosticsOfAliasCheckers() {
// Since it is the same error, we should take it as alias and remove it.
ExistingError.EnabledDiagnosticAliases.emplace_back(Error.DiagnosticName);
- IT = Errors.erase(IT);
}
}
+ Errors.erase(LastUniqueError + 1, Errors.end());
}
>From 22267ce3b209630494bf11c57e6c9e9234192540 Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Fri, 2 Jan 2026 12:06:14 -0800
Subject: [PATCH 2/2] TMP
---
.../clang-tidy/ClangTidyDiagnosticConsumer.cpp | 14 ++++----------
1 file changed, 4 insertions(+), 10 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
index 5718b3f602da9..659087d00d8a1 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -760,9 +760,9 @@ struct LessClangTidyError {
const tooling::DiagnosticMessage &M1 = LHS.Message;
const tooling::DiagnosticMessage &M2 = RHS.Message;
- return std::tie(M1.FilePath, M1.FileOffset, LHS.DiagnosticName,
- M1.Message) <
- std::tie(M2.FilePath, M2.FileOffset, RHS.DiagnosticName, M2.Message);
+ return std::tie(M1.FilePath, M1.FileOffset, M1.Message,
+ LHS.DiagnosticName) <
+ std::tie(M2.FilePath, M2.FileOffset, M2.Message, RHS.DiagnosticName);
}
};
struct EqualClangTidyError {
@@ -792,12 +792,6 @@ void ClangTidyDiagnosticConsumer::removeDuplicatedDiagnosticsOfAliasCheckers() {
return std::tie(M.FilePath, M.FileOffset, M.Message);
};
- // This orders any duplicates into consecutive runs.
- llvm::stable_sort(Errors,
- [](const ClangTidyError &LHS, const ClangTidyError &RHS) {
- return Projection(LHS) < Projection(RHS);
- });
-
auto LastUniqueError = Errors.begin();
for (ClangTidyError &Error : llvm::drop_begin(Errors, 1)) {
ClangTidyError &ExistingError = *LastUniqueError;
@@ -805,7 +799,7 @@ void ClangTidyDiagnosticConsumer::removeDuplicatedDiagnosticsOfAliasCheckers() {
if (Projection(Error) != Projection(ExistingError)) {
++LastUniqueError;
*LastUniqueError = std::move(Error);
- } else {
+ } else if (Error.DiagnosticName != ExistingError.DiagnosticName) {
const llvm::StringMap<tooling::Replacements> &CandidateFix =
Error.Message.Fix;
const llvm::StringMap<tooling::Replacements> &ExistingFix =
More information about the cfe-commits
mailing list