================ @@ -0,0 +1,151 @@ +// RUN: %check_clang_tidy -std=c++20 %s performance-use-starts-ends-with %t -- \ +// RUN: -- -isystem %clang_tidy_headers + +#include <string> + +std::string foo(std::string); +std::string bar(); + +#define A_MACRO(x, y) ((x) == (y)) +#define STR(x) std::string(x) + +class sub_string : public std::string {}; +class sub_sub_string : public sub_string {}; + +struct string_like { + bool starts_with(const char *s) const; + size_t find(const char *s, size_t pos = 0) const; +}; + +struct string_like_camel { + bool startsWith(const char *s) const; + size_t find(const char *s, size_t pos = 0) const; +}; + +struct prefer_underscore_version { + bool starts_with(const char *s) const; + bool startsWith(const char *s) const; + size_t find(const char *s, size_t pos = 0) const; +}; + +struct prefer_underscore_version_flip { + bool startsWith(const char *s) const; + bool starts_with(const char *s) const; + size_t find(const char *s, size_t pos = 0) const; +}; + +struct prefer_underscore_version_inherit : public string_like { + bool startsWith(const char *s) const; +}; + +void test(std::string s, std::string_view sv, sub_string ss, sub_sub_string sss, + string_like sl, string_like_camel slc, prefer_underscore_version puv, + prefer_underscore_version_flip puvf, + prefer_underscore_version_inherit puvi) { + s.find("a") == 0; + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with instead of find() == 0 + // CHECK-FIXES: s.starts_with("a"); + + s.find(s) == 0; + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with + // CHECK-FIXES: s.starts_with(s); + + s.find("aaa") != 0; + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with + // CHECK-FIXES: !s.starts_with("aaa"); + + s.find(foo(foo(bar()))) != 0; + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with + // CHECK-FIXES: !s.starts_with(foo(foo(bar()))); + + if (s.find("....") == 0) { /* do something */ } + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with + // CHECK-FIXES: if (s.starts_with("....")) + + 0 != s.find("a"); + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with + // CHECK-FIXES: !s.starts_with("a"); + + s.rfind("a", 0) == 0; + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with instead of rfind() == 0 + // CHECK-FIXES: s.starts_with("a"); + + s.rfind(s, 0) == 0; + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with + // CHECK-FIXES: s.starts_with(s); + + s.rfind("aaa", 0) != 0; + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with + // CHECK-FIXES: !s.starts_with("aaa"); + + s.rfind(foo(foo(bar())), 0) != 0; + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with + // CHECK-FIXES: !s.starts_with(foo(foo(bar()))); + + if (s.rfind("....", 0) == 0) { /* do something */ } + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with + // CHECK-FIXES: if (s.starts_with("....")) + + 0 != s.rfind("a", 0); + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with + // CHECK-FIXES: !s.starts_with("a"); + + 0 == STR(s).find("a"); + // CHECK-MESSAGES: :[[@LINE-1]]:{{[0-9]+}}: warning: use starts_with + // CHECK-FIXES: STR(s).starts_with("a"); + + #define STR str + std::string STR; + if (0 == STR.find("ala")) { /* do something */} ---------------- PiotrZSL wrote:
Add few more test withs macros: - method name under macro - argument under macro - 0 under macro - operator under macro - #define EQ(x,y) (x) == (y) https://github.com/llvm/llvm-project/pull/72385 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits