================ @@ -654,6 +716,83 @@ ExprMutationAnalyzer::Analyzer::findFunctionArgMutation(const Expr *Exp) { return nullptr; } +const Stmt * +ExprMutationAnalyzer::Analyzer::findPointeeValueMutation(const Expr *Exp) { + const auto Matches = match( + stmt(forEachDescendant( + expr(anyOf( + // deref by * + unaryOperator(hasOperatorName("*"), + hasUnaryOperand(canResolveToExprPointee(Exp))), + // deref by [] + arraySubscriptExpr(hasBase(canResolveToExprPointee(Exp))))) + .bind(NodeID<Expr>::value))), + Stm, Context); + return findExprMutation(Matches); +} + +const Stmt * +ExprMutationAnalyzer::Analyzer::findPointeeMemberMutation(const Expr *Exp) { ---------------- HerrCai0907 wrote:
`CXXOperatorCallExpr` need to dereference firstly. It will be changed by other path. ```c++ struct A { int v; int operator++() const; }; void f() { A* x = nullptr; x->operator++(); } ``` ast looks like ``` `-CXXMemberCallExpr 0x14811b898 <col:28, col:42> 'int' `-MemberExpr 0x14811b818 <col:28, col:39> '<bound member function type>' ->operator++ 0x1480fd088 `-ImplicitCastExpr 0x14811b880 <col:28> 'const A *' <NoOp> `-ImplicitCastExpr 0x14811b800 <col:28> 'A *' <LValueToRValue> `-DeclRefExpr 0x1480fd3e0 <col:28> 'A *' lvalue Var 0x1480fd338 'x' 'A *' ``` https://github.com/llvm/llvm-project/pull/118593 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits