[clang-tools-extra] [clang-tidy][NFC] Prefer `llvm::split` over `StringRef::split` (PR #174129)
Victor Chernyakin via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 31 21:26:44 PST 2025
https://github.com/localspook created https://github.com/llvm/llvm-project/pull/174129
`llvm::split` is compatible with all containers (not just `SmallVector`), doesn't use out parameters, and is lazy, making it the more ergonomic option in basically all scenarios.
>From 54885b68b8e541148fca8b46fb34b79326b5d33b Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Wed, 31 Dec 2025 21:13:09 -0800
Subject: [PATCH] [clang-tidy][NFC] Prefer `llvm::split` over
`StringRef::split`
---
.../ComparisonInTempFailureRetryCheck.cpp | 5 ++---
.../bugprone/AssertSideEffectCheck.cpp | 5 ++---
.../bugprone/ExceptionEscapeCheck.cpp | 21 +++++++------------
.../bugprone/RandomGeneratorSeedCheck.cpp | 5 ++---
.../clang-tidy/modernize/UseNullptrCheck.cpp | 5 ++---
.../openmp/ExceptionEscapeCheck.cpp | 8 ++-----
.../readability/IdentifierNamingCheck.cpp | 11 ++--------
.../clang-tidy/utils/OptionsUtils.cpp | 17 ++++++---------
.../clang-tidy/DeclRefExprUtilsTest.cpp | 4 +---
9 files changed, 26 insertions(+), 55 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/android/ComparisonInTempFailureRetryCheck.cpp b/clang-tools-extra/clang-tidy/android/ComparisonInTempFailureRetryCheck.cpp
index c42f069b487c3..173aa6900c099 100644
--- a/clang-tools-extra/clang-tidy/android/ComparisonInTempFailureRetryCheck.cpp
+++ b/clang-tools-extra/clang-tidy/android/ComparisonInTempFailureRetryCheck.cpp
@@ -18,9 +18,8 @@ namespace clang::tidy::android {
ComparisonInTempFailureRetryCheck::ComparisonInTempFailureRetryCheck(
StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
- RawRetryList(Options.get("RetryMacros", "TEMP_FAILURE_RETRY")) {
- RawRetryList.split(RetryMacros, ",", -1, false);
-}
+ RawRetryList(Options.get("RetryMacros", "TEMP_FAILURE_RETRY")),
+ RetryMacros(llvm::split(RawRetryList, ',')) {}
void ComparisonInTempFailureRetryCheck::storeOptions(
ClangTidyOptions::OptionMap &Opts) {
diff --git a/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
index 632f536a5b20b..a958d3350514e 100644
--- a/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp
@@ -90,9 +90,8 @@ AssertSideEffectCheck::AssertSideEffectCheck(StringRef Name,
CheckFunctionCalls(Options.get("CheckFunctionCalls", false)),
RawAssertList(Options.get("AssertMacros", "assert,NSAssert,NSCAssert")),
IgnoredFunctions(utils::options::parseListPair(
- "__builtin_expect;", Options.get("IgnoredFunctions", ""))) {
- RawAssertList.split(AssertMacros, ",", -1, false);
-}
+ "__builtin_expect;", Options.get("IgnoredFunctions", ""))),
+ AssertMacros(llvm::split(RawAssertList, ',')) {}
// The options are explained in AssertSideEffectCheck.h.
void AssertSideEffectCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
diff --git a/clang-tools-extra/clang-tidy/bugprone/ExceptionEscapeCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/ExceptionEscapeCheck.cpp
index 1cfb1511fa94e..572ce5d9ea5f6 100644
--- a/clang-tools-extra/clang-tidy/bugprone/ExceptionEscapeCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/ExceptionEscapeCheck.cpp
@@ -42,20 +42,13 @@ ExceptionEscapeCheck::ExceptionEscapeCheck(StringRef Name,
CheckDestructors(Options.get("CheckDestructors", true)),
CheckMoveMemberFunctions(Options.get("CheckMoveMemberFunctions", true)),
CheckMain(Options.get("CheckMain", true)),
- CheckNothrowFunctions(Options.get("CheckNothrowFunctions", true)) {
- llvm::SmallVector<StringRef, 8> FunctionsThatShouldNotThrowVec,
- IgnoredExceptionsVec, CheckedSwapFunctionsVec;
- RawFunctionsThatShouldNotThrow.split(FunctionsThatShouldNotThrowVec, ",", -1,
- false);
- FunctionsThatShouldNotThrow.insert_range(FunctionsThatShouldNotThrowVec);
-
- RawCheckedSwapFunctions.split(CheckedSwapFunctionsVec, ",", -1, false);
- CheckedSwapFunctions.insert_range(CheckedSwapFunctionsVec);
-
- llvm::StringSet<> IgnoredExceptions;
- RawIgnoredExceptions.split(IgnoredExceptionsVec, ",", -1, false);
- IgnoredExceptions.insert_range(IgnoredExceptionsVec);
- Tracer.ignoreExceptions(std::move(IgnoredExceptions));
+ CheckNothrowFunctions(Options.get("CheckNothrowFunctions", true)),
+ FunctionsThatShouldNotThrow(
+ llvm::from_range, llvm::split(RawFunctionsThatShouldNotThrow, ',')),
+ CheckedSwapFunctions(llvm::from_range,
+ llvm::split(RawCheckedSwapFunctions, ',')) {
+ Tracer.ignoreExceptions(
+ {llvm::from_range, llvm::split(RawIgnoredExceptions, ',')});
Tracer.ignoreBadAlloc(true);
}
diff --git a/clang-tools-extra/clang-tidy/bugprone/RandomGeneratorSeedCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/RandomGeneratorSeedCheck.cpp
index 3e32e9b8a704c..de614d0bedc1c 100644
--- a/clang-tools-extra/clang-tidy/bugprone/RandomGeneratorSeedCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/RandomGeneratorSeedCheck.cpp
@@ -19,9 +19,8 @@ RandomGeneratorSeedCheck::RandomGeneratorSeedCheck(StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
RawDisallowedSeedTypes(
- Options.get("DisallowedSeedTypes", "time_t,std::time_t")) {
- RawDisallowedSeedTypes.split(DisallowedSeedTypes, ',');
-}
+ Options.get("DisallowedSeedTypes", "time_t,std::time_t")),
+ DisallowedSeedTypes(llvm::split(RawDisallowedSeedTypes, ',')) {}
void RandomGeneratorSeedCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "DisallowedSeedTypes", RawDisallowedSeedTypes);
diff --git a/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp
index cc371a1ab55a7..96bf36c96205d 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseNullptrCheck.cpp
@@ -495,9 +495,8 @@ UseNullptrCheck::UseNullptrCheck(StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
NullMacrosStr(Options.get("NullMacros", "NULL")),
IgnoredTypes(utils::options::parseStringList(Options.get(
- "IgnoredTypes", "_CmpUnspecifiedParam;^std::__cmp_cat::__unspec"))) {
- NullMacrosStr.split(NullMacros, ",");
-}
+ "IgnoredTypes", "_CmpUnspecifiedParam;^std::__cmp_cat::__unspec"))),
+ NullMacros(llvm::split(NullMacrosStr, ',')) {}
void UseNullptrCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "NullMacros", NullMacrosStr);
diff --git a/clang-tools-extra/clang-tidy/openmp/ExceptionEscapeCheck.cpp b/clang-tools-extra/clang-tidy/openmp/ExceptionEscapeCheck.cpp
index 3801fc0f420e5..a0e3ee060f06f 100644
--- a/clang-tools-extra/clang-tidy/openmp/ExceptionEscapeCheck.cpp
+++ b/clang-tools-extra/clang-tidy/openmp/ExceptionEscapeCheck.cpp
@@ -20,13 +20,9 @@ ExceptionEscapeCheck::ExceptionEscapeCheck(StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
RawIgnoredExceptions(Options.get("IgnoredExceptions", "")) {
- llvm::SmallVector<StringRef, 8> IgnoredExceptionsVec;
-
llvm::StringSet<> IgnoredExceptions;
- RawIgnoredExceptions.split(IgnoredExceptionsVec, ",", -1, false);
- llvm::transform(IgnoredExceptionsVec, IgnoredExceptionsVec.begin(),
- [](StringRef S) { return S.trim(); });
- IgnoredExceptions.insert_range(IgnoredExceptionsVec);
+ for (const StringRef S : llvm::split(RawIgnoredExceptions, ','))
+ IgnoredExceptions.insert(S.trim());
Tracer.ignoreExceptions(std::move(IgnoredExceptions));
Tracer.ignoreBadAlloc(true);
}
diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
index 9cee6ddb93d4d..948d8dccfc232 100644
--- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
@@ -660,13 +660,9 @@ std::string IdentifierNamingCheck::HungarianNotation::getEnumPrefix(
static const llvm::Regex Splitter(
"([a-z0-9A-Z]*)(_+)|([A-Z]?[a-z0-9]+)([A-Z]|$)|([A-Z]+)([A-Z]|$)");
- const StringRef EnumName(Name);
- SmallVector<StringRef, 8> Substrs;
- EnumName.split(Substrs, "_", -1, false);
-
SmallVector<StringRef, 8> Words;
SmallVector<StringRef, 8> Groups;
- for (auto Substr : Substrs) {
+ for (StringRef Substr : llvm::split(Name, '_')) {
while (!Substr.empty()) {
Groups.clear();
if (!Splitter.match(Substr, &Groups))
@@ -910,12 +906,9 @@ std::string IdentifierNamingCheck::fixupWithCase(
static const llvm::Regex Splitter(
"([a-z0-9A-Z]*)(_+)|([A-Z]?[a-z0-9]+)([A-Z]|$)|([A-Z]+)([A-Z]|$)");
- SmallVector<StringRef, 8> Substrs;
- Name.split(Substrs, "_", -1, false);
-
SmallVector<StringRef, 8> Words;
SmallVector<StringRef, 8> Groups;
- for (auto Substr : Substrs) {
+ for (auto Substr : llvm::split(Name, '_')) {
while (!Substr.empty()) {
Groups.clear();
if (!Splitter.match(Substr, &Groups))
diff --git a/clang-tools-extra/clang-tidy/utils/OptionsUtils.cpp b/clang-tools-extra/clang-tidy/utils/OptionsUtils.cpp
index ad536b6290ca0..61a0448cf58c4 100644
--- a/clang-tools-extra/clang-tidy/utils/OptionsUtils.cpp
+++ b/clang-tools-extra/clang-tidy/utils/OptionsUtils.cpp
@@ -11,7 +11,7 @@
namespace clang::tidy::utils::options {
-static constexpr char StringsDelimiter[] = ";";
+static constexpr char StringsDelimiter = ';';
std::vector<StringRef> parseStringList(StringRef Option) {
Option = Option.trim().trim(StringsDelimiter);
@@ -19,16 +19,11 @@ std::vector<StringRef> parseStringList(StringRef Option) {
return {};
std::vector<StringRef> Result;
Result.reserve(Option.count(StringsDelimiter) + 1);
- StringRef Cur;
- while (std::tie(Cur, Option) = Option.split(StringsDelimiter),
- !Option.empty()) {
- Cur = Cur.trim();
- if (!Cur.empty())
- Result.push_back(Cur);
+ for (StringRef SubStr : llvm::split(Option, StringsDelimiter)) {
+ SubStr = SubStr.trim();
+ if (!SubStr.empty())
+ Result.push_back(SubStr);
}
- Cur = Cur.trim();
- if (!Cur.empty())
- Result.push_back(Cur);
return Result;
}
@@ -57,7 +52,7 @@ std::vector<StringRef> parseListPair(StringRef L, StringRef R) {
}
std::string serializeStringList(ArrayRef<StringRef> Strings) {
- return llvm::join(Strings, StringsDelimiter);
+ return llvm::join(Strings, {&StringsDelimiter, 1});
}
} // namespace clang::tidy::utils::options
diff --git a/clang-tools-extra/unittests/clang-tidy/DeclRefExprUtilsTest.cpp b/clang-tools-extra/unittests/clang-tidy/DeclRefExprUtilsTest.cpp
index 064e04c932de8..496ded3d74536 100644
--- a/clang-tools-extra/unittests/clang-tidy/DeclRefExprUtilsTest.cpp
+++ b/clang-tools-extra/unittests/clang-tidy/DeclRefExprUtilsTest.cpp
@@ -102,9 +102,7 @@ template <int Indirections> void RunTest(StringRef Snippet) {
)";
std::string Code = (CommonCode + Snippet).str();
-
- llvm::SmallVector<StringRef, 1> Parts;
- StringRef(Code).split(Parts, "/*const*/");
+ llvm::SmallVector<StringRef, 1> Parts(llvm::split(Code, "/*const*/"));
EXPECT_EQ(Code,
runCheckOnCode<ConstReferenceDeclRefExprsTransform<Indirections>>(
More information about the cfe-commits
mailing list