[clang-tools-extra] [clang-tidy][abseil-string-find-startswith] Add string_view to default string-like classes (PR #72283)
Nicolas van Kempen via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 14 08:48:20 PST 2023
https://github.com/nicovank created https://github.com/llvm/llvm-project/pull/72283
As per title. A small improvement to this check, `string_view` should work out of the box.
I am slowly looking into adding an option to this check to recommend C++20's API `starts_with`, and move it to `modernize`.
Possibly would like to use it as a codemod on our code.
>From 6854521facebbe13368b8638ade0c8636dcf9941 Mon Sep 17 00:00:00 2001
From: Nicolas van Kempen <nvankempen at fb.com>
Date: Tue, 14 Nov 2023 08:31:05 -0800
Subject: [PATCH] [clang-tidy][abseil-string-find-startswith] Add string_view
to default string-like classes
---
.../abseil/StringFindStartswithCheck.cpp | 4 +++-
.../abseil/string-find-startswith.cpp | 22 ++++++++++++++++++-
2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
index b36144d1912fce0..31b5c3d9951409b 100644
--- a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
+++ b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
@@ -19,11 +19,13 @@ using namespace clang::ast_matchers;
namespace clang::tidy::abseil {
+const auto DefaultStringLikeClasses = "::std::basic_string; ::std::basic_string_view";
+
StringFindStartswithCheck::StringFindStartswithCheck(StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
StringLikeClasses(utils::options::parseStringList(
- Options.get("StringLikeClasses", "::std::basic_string"))),
+ Options.get("StringLikeClasses", DefaultStringLikeClasses))),
IncludeInserter(Options.getLocalOrGlobal("IncludeStyle",
utils::IncludeSorter::IS_LLVM),
areDiagsSelfContained()),
diff --git a/clang-tools-extra/test/clang-tidy/checkers/abseil/string-find-startswith.cpp b/clang-tools-extra/test/clang-tidy/checkers/abseil/string-find-startswith.cpp
index e51568077eda151..69dc61e6a73e32f 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/abseil/string-find-startswith.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/abseil/string-find-startswith.cpp
@@ -1,5 +1,5 @@
// RUN: %check_clang_tidy %s abseil-string-find-startswith %t -- \
-// RUN: -config="{CheckOptions: {abseil-string-find-startswith.StringLikeClasses: '::std::basic_string;::basic_string'}}"
+// RUN: -config="{CheckOptions: {abseil-string-find-startswith.StringLikeClasses: '::std::basic_string;::std::basic_string_view;::basic_string'}}"
using size_t = decltype(sizeof(int));
@@ -22,6 +22,21 @@ struct basic_string {
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;
+template <typename C>
+class basic_string_view {
+public:
+ basic_string_view();
+ basic_string_view(const basic_string_view &);
+ basic_string_view(const C *);
+ ~basic_string_view();
+ int find(basic_string_view s, int pos = 0);
+ int find(const C *s, int pos = 0);
+ int find(const C *s, int pos, int n);
+ int find(char c, int pos = 0);
+ static constexpr size_t npos = -1;
+};
+typedef basic_string_view<char> string_view;
+
struct cxx_string {
int find(const char *s, int pos = 0);
int rfind(const char *s, int pos = npos);
@@ -96,6 +111,11 @@ void tests(std::string s, global_string s2) {
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StartsWith
// CHECK-FIXES: {{^[[:space:]]*}}absl::StartsWith(s2, "a");{{$}}
+ std::string_view sv;
+ sv.find("a") == 0;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StartsWith
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StartsWith(sv, "a");{{$}}
+
// expressions that don't trigger the check are here.
A_MACRO(s.find("a"), 0);
A_MACRO(s.rfind("a", 0), 0);
More information about the cfe-commits
mailing list