================ @@ -112,6 +115,57 @@ AST_MATCHER_P(Stmt, canResolveToExpr, const Stmt *, Inner) { return canExprResolveTo(Exp, Target); } +// use class member to store data can reduce stack usage to avoid stack overflow +// when recursive call. +class ExprPointeeResolve { + const Expr *T; + + bool resolveExpr(const Expr *E) { + if (E == nullptr) + return false; + if (E == T) + return true; + + if (const auto *BO = dyn_cast<BinaryOperator>(E)) { + if (BO->isAdditiveOp()) + return (resolveExpr(BO->getLHS()) || resolveExpr(BO->getRHS())); + if (BO->isCommaOp()) + return resolveExpr(BO->getRHS()); + return false; + } + + if (const auto *PE = dyn_cast<ParenExpr>(E)) + return resolveExpr(PE->getSubExpr()); + + if (const auto *ICE = dyn_cast<ImplicitCastExpr>(E)) { + const CastKind kind = ICE->getCastKind(); + if (kind == CK_LValueToRValue || kind == CK_DerivedToBase || + kind == CK_UncheckedDerivedToBase) + return resolveExpr(ICE->getSubExpr()); + return false; + } + ---------------- 5chmidti wrote:
`CXXDynamicCastExpr`, and `CXXStaticCastExpr` could be additional cases: `dynamicCast<Derived*>(BasePtr)`, `static_cast<Base*>(DerivedPtr)` 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