================ @@ -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; + } + } + } + ---------------- hjanuschka wrote:
ok - can we keep? `isNegativeComparison`? removed the "rewritten" part. https://github.com/llvm/llvm-project/pull/116033 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits