[clang-tools-extra] [clang-tidy] Enhance modernize-use-starts-ends-with to handle substr patterns (PR #116033)
Nicolas van Kempen via cfe-commits
cfe-commits at lists.llvm.org
Sun Nov 17 18:16:39 PST 2024
================
@@ -171,10 +182,64 @@ void UseStartsEndsWithCheck::registerMatchers(MatchFinder *Finder) {
hasRHS(lengthExprForStringNode("needle")))))
.bind("expr"),
this);
+
+ Finder->addMatcher(
+ cxxOperatorCallExpr(
+ hasAnyOperatorName("==", "!="),
+ anyOf(
+ hasOperands(
+ cxxMemberCallExpr(
+ argumentCountIs(2), hasArgument(0, ZeroLiteral),
+ hasArgument(1, lengthExprForStringNode("needle")),
+ callee(
+ cxxMethodDecl(hasName("substr"),
+ ofClass(OnClassWithStartsWithFunction))
+ .bind("find_fun")))
+ .bind("find_expr"),
+ expr().bind("needle")),
+ hasOperands(expr().bind("needle"),
+ cxxMemberCallExpr(
+ argumentCountIs(2), hasArgument(0, ZeroLiteral),
+ hasArgument(1, lengthExprForStringNode("needle")),
+ callee(cxxMethodDecl(
+ hasName("substr"),
+ ofClass(OnClassWithStartsWithFunction))
+ .bind("find_fun")))
+ .bind("find_expr"))))
+ .bind("expr"),
+ this);
+}
+
+bool UseStartsEndsWithCheck::isNegativeComparison(const Expr* ComparisonExpr) {
+ // Handle direct != operator
+ if (const auto *BO = llvm::dyn_cast<BinaryOperator>(ComparisonExpr)) {
+ return BO->getOpcode() == BO_NE;
+ }
+
+ // Handle operator!= call
+ if (const auto *Op = llvm::dyn_cast<CXXOperatorCallExpr>(ComparisonExpr)) {
+ return Op->getOperator() == OO_ExclaimEqual;
+ }
+
+ // Handle rewritten !(expr == expr)
+ if (const auto *UO = llvm::dyn_cast<UnaryOperator>(ComparisonExpr)) {
+ if (UO->getOpcode() == UO_LNot) {
+ if (const auto *InnerBO =
+ llvm::dyn_cast<BinaryOperator>(UO->getSubExpr()->IgnoreParens())) {
+ return InnerBO->getOpcode() == BO_EQ;
+ }
+ if (const auto *InnerOp =
+ llvm::dyn_cast<CXXOperatorCallExpr>(UO->getSubExpr()->IgnoreParens())) {
+ return InnerOp->getOperator() == OO_EqualEqual;
+ }
+ }
+ }
+
----------------
nicovank wrote:
This will never happen anyway because the matcher specifically matches `cxxOperatorCallExpr` or `binaryOperator`. Tomorrow I'll write a test case that triggers the `CXXRewrittenBinaryOperator` case I mentioned. IMO it is okay to make this change in a subsequent PR if it turns out there are false negatives.
https://github.com/llvm/llvm-project/pull/116033
More information about the cfe-commits
mailing list