diff --git a/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp b/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp --- a/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp +++ b/clang-tools-extra/clang-tidy/performance/FasterStringFindCheck.cpp @@ -51,7 +51,8 @@ ClangTidyContext *Context) : ClangTidyCheck(Name, Context), StringLikeClasses(utils::options::parseStringList( - Options.get("StringLikeClasses", "std::basic_string"))) {} + Options.get("StringLikeClasses", + "::std::basic_string;::std::basic_string_view"))) {} void FasterStringFindCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { Options.store(Opts, "StringLikeClasses", diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -195,6 +195,11 @@ Changes in existing checks ^^^^^^^^^^^^^^^^^^^^^^^^^^ +- Improved :doc:`performance-faster-string-find + ` check. + + Now checks ``std::basic_string_view`` by default. + - Improved :doc:`readability-identifier-naming ` check. 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 --- 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 @@ -23,6 +23,8 @@ .. option:: StringLikeClasses Semicolon-separated list of names of string-like classes. By default only - ``std::basic_string`` is considered. The list of methods to consired is - fixed. + ``::std::basic_string`` and ``::std::basic_string_view`` are considered. + The check will only consider member functions named ``find``, ``rfind``, + ``find_first_of``, ``find_first_not_of``, ``find_last_of``, or + ``find_last_not_of`` within these classes. 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-find.cpp --- a/clang-tools-extra/test/clang-tidy/checkers/performance-faster-string-find.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/performance-faster-string-find.cpp @@ -1,7 +1,8 @@ -// RUN: %check_clang_tidy %s performance-faster-string-find %t -- \ +// RUN: %check_clang_tidy %s performance-faster-string-find %t +// RUN: %check_clang_tidy -check-suffix=CUSTOM %s performance-faster-string-find %t -- \ // RUN: -config="{CheckOptions: \ // RUN: [{key: performance-faster-string-find.StringLikeClasses, \ -// RUN: value: 'std::basic_string; ::llvm::StringRef;'}]}" -- +// RUN: value: '::llvm::StringRef;'}]}" namespace std { template @@ -17,6 +18,20 @@ typedef basic_string string; typedef basic_string wstring; + +template +struct basic_string_view { + int find(const Char *, int = 0) const; + int find(const Char *, int, int) const; + int rfind(const Char *) const; + int find_first_of(const Char *) const; + int find_first_not_of(const Char *) const; + int find_last_of(const Char *) const; + int find_last_not_of(const Char *) const; +}; + +typedef basic_string_view string_view; +typedef basic_string_view wstring_view; } // namespace std namespace llvm { @@ -75,11 +90,25 @@ // CHECK-MESSAGES: [[@LINE-1]]:13: warning: 'find' called with a string literal // CHECK-FIXES: Str.find(L'\x3A9'); + // std::string_view and std::wstring_view should work. + std::string_view StrView; + StrView.find("n"); + // CHECK-MESSAGES: [[@LINE-1]]:16: warning: 'find' called with a string literal + // CHECK-FIXES: StrView.find('n'); + std::wstring_view WStrView; + + WStrView.find(L"n"); + // CHECK-MESSAGES: [[@LINE-1]]:17: warning: 'find' called with a string literal + // CHECK-FIXES: WStrView.find(L'n'); + WStrView.find(L"\x3A9"); + // CHECK-MESSAGES: [[@LINE-1]]:17: warning: 'find' called with a string literal + // CHECK-FIXES: WStrView.find(L'\x3A9'); + // Also with other types, but only if it was specified in the options. llvm::StringRef sr; sr.find("x"); - // CHECK-MESSAGES: [[@LINE-1]]:11: warning: 'find' called with a string literal - // CHECK-FIXES: sr.find('x'); + // CHECK-MESSAGES-CUSTOM: [[@LINE-1]]:11: warning: 'find' called with a string literal + // CHECK-FIXES-CUSTOM: sr.find('x'); NotStringRef nsr; nsr.find("x"); }