[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
@@ -108,6 +108,16 @@ simply make an explicit conversion. Options --- +.. option:: CheckOverloadedFunctions + If ``true``, the check will also consider overloaded functions for + ``string_view`` conversion suggestions. + + If ``false``, overloaded functions are skipped to avoid potential issues + with ambiguous conversions. + + The default is ``false``. irishrover wrote: Done https://github.com/llvm/llvm-project/pull/196387 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
@@ -108,6 +108,16 @@ simply make an explicit conversion. Options --- +.. option:: CheckOverloadedFunctions + If ``true``, the check will also consider overloaded functions for + ``string_view`` conversion suggestions. + + If ``false``, overloaded functions are skipped to avoid potential issues + with ambiguous conversions. + + Default is ``false``. irishrover wrote: Done https://github.com/llvm/llvm-project/pull/196387 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
@@ -108,6 +108,16 @@ simply make an explicit conversion. Options --- +.. option:: CheckOverloadedFunctions + If ``true``, the check will also consider overloaded functions for + ``string_view`` conversion suggestions. + + If ``false``, overloaded functions are skipped to avoid potential issues + with ambiguous conversions. + + Default is ``false``. vbvictor wrote: ```suggestion If `true`, the check will also consider overloaded functions for ``string_view`` conversion suggestions. If `false`, overloaded functions are skipped to avoid potential issues with ambiguous conversions. Default is `false`. ``` https://github.com/llvm/llvm-project/pull/196387 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
@@ -0,0 +1,147 @@ +// RUN: %check_clang_tidy -check-suffix=DONTCHECK \ unterumarmung wrote: should we clang-format this file? https://github.com/llvm/llvm-project/pull/196387 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
@@ -0,0 +1,147 @@
+// RUN: %check_clang_tidy -check-suffix=DONTCHECK \
unterumarmung wrote:
Thanks! It was just weird for me that the contents of the namespace are
indented, for example here:
```cpp
namespace overload_with_inline {
inline namespace inline_namespace {
std::string overload1(int) { return "int"; }
```
https://github.com/llvm/llvm-project/pull/196387
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
https://github.com/irishrover closed https://github.com/llvm/llvm-project/pull/196387 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
https://github.com/irishrover updated
https://github.com/llvm/llvm-project/pull/196387
>From 32bbe1e4314b936acd345ceb52fee1a1df6549c7 Mon Sep 17 00:00:00 2001
From: Zinovy Nis
Date: Sat, 25 Apr 2026 12:49:57 +0300
Subject: [PATCH] [clang-tidy] Reland "An option for conditional skipping
overloaded functions in modernize-use-string-view"
---
.../modernize/UseStringViewCheck.cpp | 6 +-
.../clang-tidy/modernize/UseStringViewCheck.h | 5 +-
.../checks/modernize/use-string-view.rst | 10 +
.../modernize/use-string-view-overloaded.cpp | 185 ++
.../checkers/modernize/use-string-view.cpp| 91 -
5 files changed, 203 insertions(+), 94 deletions(-)
create mode 100644
clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
diff --git a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
index 29e5bdb65632e..9892870279b55 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
@@ -80,6 +80,7 @@ static void fixReturns(const FunctionDecl *FuncDecl,
DiagnosticBuilder &Diag,
UseStringViewCheck::UseStringViewCheck(StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
+ CheckOverloadedFunctions(Options.get("CheckOverloadedFunctions", false)),
IgnoredFunctions(utils::options::parseStringList(
Options.get("IgnoredFunctions", "toString$;ToString$;to_string$"))) {
parseReplacementStringViewClass(
@@ -87,6 +88,7 @@ UseStringViewCheck::UseStringViewCheck(StringRef Name,
}
void UseStringViewCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
+ Options.store(Opts, "CheckOverloadedFunctions", CheckOverloadedFunctions);
Options.store(Opts, "IgnoredFunctions",
utils::options::serializeStringList(IgnoredFunctions));
Options.store(Opts, "ReplacementStringViewClass",
@@ -109,11 +111,13 @@ void UseStringViewCheck::registerMatchers(MatchFinder
*Finder) {
hasFalseExpression(ignoringParenImpCasts(stringLiteral(;
const auto VirtualOrOperator =
cxxMethodDecl(anyOf(cxxConversionDecl(), isVirtual()));
+ const auto CheckOverloaded =
+ CheckOverloadedFunctions ? unless(anything()) : isOverloaded();
Finder->addMatcher(
functionDecl(
isDefinition(),
unless(anyOf(VirtualOrOperator, IgnoredFunctionsMatcher,
- isOverloaded(),
+ CheckOverloaded,
ast_matchers::isExplicitTemplateSpecialization())),
returns(IsStdString), hasDescendant(returnStmt()),
unless(hasDescendant(returnStmt(hasReturnValue(unless(
diff --git a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
index f5f11edc54824..275ce904290ac 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
+++ b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
@@ -35,13 +35,14 @@ class UseStringViewCheck : public ClangTidyCheck {
StringRef toStringViewTypeStr(StringRef Type) const;
void parseReplacementStringViewClass(StringRef Options);
+ bool CheckOverloadedFunctions = false;
+ const std::vector IgnoredFunctions;
+
StringRef StringViewClass = "std::string_view";
StringRef WStringViewClass = "std::wstring_view";
StringRef U8StringViewClass = "std::u8string_view";
StringRef U16StringViewClass = "std::u16string_view";
StringRef U32StringViewClass = "std::u32string_view";
-
- const std::vector IgnoredFunctions;
};
} // namespace clang::tidy::modernize
diff --git
a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
index c72a0480c0eb8..f3d2e0b94a508 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
@@ -108,6 +108,16 @@ simply make an explicit conversion.
Options
---
+.. option:: CheckOverloadedFunctions
+
+ If `true`, the check will also consider overloaded functions for
+ ``string_view`` conversion suggestions. If `false`, overloaded
+ functions are skipped to avoid potential issues with ambiguous
+ conversions.
+
+ Default is `false`.
+
+
.. option:: IgnoredFunctions
A semicolon-separated list of the names of functions or methods to be
diff --git
a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
new file mode 100644
index 0..bdb30473fda2b
--- /dev/null
+++
b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
@@ -0,0 +1,185 @@
+// RUN: %check_clang_tidy -check-suffix=DONTCHEC
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
@@ -0,0 +1,147 @@ +// RUN: %check_clang_tidy -check-suffix=DONTCHECK \ irishrover wrote: I applied clang-format `clang-format -i use-string-view-overloaded.cpp` and there're no changes. https://github.com/llvm/llvm-project/pull/196387 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
https://github.com/irishrover updated
https://github.com/llvm/llvm-project/pull/196387
>From fa9cc2eb20afdef626a56fe862d6d48c4db589c7 Mon Sep 17 00:00:00 2001
From: Zinovy Nis
Date: Sat, 25 Apr 2026 12:49:57 +0300
Subject: [PATCH] [clang-tidy] Reland "An option for conditional skipping
overloaded functions in modernize-use-string-view"
---
.../modernize/UseStringViewCheck.cpp | 6 +-
.../clang-tidy/modernize/UseStringViewCheck.h | 5 +-
.../checks/modernize/use-string-view.rst | 10 +
.../modernize/use-string-view-overloaded.cpp | 185 ++
.../checkers/modernize/use-string-view.cpp| 91 -
5 files changed, 203 insertions(+), 94 deletions(-)
create mode 100644
clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
diff --git a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
index 29e5bdb65632e..9892870279b55 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
@@ -80,6 +80,7 @@ static void fixReturns(const FunctionDecl *FuncDecl,
DiagnosticBuilder &Diag,
UseStringViewCheck::UseStringViewCheck(StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
+ CheckOverloadedFunctions(Options.get("CheckOverloadedFunctions", false)),
IgnoredFunctions(utils::options::parseStringList(
Options.get("IgnoredFunctions", "toString$;ToString$;to_string$"))) {
parseReplacementStringViewClass(
@@ -87,6 +88,7 @@ UseStringViewCheck::UseStringViewCheck(StringRef Name,
}
void UseStringViewCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
+ Options.store(Opts, "CheckOverloadedFunctions", CheckOverloadedFunctions);
Options.store(Opts, "IgnoredFunctions",
utils::options::serializeStringList(IgnoredFunctions));
Options.store(Opts, "ReplacementStringViewClass",
@@ -109,11 +111,13 @@ void UseStringViewCheck::registerMatchers(MatchFinder
*Finder) {
hasFalseExpression(ignoringParenImpCasts(stringLiteral(;
const auto VirtualOrOperator =
cxxMethodDecl(anyOf(cxxConversionDecl(), isVirtual()));
+ const auto CheckOverloaded =
+ CheckOverloadedFunctions ? unless(anything()) : isOverloaded();
Finder->addMatcher(
functionDecl(
isDefinition(),
unless(anyOf(VirtualOrOperator, IgnoredFunctionsMatcher,
- isOverloaded(),
+ CheckOverloaded,
ast_matchers::isExplicitTemplateSpecialization())),
returns(IsStdString), hasDescendant(returnStmt()),
unless(hasDescendant(returnStmt(hasReturnValue(unless(
diff --git a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
index f5f11edc54824..275ce904290ac 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
+++ b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
@@ -35,13 +35,14 @@ class UseStringViewCheck : public ClangTidyCheck {
StringRef toStringViewTypeStr(StringRef Type) const;
void parseReplacementStringViewClass(StringRef Options);
+ bool CheckOverloadedFunctions = false;
+ const std::vector IgnoredFunctions;
+
StringRef StringViewClass = "std::string_view";
StringRef WStringViewClass = "std::wstring_view";
StringRef U8StringViewClass = "std::u8string_view";
StringRef U16StringViewClass = "std::u16string_view";
StringRef U32StringViewClass = "std::u32string_view";
-
- const std::vector IgnoredFunctions;
};
} // namespace clang::tidy::modernize
diff --git
a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
index c72a0480c0eb8..f6b0cb37134e7 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
@@ -108,6 +108,16 @@ simply make an explicit conversion.
Options
---
+.. option:: CheckOverloadedFunctions
+ If ``true``, the check will also consider overloaded functions for
+ ``string_view`` conversion suggestions.
+
+ If ``false``, overloaded functions are skipped to avoid potential issues
+ with ambiguous conversions.
+
+ Default is ``false``.
+
+
.. option:: IgnoredFunctions
A semicolon-separated list of the names of functions or methods to be
diff --git
a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
new file mode 100644
index 0..bdb30473fda2b
--- /dev/null
+++
b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
@@ -0,0 +1,185 @@
+// RUN: %check_clang_tidy -check-suffix=DO
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
@@ -0,0 +1,147 @@ +// RUN: %check_clang_tidy -check-suffix=DONTCHECK \ +// RUN: -std=c++20-or-later %s modernize-use-string-view %t -- \ irishrover wrote: Done https://github.com/llvm/llvm-project/pull/196387 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
https://github.com/zeyi2 approved this pull request. LGTM, but please wait for vbvictor's approval :) https://github.com/llvm/llvm-project/pull/196387 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
https://github.com/vbvictor approved this pull request. https://github.com/llvm/llvm-project/pull/196387 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
https://github.com/irishrover updated
https://github.com/llvm/llvm-project/pull/196387
>From c322ed4699db41bfc3b40e7f90b5d625e097e44a Mon Sep 17 00:00:00 2001
From: Zinovy Nis
Date: Sat, 25 Apr 2026 12:49:57 +0300
Subject: [PATCH] [clang-tidy] Reland "An option for conditional skipping
overloaded functions in modernize-use-string-view"
---
.../modernize/UseStringViewCheck.cpp | 6 +-
.../clang-tidy/modernize/UseStringViewCheck.h | 5 +-
.../checks/modernize/use-string-view.rst | 10 ++
.../modernize/use-string-view-overloaded.cpp | 147 ++
.../checkers/modernize/use-string-view.cpp| 91 ---
5 files changed, 165 insertions(+), 94 deletions(-)
create mode 100644
clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
diff --git a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
index 29e5bdb65632e..9892870279b55 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
@@ -80,6 +80,7 @@ static void fixReturns(const FunctionDecl *FuncDecl,
DiagnosticBuilder &Diag,
UseStringViewCheck::UseStringViewCheck(StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
+ CheckOverloadedFunctions(Options.get("CheckOverloadedFunctions", false)),
IgnoredFunctions(utils::options::parseStringList(
Options.get("IgnoredFunctions", "toString$;ToString$;to_string$"))) {
parseReplacementStringViewClass(
@@ -87,6 +88,7 @@ UseStringViewCheck::UseStringViewCheck(StringRef Name,
}
void UseStringViewCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
+ Options.store(Opts, "CheckOverloadedFunctions", CheckOverloadedFunctions);
Options.store(Opts, "IgnoredFunctions",
utils::options::serializeStringList(IgnoredFunctions));
Options.store(Opts, "ReplacementStringViewClass",
@@ -109,11 +111,13 @@ void UseStringViewCheck::registerMatchers(MatchFinder
*Finder) {
hasFalseExpression(ignoringParenImpCasts(stringLiteral(;
const auto VirtualOrOperator =
cxxMethodDecl(anyOf(cxxConversionDecl(), isVirtual()));
+ const auto CheckOverloaded =
+ CheckOverloadedFunctions ? unless(anything()) : isOverloaded();
Finder->addMatcher(
functionDecl(
isDefinition(),
unless(anyOf(VirtualOrOperator, IgnoredFunctionsMatcher,
- isOverloaded(),
+ CheckOverloaded,
ast_matchers::isExplicitTemplateSpecialization())),
returns(IsStdString), hasDescendant(returnStmt()),
unless(hasDescendant(returnStmt(hasReturnValue(unless(
diff --git a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
index f5f11edc54824..275ce904290ac 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
+++ b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
@@ -35,13 +35,14 @@ class UseStringViewCheck : public ClangTidyCheck {
StringRef toStringViewTypeStr(StringRef Type) const;
void parseReplacementStringViewClass(StringRef Options);
+ bool CheckOverloadedFunctions = false;
+ const std::vector IgnoredFunctions;
+
StringRef StringViewClass = "std::string_view";
StringRef WStringViewClass = "std::wstring_view";
StringRef U8StringViewClass = "std::u8string_view";
StringRef U16StringViewClass = "std::u16string_view";
StringRef U32StringViewClass = "std::u32string_view";
-
- const std::vector IgnoredFunctions;
};
} // namespace clang::tidy::modernize
diff --git
a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
index c72a0480c0eb8..f6b0cb37134e7 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
@@ -108,6 +108,16 @@ simply make an explicit conversion.
Options
---
+.. option:: CheckOverloadedFunctions
+ If ``true``, the check will also consider overloaded functions for
+ ``string_view`` conversion suggestions.
+
+ If ``false``, overloaded functions are skipped to avoid potential issues
+ with ambiguous conversions.
+
+ Default is ``false``.
+
+
.. option:: IgnoredFunctions
A semicolon-separated list of the names of functions or methods to be
diff --git
a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
new file mode 100644
index 0..8f4f2c2311c10
--- /dev/null
+++
b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
@@ -0,0 +1,147 @@
+// RUN: %check_clang_tidy -check-suffix
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
@@ -0,0 +1,147 @@ +// RUN: %check_clang_tidy -check-suffix=DONTCHECK \ +// RUN: -std=c++20-or-later %s modernize-use-string-view %t -- \ vbvictor wrote: Previous tests used `-std=c++17-or-later`, can we place c++20 code under ifdef and use c++17 https://github.com/llvm/llvm-project/pull/196387 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
@@ -0,0 +1,147 @@
+// RUN: %check_clang_tidy -check-suffix=DONTCHECK \
+// RUN: -std=c++20-or-later %s modernize-use-string-view %t -- \
+// RUN: --config="{CheckOptions:
{modernize-use-string-view.CheckOverloadedFunctions: false}}"
+
+// RUN: %check_clang_tidy -check-suffix=CHECK \
+// RUN: -std=c++20-or-later %s modernize-use-string-view %t -- \
+// RUN: --config="{CheckOptions:
{modernize-use-string-view.CheckOverloadedFunctions: true}}"
+
+#include
+#include
+
+namespace overload_funcs_redeclared {
+std::basic_string overload(int);
+std::string overload(int);
+std::string overload(int) { return "int"; }
+// CHECK-MESSAGES-DONTCHECK:[[@LINE-1]]:1: warning: consider using
'std::string_view' to avoid unnecessary copying and allocations
[modernize-use-string-view]
+// CHECK-MESSAGES-CHECK:[[@LINE-2]]:1: warning: consider using
'std::string_view' to avoid unnecessary copying and allocations
[modernize-use-string-view]
irishrover wrote:
I see that a lot of tests still use `[checker-name]` in their check. I'd prefer
to leave as it is here.
https://github.com/llvm/llvm-project/pull/196387
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
https://github.com/irishrover updated
https://github.com/llvm/llvm-project/pull/196387
>From 26a814124d8c3274e0fa90817715cb2e7af34072 Mon Sep 17 00:00:00 2001
From: Zinovy Nis
Date: Sat, 25 Apr 2026 12:49:57 +0300
Subject: [PATCH 1/2] [clang-tidy] Reland "An option for conditional skipping
overloaded functions in modernize-use-string-view"
---
.../modernize/UseStringViewCheck.cpp | 6 +-
.../clang-tidy/modernize/UseStringViewCheck.h | 5 +-
.../checks/modernize/use-string-view.rst | 10 ++
.../modernize/use-string-view-overloaded.cpp | 147 ++
.../checkers/modernize/use-string-view.cpp| 91 ---
5 files changed, 165 insertions(+), 94 deletions(-)
create mode 100644
clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
diff --git a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
index 29e5bdb65632e..9892870279b55 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.cpp
@@ -80,6 +80,7 @@ static void fixReturns(const FunctionDecl *FuncDecl,
DiagnosticBuilder &Diag,
UseStringViewCheck::UseStringViewCheck(StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
+ CheckOverloadedFunctions(Options.get("CheckOverloadedFunctions", false)),
IgnoredFunctions(utils::options::parseStringList(
Options.get("IgnoredFunctions", "toString$;ToString$;to_string$"))) {
parseReplacementStringViewClass(
@@ -87,6 +88,7 @@ UseStringViewCheck::UseStringViewCheck(StringRef Name,
}
void UseStringViewCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
+ Options.store(Opts, "CheckOverloadedFunctions", CheckOverloadedFunctions);
Options.store(Opts, "IgnoredFunctions",
utils::options::serializeStringList(IgnoredFunctions));
Options.store(Opts, "ReplacementStringViewClass",
@@ -109,11 +111,13 @@ void UseStringViewCheck::registerMatchers(MatchFinder
*Finder) {
hasFalseExpression(ignoringParenImpCasts(stringLiteral(;
const auto VirtualOrOperator =
cxxMethodDecl(anyOf(cxxConversionDecl(), isVirtual()));
+ const auto CheckOverloaded =
+ CheckOverloadedFunctions ? unless(anything()) : isOverloaded();
Finder->addMatcher(
functionDecl(
isDefinition(),
unless(anyOf(VirtualOrOperator, IgnoredFunctionsMatcher,
- isOverloaded(),
+ CheckOverloaded,
ast_matchers::isExplicitTemplateSpecialization())),
returns(IsStdString), hasDescendant(returnStmt()),
unless(hasDescendant(returnStmt(hasReturnValue(unless(
diff --git a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
index f5f11edc54824..275ce904290ac 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
+++ b/clang-tools-extra/clang-tidy/modernize/UseStringViewCheck.h
@@ -35,13 +35,14 @@ class UseStringViewCheck : public ClangTidyCheck {
StringRef toStringViewTypeStr(StringRef Type) const;
void parseReplacementStringViewClass(StringRef Options);
+ bool CheckOverloadedFunctions = false;
+ const std::vector IgnoredFunctions;
+
StringRef StringViewClass = "std::string_view";
StringRef WStringViewClass = "std::wstring_view";
StringRef U8StringViewClass = "std::u8string_view";
StringRef U16StringViewClass = "std::u16string_view";
StringRef U32StringViewClass = "std::u32string_view";
-
- const std::vector IgnoredFunctions;
};
} // namespace clang::tidy::modernize
diff --git
a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
index c72a0480c0eb8..f0f019415f881 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/use-string-view.rst
@@ -108,6 +108,16 @@ simply make an explicit conversion.
Options
---
+.. option:: CheckOverloadedFunctions
+ If ``true``, the check will also consider overloaded functions for
+ ``string_view`` conversion suggestions.
+
+ If ``false``, overloaded functions are skipped to avoid potential issues
+ with ambiguous conversions.
+
+ The default is ``false``.
+
+
.. option:: IgnoredFunctions
A semicolon-separated list of the names of functions or methods to be
diff --git
a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
new file mode 100644
index 0..8f4f2c2311c10
--- /dev/null
+++
b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-string-view-overloaded.cpp
@@ -0,0 +1,147 @@
+// RUN: %check_clang_tidy -chec
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
@@ -108,6 +108,16 @@ simply make an explicit conversion. Options --- +.. option:: CheckOverloadedFunctions + If ``true``, the check will also consider overloaded functions for + ``string_view`` conversion suggestions. + + If ``false``, overloaded functions are skipped to avoid potential issues + with ambiguous conversions. + + The default is ``false``. zeyi2 wrote: ```suggestion Default is ``false``. ``` https://github.com/llvm/llvm-project/pull/196387 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] [clang-tidy] Reland "An option for conditional skipping overloaded functions in modernize-use-string-view" (PR #196387)
@@ -0,0 +1,147 @@
+// RUN: %check_clang_tidy -check-suffix=DONTCHECK \
+// RUN: -std=c++20-or-later %s modernize-use-string-view %t -- \
+// RUN: --config="{CheckOptions:
{modernize-use-string-view.CheckOverloadedFunctions: false}}"
+
+// RUN: %check_clang_tidy -check-suffix=CHECK \
+// RUN: -std=c++20-or-later %s modernize-use-string-view %t -- \
+// RUN: --config="{CheckOptions:
{modernize-use-string-view.CheckOverloadedFunctions: true}}"
+
+#include
+#include
+
+namespace overload_funcs_redeclared {
+std::basic_string overload(int);
+std::string overload(int);
+std::string overload(int) { return "int"; }
+// CHECK-MESSAGES-DONTCHECK:[[@LINE-1]]:1: warning: consider using
'std::string_view' to avoid unnecessary copying and allocations
[modernize-use-string-view]
+// CHECK-MESSAGES-CHECK:[[@LINE-2]]:1: warning: consider using
'std::string_view' to avoid unnecessary copying and allocations
[modernize-use-string-view]
zeyi2 wrote:
Small nit:
```suggestion
// CHECK-MESSAGES-CHECK:[[@LINE-2]]:1: warning: consider using
'std::string_view' to avoid unnecessary copying and allocations
```
Same as below :)
https://github.com/llvm/llvm-project/pull/196387
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
