================ @@ -437,12 +439,67 @@ class StmtComparer { }; } // namespace +static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, + const UnaryOperator *E1, + const CXXOperatorCallExpr *E2) { + return UnaryOperator::getOverloadedOperator(E1->getOpcode()) == + E2->getOperator() && + IsStructurallyEquivalent(Context, E1->getSubExpr(), E2->getArg(0)); +} + +static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, + const CXXOperatorCallExpr *E1, + const UnaryOperator *E2) { + return E1->getOperator() == + UnaryOperator::getOverloadedOperator(E2->getOpcode()) && + IsStructurallyEquivalent(Context, E1->getArg(0), E2->getSubExpr()); +} + +static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, + const BinaryOperator *E1, + const CXXOperatorCallExpr *E2) { + return BinaryOperator::getOverloadedOperator(E1->getOpcode()) == + E2->getOperator() && + IsStructurallyEquivalent(Context, E1->getLHS(), E2->getArg(0)) && + IsStructurallyEquivalent(Context, E1->getRHS(), E2->getArg(1)); +} + +static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, + const CXXOperatorCallExpr *E1, + const BinaryOperator *E2) { + return E1->getOperator() == + BinaryOperator::getOverloadedOperator(E2->getOpcode()) && + IsStructurallyEquivalent(Context, E1->getArg(0), E2->getLHS()) && + IsStructurallyEquivalent(Context, E1->getArg(1), E2->getRHS()); +} + /// Determine structural equivalence of two statements. static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, const Stmt *S1, const Stmt *S2) { if (!S1 || !S2) return S1 == S2; + // Check for statements with similar syntax but different AST. + // The unary and binary operators (like '+', '&') can be parsed as + // CXXOperatorCall too (and UnaryOperator or BinaryOperator). + // This depends on arguments with unresolved type and on the name lookup. ---------------- DonatNagyE wrote:
Could you perhaps elaborate this sentence a bit? Do I understand it correctly that e.g. in `CXXOperatorCallExprVsUnaryBinaryOperator` the presence of `struct Bar` in the second TU ensured that all the operators are parsed as `CXXOperatorCall`s, while in the first TU they are parsed as unary/binary operator expressions? https://github.com/llvm/llvm-project/pull/72242 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits