[clang-tools-extra] [clang-tidy] Rename performance-faster-string-find to performance-faster-string-operation (PR #186946)
Zeyi Xu via cfe-commits
cfe-commits at lists.llvm.org
Sat Mar 28 08:17:23 PDT 2026
https://github.com/zeyi2 updated https://github.com/llvm/llvm-project/pull/186946
>From e2bf54187e64db0316cbe6f226f85c9533350b27 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Tue, 17 Mar 2026 11:29:49 +0800
Subject: [PATCH 1/4] [clang-tidy] Rename performance-faster-string-find to
performance-faster-string-operation
---
.../clang-tidy/performance/CMakeLists.txt | 2 +-
...eck.cpp => FasterStringOperationCheck.cpp} | 13 +++----
...ndCheck.h => FasterStringOperationCheck.h} | 12 +++----
.../performance/PerformanceTidyModule.cpp | 6 ++--
clang-tools-extra/docs/ReleaseNotes.rst | 16 +++++++--
.../docs/clang-tidy/checks/list.rst | 1 +
.../checks/performance/faster-string-find.rst | 30 +++-------------
.../performance/faster-string-operation.rst | 35 +++++++++++++++++++
...g-find.cpp => faster-string-operation.cpp} | 8 ++---
9 files changed, 77 insertions(+), 46 deletions(-)
rename clang-tools-extra/clang-tidy/performance/{FasterStringFindCheck.cpp => FasterStringOperationCheck.cpp} (89%)
rename clang-tools-extra/clang-tidy/performance/{FasterStringFindCheck.h => FasterStringOperationCheck.h} (87%)
create mode 100644 clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-operation.rst
rename clang-tools-extra/test/clang-tidy/checkers/performance/{faster-string-find.cpp => faster-string-operation.cpp} (95%)
diff --git a/clang-tools-extra/clang-tidy/performance/CMakeLists.txt b/clang-tools-extra/clang-tidy/performance/CMakeLists.txt
index 5b3e849fb20a8..1c9c7bab2b46a 100644
--- a/clang-tools-extra/clang-tidy/performance/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/performance/CMakeLists.txt
@@ -6,7 +6,7 @@ set(LLVM_LINK_COMPONENTS
add_clang_library(clangTidyPerformanceModule STATIC
AvoidEndlCheck.cpp
EnumSizeCheck.cpp
- FasterStringFindCheck.cpp
+ FasterStringOperationCheck.cpp
ForRangeCopyCheck.cpp
ImplicitConversionInLoopCheck.cpp
InefficientAlgorithmCheck.cpp
diff --git a/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp b/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.cpp
similarity index 89%
rename from clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp
rename to clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.cpp
index 1d9325166e341..0b94eb09ee0bc 100644
--- a/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp
+++ b/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "FasterStringFindCheck.h"
+#include "FasterStringOperationCheck.h"
#include "../utils/OptionsUtils.h"
#include "clang/AST/ASTContext.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
@@ -42,19 +42,20 @@ makeCharacterLiteral(const StringLiteral *Literal) {
return Result;
}
-FasterStringFindCheck::FasterStringFindCheck(StringRef Name,
- ClangTidyContext *Context)
+FasterStringOperationCheck::FasterStringOperationCheck(
+ StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
StringLikeClasses(utils::options::parseStringList(
Options.get("StringLikeClasses",
"::std::basic_string;::std::basic_string_view"))) {}
-void FasterStringFindCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
+void FasterStringOperationCheck::storeOptions(
+ ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "StringLikeClasses",
utils::options::serializeStringList(StringLikeClasses));
}
-void FasterStringFindCheck::registerMatchers(MatchFinder *Finder) {
+void FasterStringOperationCheck::registerMatchers(MatchFinder *Finder) {
const auto SingleChar =
ignoringParenCasts(stringLiteral(hasSize(1)).bind("literal"));
@@ -78,7 +79,7 @@ void FasterStringFindCheck::registerMatchers(MatchFinder *Finder) {
this);
}
-void FasterStringFindCheck::check(const MatchFinder::MatchResult &Result) {
+void FasterStringOperationCheck::check(const MatchFinder::MatchResult &Result) {
const auto *Literal = Result.Nodes.getNodeAs<StringLiteral>("literal");
const auto *FindFunc = Result.Nodes.getNodeAs<FunctionDecl>("func");
diff --git a/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.h b/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.h
similarity index 87%
rename from clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.h
rename to clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.h
index f5d36d805498e..4569bdf00690d 100644
--- a/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.h
+++ b/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FASTERSTRINGFINDCHECK_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FASTERSTRINGFINDCHECK_H
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FASTERSTRINGOPERATIONCHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FASTERSTRINGOPERATIONCHECK_H
#include "../ClangTidyCheck.h"
@@ -21,10 +21,10 @@ namespace clang::tidy::performance {
/// The character literal overload is more efficient.
///
/// For the user-facing documentation see:
-/// https://clang.llvm.org/extra/clang-tidy/checks/performance/faster-string-find.html
-class FasterStringFindCheck : public ClangTidyCheck {
+/// https://clang.llvm.org/extra/clang-tidy/checks/performance/faster-string-operation.html
+class FasterStringOperationCheck : public ClangTidyCheck {
public:
- FasterStringFindCheck(StringRef Name, ClangTidyContext *Context);
+ FasterStringOperationCheck(StringRef Name, ClangTidyContext *Context);
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
return LangOpts.CPlusPlus;
}
@@ -41,4 +41,4 @@ class FasterStringFindCheck : public ClangTidyCheck {
} // namespace clang::tidy::performance
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FASTERSTRINGFINDCHECK_H
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FASTERSTRINGOPERATIONCHECK_H
diff --git a/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp b/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp
index 21274fae43795..0deab21a8ea3a 100644
--- a/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp
@@ -10,7 +10,7 @@
#include "../ClangTidyModule.h"
#include "AvoidEndlCheck.h"
#include "EnumSizeCheck.h"
-#include "FasterStringFindCheck.h"
+#include "FasterStringOperationCheck.h"
#include "ForRangeCopyCheck.h"
#include "ImplicitConversionInLoopCheck.h"
#include "InefficientAlgorithmCheck.h"
@@ -39,8 +39,10 @@ class PerformanceModule : public ClangTidyModule {
void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
CheckFactories.registerCheck<AvoidEndlCheck>("performance-avoid-endl");
CheckFactories.registerCheck<EnumSizeCheck>("performance-enum-size");
- CheckFactories.registerCheck<FasterStringFindCheck>(
+ CheckFactories.registerCheck<FasterStringOperationCheck>(
"performance-faster-string-find");
+ CheckFactories.registerCheck<FasterStringOperationCheck>(
+ "performance-faster-string-operation");
CheckFactories.registerCheck<ForRangeCopyCheck>(
"performance-for-range-copy");
CheckFactories.registerCheck<ImplicitConversionInLoopCheck>(
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 077335c16c331..9e79981fe888a 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -49,6 +49,12 @@ Major New Features
Potentially Breaking Changes
----------------------------
+- Deprecated the :program:`clang-tidy` check :doc:`performance-faster-string-find
+ <clang-tidy/checks/performance/faster-string-find>`. It has been renamed to
+ :doc:`performance-faster-string-operation
+ <clang-tidy/checks/performance/faster-string-operation>`.
+ The original check will be removed in the 25th release.
+
Improvements to clangd
----------------------
@@ -174,6 +180,12 @@ New check aliases
<clang-tidy/checks/portability/no-assembler>`. The `hicpp-no-assembler`
name is kept as an alias.
+- Renamed :doc:`performance-faster-string-find
+ <clang-tidy/checks/performance/faster-string-find>` to
+ :doc:`performance-faster-string-operation
+ <clang-tidy/checks/performance/faster-string-operation>`.
+ The `performance-faster-string-find` name is kept as an alias.
+
Changes in existing checks
^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -292,8 +304,8 @@ Changes in existing checks
- Improved the ignore list to correctly handle ``typedef`` and ``enum``.
-- Improved :doc:`performance-faster-string-find
- <clang-tidy/checks/performance/faster-string-find>` check:
+- Improved :doc:`performance-faster-string-operation
+ <clang-tidy/checks/performance/faster-string-operation>` check:
- Now analyzes calls to the ``starts_with``, ``ends_with``, ``contains``,
and ``operator+=`` string member functions.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst
index 362455796bd50..0854bb5676d6e 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -351,6 +351,7 @@ Clang-Tidy Checks
:doc:`performance-avoid-endl <performance/avoid-endl>`, "Yes"
:doc:`performance-enum-size <performance/enum-size>`,
:doc:`performance-faster-string-find <performance/faster-string-find>`, "Yes"
+ :doc:`performance-faster-string-operation <performance/faster-string-operation>`, "Yes"
:doc:`performance-for-range-copy <performance/for-range-copy>`, "Yes"
:doc:`performance-implicit-conversion-in-loop <performance/implicit-conversion-in-loop>`,
:doc:`performance-inefficient-algorithm <performance/inefficient-algorithm>`, "Yes"
diff --git a/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-find.rst b/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-find.rst
index e7ed869acc8ad..3dc2ff04d53e6 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-find.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-find.rst
@@ -1,30 +1,10 @@
.. title:: clang-tidy - performance-faster-string-find
+.. meta::
+ :http-equiv=refresh: 5;URL=faster-string-operation.html
performance-faster-string-find
==============================
-Optimize calls to ``std::string::find()`` and friends when the needle passed is
-a single character string literal. The character literal overload is more
-efficient.
-
-Examples:
-
-.. code-block:: c++
-
- str.find("A");
-
- // becomes
-
- str.find('A');
-
-Options
--------
-
-.. option:: StringLikeClasses
-
- Semicolon-separated list of names of string-like classes. By default only
- ``::std::basic_string`` and ``::std::basic_string_view`` are considered.
- Within these classes, the check will only consider member functions named
- ``find``, ``rfind``, ``find_first_of``, ``find_first_not_of``,
- ``find_last_of``, ``find_last_not_of``, ``starts_with``, ``ends_with``,
- ``contains``, or ``operator+=``.
+The `performance-faster-string-find check` is an alias, please see
+:doc:`performance-faster-string-operation <faster-string-operation>`
+for more information.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-operation.rst b/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-operation.rst
new file mode 100644
index 0000000000000..25907b2f5e6d3
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-operation.rst
@@ -0,0 +1,35 @@
+.. title:: clang-tidy - performance-faster-string-operation
+
+performance-faster-string-operation
+===================================
+
+Optimize calls to ``std::string::find()`` and friends when the needle passed is
+a single character string literal. The character literal overload is more
+efficient.
+
+Examples:
+
+.. code-block:: c++
+
+ str.find("A");
+ str += "B";
+
+ // becomes
+
+ str.find('A');
+ str += 'B';
+
+This check flags passing strings of size 1 to miscellaneous member functions
+as well as ``operator+=``.
+
+Options
+-------
+
+.. option:: StringLikeClasses
+
+ Semicolon-separated list of names of string-like classes. By default only
+ ``::std::basic_string`` and ``::std::basic_string_view`` are considered.
+ Within these classes, the check will only consider member functions named
+ ``find``, ``rfind``, ``find_first_of``, ``find_first_not_of``,
+ ``find_last_of``, ``find_last_not_of``, ``starts_with``, ``ends_with``,
+ ``contains``, or ``operator+=``.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-find.cpp b/clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-operation.cpp
similarity index 95%
rename from clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-find.cpp
rename to clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-operation.cpp
index 3999049a10718..1c093afa41ef0 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-find.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-operation.cpp
@@ -1,7 +1,7 @@
-// RUN: %check_clang_tidy %s performance-faster-string-find %t -- -- -fno-delayed-template-parsing
-// RUN: %check_clang_tidy -check-suffix=CUSTOM %s performance-faster-string-find %t -- \
+// RUN: %check_clang_tidy %s performance-faster-string-operation %t -- -- -fno-delayed-template-parsing
+// RUN: %check_clang_tidy -check-suffix=CUSTOM %s performance-faster-string-operation %t -- \
// RUN: -config="{CheckOptions: \
-// RUN: {performance-faster-string-find.StringLikeClasses: \
+// RUN: {performance-faster-string-operation.StringLikeClasses: \
// RUN: '::llvm::StringRef;'}}" -- -fno-delayed-template-parsing
#include <string>
@@ -23,7 +23,7 @@ void StringFind() {
std::string Str;
Str.find("a");
- // CHECK-MESSAGES: [[@LINE-1]]:12: warning: 'find' called with a string literal consisting of a single character; consider using the more effective overload accepting a character [performance-faster-string-find]
+ // CHECK-MESSAGES: [[@LINE-1]]:12: warning: 'find' called with a string literal consisting of a single character; consider using the more effective overload accepting a character [performance-faster-string-operation]
// CHECK-FIXES: Str.find('a');
// Works with the pos argument.
>From 7f59a56fa2718f46fb091397d3ce8cbd39c0e7f9 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Mon, 23 Mar 2026 13:48:13 +0800
Subject: [PATCH 2/4] fix header
---
.../clang-tidy/performance/FasterStringOperationCheck.cpp | 1 -
.../clang-tidy/performance/FasterStringOperationCheck.h | 1 -
2 files changed, 2 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.cpp b/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.cpp
index def8964e40aeb..d64d4ed5c5aac 100644
--- a/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.cpp
+++ b/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.cpp
@@ -8,7 +8,6 @@
#include "FasterStringOperationCheck.h"
#include "../utils/OptionsUtils.h"
-#include "clang/AST/ASTContext.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "llvm/Support/raw_ostream.h"
#include <optional>
diff --git a/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.h b/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.h
index 4569bdf00690d..55413171263a4 100644
--- a/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.h
+++ b/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.h
@@ -11,7 +11,6 @@
#include "../ClangTidyCheck.h"
-#include <string>
#include <vector>
namespace clang::tidy::performance {
>From 3862da8f9e65fdd530d86886f4f4eb60ba235d0e Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 28 Mar 2026 23:09:20 +0800
Subject: [PATCH 3/4] fixup
---
.../clang-tidy/performance/CMakeLists.txt | 2 +-
.../performance/PerformanceTidyModule.cpp | 8 ++++----
....cpp => PreferSingleCharOverloadsCheck.cpp} | 18 +++++++++++++-----
...heck.h => PreferSingleCharOverloadsCheck.h} | 12 ++++++------
clang-tools-extra/docs/ReleaseNotes.rst | 6 +++---
.../docs/clang-tidy/checks/list.rst | 2 +-
.../checks/performance/faster-string-find.rst | 4 ++--
...on.rst => prefer-single-char-overloads.rst} | 6 +++---
.../prefer-single-char-overloads-alias.cpp | 11 +++++++++++
...on.cpp => prefer-single-char-overloads.cpp} | 8 ++++----
10 files changed, 48 insertions(+), 29 deletions(-)
rename clang-tools-extra/clang-tidy/performance/{FasterStringOperationCheck.cpp => PreferSingleCharOverloadsCheck.cpp} (83%)
rename clang-tools-extra/clang-tidy/performance/{FasterStringOperationCheck.h => PreferSingleCharOverloadsCheck.h} (71%)
rename clang-tools-extra/docs/clang-tidy/checks/performance/{faster-string-operation.rst => prefer-single-char-overloads.rst} (85%)
create mode 100644 clang-tools-extra/test/clang-tidy/checkers/performance/prefer-single-char-overloads-alias.cpp
rename clang-tools-extra/test/clang-tidy/checkers/performance/{faster-string-operation.cpp => prefer-single-char-overloads.cpp} (94%)
diff --git a/clang-tools-extra/clang-tidy/performance/CMakeLists.txt b/clang-tools-extra/clang-tidy/performance/CMakeLists.txt
index 1c9c7bab2b46a..0c778b5a9f36b 100644
--- a/clang-tools-extra/clang-tidy/performance/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/performance/CMakeLists.txt
@@ -6,7 +6,6 @@ set(LLVM_LINK_COMPONENTS
add_clang_library(clangTidyPerformanceModule STATIC
AvoidEndlCheck.cpp
EnumSizeCheck.cpp
- FasterStringOperationCheck.cpp
ForRangeCopyCheck.cpp
ImplicitConversionInLoopCheck.cpp
InefficientAlgorithmCheck.cpp
@@ -21,6 +20,7 @@ add_clang_library(clangTidyPerformanceModule STATIC
NoexceptMoveConstructorCheck.cpp
NoexceptSwapCheck.cpp
PerformanceTidyModule.cpp
+ PreferSingleCharOverloadsCheck.cpp
StringViewConversionsCheck.cpp
TriviallyDestructibleCheck.cpp
TypePromotionInMathFnCheck.cpp
diff --git a/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp b/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp
index 0deab21a8ea3a..a4c1cdacab496 100644
--- a/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/performance/PerformanceTidyModule.cpp
@@ -10,7 +10,6 @@
#include "../ClangTidyModule.h"
#include "AvoidEndlCheck.h"
#include "EnumSizeCheck.h"
-#include "FasterStringOperationCheck.h"
#include "ForRangeCopyCheck.h"
#include "ImplicitConversionInLoopCheck.h"
#include "InefficientAlgorithmCheck.h"
@@ -23,6 +22,7 @@
#include "NoexceptDestructorCheck.h"
#include "NoexceptMoveConstructorCheck.h"
#include "NoexceptSwapCheck.h"
+#include "PreferSingleCharOverloadsCheck.h"
#include "StringViewConversionsCheck.h"
#include "TriviallyDestructibleCheck.h"
#include "TypePromotionInMathFnCheck.h"
@@ -39,10 +39,8 @@ class PerformanceModule : public ClangTidyModule {
void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
CheckFactories.registerCheck<AvoidEndlCheck>("performance-avoid-endl");
CheckFactories.registerCheck<EnumSizeCheck>("performance-enum-size");
- CheckFactories.registerCheck<FasterStringOperationCheck>(
+ CheckFactories.registerCheck<PreferSingleCharOverloadsCheck>(
"performance-faster-string-find");
- CheckFactories.registerCheck<FasterStringOperationCheck>(
- "performance-faster-string-operation");
CheckFactories.registerCheck<ForRangeCopyCheck>(
"performance-for-range-copy");
CheckFactories.registerCheck<ImplicitConversionInLoopCheck>(
@@ -66,6 +64,8 @@ class PerformanceModule : public ClangTidyModule {
"performance-noexcept-move-constructor");
CheckFactories.registerCheck<NoexceptSwapCheck>(
"performance-noexcept-swap");
+ CheckFactories.registerCheck<PreferSingleCharOverloadsCheck>(
+ "performance-prefer-single-char-overloads");
CheckFactories.registerCheck<StringViewConversionsCheck>(
"performance-string-view-conversions");
CheckFactories.registerCheck<TriviallyDestructibleCheck>(
diff --git a/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.cpp b/clang-tools-extra/clang-tidy/performance/PreferSingleCharOverloadsCheck.cpp
similarity index 83%
rename from clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.cpp
rename to clang-tools-extra/clang-tidy/performance/PreferSingleCharOverloadsCheck.cpp
index d64d4ed5c5aac..df4f29ad26308 100644
--- a/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.cpp
+++ b/clang-tools-extra/clang-tidy/performance/PreferSingleCharOverloadsCheck.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "FasterStringOperationCheck.h"
+#include "PreferSingleCharOverloadsCheck.h"
#include "../utils/OptionsUtils.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "llvm/Support/raw_ostream.h"
@@ -41,20 +41,20 @@ makeCharacterLiteral(const StringLiteral *Literal) {
return Result;
}
-FasterStringOperationCheck::FasterStringOperationCheck(
+PreferSingleCharOverloadsCheck::PreferSingleCharOverloadsCheck(
StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
StringLikeClasses(utils::options::parseStringList(
Options.get("StringLikeClasses",
"::std::basic_string;::std::basic_string_view"))) {}
-void FasterStringOperationCheck::storeOptions(
+void PreferSingleCharOverloadsCheck::storeOptions(
ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "StringLikeClasses",
utils::options::serializeStringList(StringLikeClasses));
}
-void FasterStringOperationCheck::registerMatchers(MatchFinder *Finder) {
+void PreferSingleCharOverloadsCheck::registerMatchers(MatchFinder *Finder) {
const auto SingleChar =
ignoringParenCasts(stringLiteral(hasSize(1)).bind("literal"));
@@ -78,7 +78,8 @@ void FasterStringOperationCheck::registerMatchers(MatchFinder *Finder) {
this);
}
-void FasterStringOperationCheck::check(const MatchFinder::MatchResult &Result) {
+void PreferSingleCharOverloadsCheck::check(
+ const MatchFinder::MatchResult &Result) {
const auto *Literal = Result.Nodes.getNodeAs<StringLiteral>("literal");
const auto *FindFunc = Result.Nodes.getNodeAs<FunctionDecl>("func");
@@ -91,6 +92,13 @@ void FasterStringOperationCheck::check(const MatchFinder::MatchResult &Result) {
"efficient overload accepting a character")
<< FindFunc
<< FixItHint::CreateReplacement(Literal->getSourceRange(), *Replacement);
+
+ if (getID() == "performance-faster-string-find")
+ diag(Literal->getBeginLoc(),
+ "performance-faster-string-find is deprecated and will be removed in "
+ "future release, consider using "
+ "performance-prefer-single-char-overloads",
+ DiagnosticIDs::Note);
}
} // namespace clang::tidy::performance
diff --git a/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.h b/clang-tools-extra/clang-tidy/performance/PreferSingleCharOverloadsCheck.h
similarity index 71%
rename from clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.h
rename to clang-tools-extra/clang-tidy/performance/PreferSingleCharOverloadsCheck.h
index 55413171263a4..848ad0be9724c 100644
--- a/clang-tools-extra/clang-tidy/performance/FasterStringOperationCheck.h
+++ b/clang-tools-extra/clang-tidy/performance/PreferSingleCharOverloadsCheck.h
@@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FASTERSTRINGOPERATIONCHECK_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FASTERSTRINGOPERATIONCHECK_H
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_PREFERSINGLECHAROVERLOADSCHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_PREFERSINGLECHAROVERLOADSCHECK_H
#include "../ClangTidyCheck.h"
@@ -20,10 +20,10 @@ namespace clang::tidy::performance {
/// The character literal overload is more efficient.
///
/// For the user-facing documentation see:
-/// https://clang.llvm.org/extra/clang-tidy/checks/performance/faster-string-operation.html
-class FasterStringOperationCheck : public ClangTidyCheck {
+/// https://clang.llvm.org/extra/clang-tidy/checks/performance/prefer-single-char-overloads.html
+class PreferSingleCharOverloadsCheck : public ClangTidyCheck {
public:
- FasterStringOperationCheck(StringRef Name, ClangTidyContext *Context);
+ PreferSingleCharOverloadsCheck(StringRef Name, ClangTidyContext *Context);
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
return LangOpts.CPlusPlus;
}
@@ -40,4 +40,4 @@ class FasterStringOperationCheck : public ClangTidyCheck {
} // namespace clang::tidy::performance
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_FASTERSTRINGOPERATIONCHECK_H
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_PREFERSINGLECHAROVERLOADSCHECK_H
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 887ad1f6e16fb..c2b751293aeba 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -51,7 +51,7 @@ Potentially Breaking Changes
- Deprecated the :program:`clang-tidy` check :doc:`performance-faster-string-find
<clang-tidy/checks/performance/faster-string-find>`. It has been renamed to
- :doc:`performance-faster-string-operation
+ :doc:`performance-prefer-single-char-overloads
<clang-tidy/checks/performance/faster-string-operation>`.
The original check will be removed in the 25th release.
@@ -197,7 +197,7 @@ New check aliases
- Renamed :doc:`performance-faster-string-find
<clang-tidy/checks/performance/faster-string-find>` to
- :doc:`performance-faster-string-operation
+ :doc:`performance-prefer-single-char-overloads
<clang-tidy/checks/performance/faster-string-operation>`.
The `performance-faster-string-find` name is kept as an alias.
@@ -341,7 +341,7 @@ Changes in existing checks
- Improved the ignore list to correctly handle ``typedef`` and ``enum``.
-- Improved :doc:`performance-faster-string-operation
+- Improved :doc:`performance-prefer-single-char-overloads
<clang-tidy/checks/performance/faster-string-operation>` check:
- Now analyzes calls to the ``starts_with``, ``ends_with``, ``contains``,
diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst
index 1dd1c1c49717a..2b5be931271ec 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -352,7 +352,6 @@ Clang-Tidy Checks
:doc:`performance-avoid-endl <performance/avoid-endl>`, "Yes"
:doc:`performance-enum-size <performance/enum-size>`,
:doc:`performance-faster-string-find <performance/faster-string-find>`, "Yes"
- :doc:`performance-faster-string-operation <performance/faster-string-operation>`, "Yes"
:doc:`performance-for-range-copy <performance/for-range-copy>`, "Yes"
:doc:`performance-implicit-conversion-in-loop <performance/implicit-conversion-in-loop>`,
:doc:`performance-inefficient-algorithm <performance/inefficient-algorithm>`, "Yes"
@@ -365,6 +364,7 @@ Clang-Tidy Checks
:doc:`performance-noexcept-destructor <performance/noexcept-destructor>`, "Yes"
:doc:`performance-noexcept-move-constructor <performance/noexcept-move-constructor>`, "Yes"
:doc:`performance-noexcept-swap <performance/noexcept-swap>`, "Yes"
+ :doc:`performance-prefer-single-char-overloads <performance/prefer-single-char-overloads>`, "Yes"
:doc:`performance-string-view-conversions <performance/string-view-conversions>`, "Yes"
:doc:`performance-trivially-destructible <performance/trivially-destructible>`, "Yes"
:doc:`performance-type-promotion-in-math-fn <performance/type-promotion-in-math-fn>`, "Yes"
diff --git a/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-find.rst b/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-find.rst
index 3dc2ff04d53e6..39788bf4623e7 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-find.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-find.rst
@@ -1,10 +1,10 @@
.. title:: clang-tidy - performance-faster-string-find
.. meta::
- :http-equiv=refresh: 5;URL=faster-string-operation.html
+ :http-equiv=refresh: 5;URL=prefer-single-char-overloads.html
performance-faster-string-find
==============================
The `performance-faster-string-find check` is an alias, please see
-:doc:`performance-faster-string-operation <faster-string-operation>`
+:doc:`performance-prefer-single-char-overloads <prefer-single-char-overloads>`
for more information.
diff --git a/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-operation.rst b/clang-tools-extra/docs/clang-tidy/checks/performance/prefer-single-char-overloads.rst
similarity index 85%
rename from clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-operation.rst
rename to clang-tools-extra/docs/clang-tidy/checks/performance/prefer-single-char-overloads.rst
index 25907b2f5e6d3..3e6a9d979497e 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/performance/faster-string-operation.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/performance/prefer-single-char-overloads.rst
@@ -1,7 +1,7 @@
-.. title:: clang-tidy - performance-faster-string-operation
+.. title:: clang-tidy - performance-prefer-single-char-overloads
-performance-faster-string-operation
-===================================
+performance-prefer-single-char-overloads
+========================================
Optimize calls to ``std::string::find()`` and friends when the needle passed is
a single character string literal. The character literal overload is more
diff --git a/clang-tools-extra/test/clang-tidy/checkers/performance/prefer-single-char-overloads-alias.cpp b/clang-tools-extra/test/clang-tidy/checkers/performance/prefer-single-char-overloads-alias.cpp
new file mode 100644
index 0000000000000..50077d8fbd0a9
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/performance/prefer-single-char-overloads-alias.cpp
@@ -0,0 +1,11 @@
+// RUN: %check_clang_tidy %s performance-faster-string-find %t
+
+#include <string>
+
+void StringFind() {
+ std::string Str;
+ Str.find("a");
+ // CHECK-MESSAGES: [[@LINE-1]]:12: warning: 'find' called with a string literal consisting of a single character; consider using the more efficient overload accepting a character [performance-faster-string-find]
+ // CHECK-MESSAGES: [[@LINE-2]]:12: note: performance-faster-string-find is deprecated and will be removed in future release, consider using performance-prefer-single-char-overloads
+ // CHECK-FIXES: Str.find('a');
+}
diff --git a/clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-operation.cpp b/clang-tools-extra/test/clang-tidy/checkers/performance/prefer-single-char-overloads.cpp
similarity index 94%
rename from clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-operation.cpp
rename to clang-tools-extra/test/clang-tidy/checkers/performance/prefer-single-char-overloads.cpp
index 1ecf76e9d075a..46bbf3c20f8fd 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/performance/faster-string-operation.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/performance/prefer-single-char-overloads.cpp
@@ -1,7 +1,7 @@
-// RUN: %check_clang_tidy %s performance-faster-string-operation %t -- -- -fno-delayed-template-parsing
-// RUN: %check_clang_tidy -check-suffix=CUSTOM %s performance-faster-string-operation %t -- \
+// RUN: %check_clang_tidy %s performance-prefer-single-char-overloads %t -- -- -fno-delayed-template-parsing
+// RUN: %check_clang_tidy -check-suffix=CUSTOM %s performance-prefer-single-char-overloads %t -- \
// RUN: -config="{CheckOptions: \
-// RUN: {performance-faster-string-operation.StringLikeClasses: \
+// RUN: {performance-prefer-single-char-overloads.StringLikeClasses: \
// RUN: '::llvm::StringRef;'}}" -- -fno-delayed-template-parsing
#include <string>
@@ -23,7 +23,7 @@ void StringFind() {
std::string Str;
Str.find("a");
- // CHECK-MESSAGES: [[@LINE-1]]:12: warning: 'find' called with a string literal consisting of a single character; consider using the more efficient overload accepting a character [performance-faster-string-operation]
+ // CHECK-MESSAGES: [[@LINE-1]]:12: warning: 'find' called with a string literal consisting of a single character; consider using the more efficient overload accepting a character [performance-prefer-single-char-overloads]
// CHECK-FIXES: Str.find('a');
// Works with the pos argument.
>From 4bb0f93ad75b7fcf2e492cfc80726c52bedabaf2 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Sat, 28 Mar 2026 23:17:01 +0800
Subject: [PATCH 4/4] fixup fixup
---
clang-tools-extra/docs/ReleaseNotes.rst | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index c2b751293aeba..1c95df6c48a23 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -52,7 +52,7 @@ Potentially Breaking Changes
- Deprecated the :program:`clang-tidy` check :doc:`performance-faster-string-find
<clang-tidy/checks/performance/faster-string-find>`. It has been renamed to
:doc:`performance-prefer-single-char-overloads
- <clang-tidy/checks/performance/faster-string-operation>`.
+ <clang-tidy/checks/performance/prefer-single-char-overloads>`.
The original check will be removed in the 25th release.
Improvements to clangd
@@ -198,7 +198,7 @@ New check aliases
- Renamed :doc:`performance-faster-string-find
<clang-tidy/checks/performance/faster-string-find>` to
:doc:`performance-prefer-single-char-overloads
- <clang-tidy/checks/performance/faster-string-operation>`.
+ <clang-tidy/checks/performance/prefer-single-char-overloads>`.
The `performance-faster-string-find` name is kept as an alias.
Changes in existing checks
@@ -341,14 +341,6 @@ Changes in existing checks
- Improved the ignore list to correctly handle ``typedef`` and ``enum``.
-- Improved :doc:`performance-prefer-single-char-overloads
- <clang-tidy/checks/performance/faster-string-operation>` check:
-
- - Now analyzes calls to the ``starts_with``, ``ends_with``, ``contains``,
- and ``operator+=`` string member functions.
-
- - Fixes false negatives when using ``std::set`` from ``libstdc++``.
-
- Improved :doc:`performance-inefficient-string-concatenation
<clang-tidy/checks/performance/inefficient-string-concatenation>` check by
adding support for detecting inefficient string concatenation in ``do-while``
@@ -363,6 +355,14 @@ Changes in existing checks
<clang-tidy/checks/performance/move-const-arg>` check by avoiding false
positives on trivially copyable types with a non-public copy constructor.
+- Improved :doc:`performance-prefer-single-char-overloads
+ <clang-tidy/checks/performance/prefer-single-char-overloads>` check:
+
+ - Now analyzes calls to the ``starts_with``, ``ends_with``, ``contains``,
+ and ``operator+=`` string member functions.
+
+ - Fixes false negatives when using ``std::set`` from ``libstdc++``.
+
- Improved :doc:`readability-container-size-empty
<clang-tidy/checks/readability/container-size-empty>` check:
More information about the cfe-commits
mailing list