aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/ExprConstant.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2008-07-08 05:13:58 +0000
committerAnders Carlsson <andersca@mac.com>2008-07-08 05:13:58 +0000
commitc754aa62643e66ab967ca32ae8b0b3fc419bba25 (patch)
treed993ca286973acd355dd51feca864e9d44a907b9 /lib/AST/ExprConstant.cpp
parent62f6b2110792f2db8feb35247b0ab824c6cc608d (diff)
Commit beginnings of int evaluator. Currently not used.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53219 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ExprConstant.cpp')
-rw-r--r--lib/AST/ExprConstant.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index ea9b106b69..8b116ae496 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -14,9 +14,12 @@
#include "clang/AST/APValue.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Expr.h"
+#include "clang/AST/STmtVisitor.h"
+#include "llvm/Support/Compiler.h"
using namespace clang;
+#define USE_NEW_EVALUATOR 0
static bool CalcFakeICEVal(const Expr* Expr,
llvm::APSInt& Result,
@@ -47,14 +50,51 @@ static bool CalcFakeICEVal(const Expr* Expr,
return false;
}
+namespace {
+class VISIBILITY_HIDDEN IntExprEvaluator
+ : public StmtVisitor<IntExprEvaluator, APValue> {
+ ASTContext &Ctx;
+
+ IntExprEvaluator(ASTContext &ctx)
+ : Ctx(ctx) {}
+
+public:
+ static bool Evaluate(const Expr* E, APValue& Result, ASTContext &Ctx) {
+ Result = IntExprEvaluator(Ctx).Visit(const_cast<Expr*>(E));
+ return Result.isSInt();
+ }
+
+ //===--------------------------------------------------------------------===//
+ // Visitor Methods
+ //===--------------------------------------------------------------------===//
+ APValue VisitStmt(Stmt *S) {
+ // FIXME: Remove this when we support more expressions.
+ printf("Unhandled statement\n");
+ S->dump();
+ return APValue();
+ }
+
+ APValue VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr()); }
+
+};
+}
+
bool Expr::tryEvaluate(APValue& Result, ASTContext &Ctx) const
{
llvm::APSInt sInt(1);
+#if USE_NEW_EVALUATOR
+ if (getType()->isIntegerType())
+ return IntExprEvaluator::Evaluate(this, Result, Ctx);
+ else
+ return false;
+
+#else
if (CalcFakeICEVal(this, sInt, Ctx)) {
Result = APValue(sInt);
return true;
}
+#endif
return false;
}