llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-tidy Author: Nicolas van Kempen (nicovank) <details> <summary>Changes</summary> 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. --- Full diff: https://github.com/llvm/llvm-project/pull/72283.diff 2 Files Affected: - (modified) clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp (+4-1) - (modified) clang-tools-extra/test/clang-tidy/checkers/abseil/string-find-startswith.cpp (+21-2) ``````````diff diff --git a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp index b36144d1912fce0..d0527cba22a917d 100644 --- a/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp +++ b/clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp @@ -19,11 +19,14 @@ 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..ae8d2daf736e979 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); @@ -39,7 +54,7 @@ std::string bar(); #define A_MACRO(x, y) ((x) == (y)) -void tests(std::string s, global_string s2) { +void tests(std::string s, global_string s2, std::string_view sv) { s.find("a") == 0; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StartsWith instead of find() == 0 [abseil-string-find-startswith] // CHECK-FIXES: {{^[[:space:]]*}}absl::StartsWith(s, "a");{{$}} @@ -96,6 +111,10 @@ void tests(std::string s, global_string s2) { // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StartsWith // CHECK-FIXES: {{^[[:space:]]*}}absl::StartsWith(s2, "a");{{$}} + 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); `````````` </details> https://github.com/llvm/llvm-project/pull/72283 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits