[clang-tools-extra] [clang-tidy] Skip overloaded functions in modernize-use-string-view (PR #183921)
Zinovy Nis via cfe-commits
cfe-commits at lists.llvm.org
Sat Feb 28 06:43:25 PST 2026
https://github.com/irishrover updated https://github.com/llvm/llvm-project/pull/183921
>From fa951bfcd6f33b8185ebb037f8e63ee921a62703 Mon Sep 17 00:00:00 2001
From: Zinovy Nis <zinovy.nis at gmail.com>
Date: Sat, 28 Feb 2026 17:33:50 +0300
Subject: [PATCH] [clang-tidy] Skip overloaded functions in
modernize-use-string-view
---
.../modernize/UseStringViewCheck.cpp | 24 +++++++++++++++++++
.../checkers/modernize/use-string-view.cpp | 7 ++++++
2 files changed, 31 insertions(+)
diff --git a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
index 1dc4cc9856549..f03c9c008389a 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
@@ -21,6 +21,29 @@ using namespace clang::ast_matchers;
namespace clang::tidy::modernize {
+namespace {
+AST_MATCHER(FunctionDecl, isOverloaded) {
+ const DeclarationName Name = Node.getDeclName();
+ // Skip lambda-like functions
+ if (Name.isEmpty())
+ return false;
+ const DeclContext *DC = Node.getDeclContext();
+ auto LookupResult = DC->lookup(Name);
+ size_t UniqueSignatures = 0;
+ llvm::SmallPtrSet<const FunctionDecl *, 2> SeenFunctions;
+ for (NamedDecl *ND : LookupResult) {
+ if (const auto *FD = dyn_cast<FunctionDecl>(ND)) {
+ if (SeenFunctions.insert(FD->getCanonicalDecl()).second) {
+ UniqueSignatures++;
+ if (UniqueSignatures > 1)
+ return true;
+ }
+ }
+ }
+ return false;
+}
+} // namespace
+
static constexpr StringRef StringViewClassKey = "string";
static constexpr StringRef WStringViewClassKey = "wstring";
static constexpr StringRef U8StringViewClassKey = "u8string";
@@ -81,6 +104,7 @@ void UseStringViewCheck::registerMatchers(MatchFinder *Finder) {
functionDecl(
isDefinition(),
unless(anyOf(VirtualOrOperator, IgnoredFunctionsMatcher,
+ isOverloaded(),
ast_matchers::isExplicitTemplateSpecialization())),
returns(IsStdString), hasDescendant(returnStmt()),
unless(hasDescendant(returnStmt(hasReturnValue(unless(
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view.cpp
index 2a00a7200ee76..832af0c26ef70 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view.cpp
@@ -365,6 +365,13 @@ std::string lambda() {
}();
}
+namespace overloads {
+std::string dbl2str(double f);
+std::string overload(int) { return "int"; }
+std::string overload(double f) { return "f=" + dbl2str(f); }
+std::string overload(std::string) { return "string"; }
+}
+
struct TemplateString {
static constexpr char* val = "TEMPLATE";
template<typename T>
More information about the cfe-commits
mailing list