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
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index ea9b106..8b116ae 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 @@
   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;
 }