================ @@ -420,6 +420,118 @@ AST_MATCHER(CXXConstructExpr, isSafeSpanTwoParamConstruct) { return false; } +class MaxValueEval : public RecursiveASTVisitor<MaxValueEval> { + + std::vector<llvm::APInt> val; + ASTContext &Context; + llvm::APInt Max; + unsigned bit_width; + +public: + typedef RecursiveASTVisitor<MaxValueEval> VisitorBase; + + explicit MaxValueEval(ASTContext &Ctx, const Expr *exp) : Context(Ctx) { + bit_width = Ctx.getIntWidth(exp->getType()); + Max = llvm::APInt::getSignedMaxValue(bit_width); + val.clear(); + } + + bool findMatch(Expr *exp) { + TraverseStmt(exp); + return true; + } + + bool VisitDeclRefExpr(DeclRefExpr *dre) { + val.push_back(Max); + return false; + } + + bool VisitArraySubscriptExpr(ArraySubscriptExpr *E) { + val.push_back(Max); + return false; + } + + bool EvaluateExpression(Expr *exp) { + Expr::EvalResult EVResult; + if (exp->EvaluateAsInt(EVResult, Context)) { + llvm::APSInt Result = EVResult.Val.getInt(); + val.push_back(Result); + return true; + } + return false; + } + + bool VisitBinaryOperator(BinaryOperator *E) { ---------------- malavikasamak wrote:
Well.. This is a bit tricky and we actually don't always depend on the LHS and RHS evaluation. Here, I am first checking if the expr evaluates to a constant value. If yes, we store the result and don't traverse any further. If it does not, only then we process the LHS and RHS to extract their limits. https://github.com/llvm/llvm-project/pull/112284 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits