Refactoring of constant expression evaluator

This introduces a generic base class for the expression evaluator
classes, which handles a few common expression types which were
previously handled separately in each class.  Also, the expression
evaluator now uses ConstStmtVisitor.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@131281 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/APValue.cpp b/lib/AST/APValue.cpp
index 731d5e0..ebe99b1 100644
--- a/lib/AST/APValue.cpp
+++ b/lib/AST/APValue.cpp
@@ -18,12 +18,12 @@
 
 namespace {
   struct LV {
-    Expr* Base;
+    const Expr* Base;
     CharUnits Offset;
   };
 }
 
-APValue::APValue(Expr* B) : Kind(Uninitialized) {
+APValue::APValue(const Expr* B) : Kind(Uninitialized) {
   MakeLValue(); setLValue(B, CharUnits::Zero());
 }
 
@@ -118,7 +118,7 @@
   }
 }
 
-Expr* APValue::getLValueBase() const {
+const Expr* APValue::getLValueBase() const {
   assert(isLValue() && "Invalid accessor");
   return ((const LV*)(const void*)Data)->Base;
 }
@@ -128,7 +128,7 @@
     return ((const LV*)(const void*)Data)->Offset;
 }
 
-void APValue::setLValue(Expr *B, const CharUnits &O) {
+void APValue::setLValue(const Expr *B, const CharUnits &O) {
   assert(isLValue() && "Invalid accessor");
   ((LV*)(char*)Data)->Base = B;
   ((LV*)(char*)Data)->Offset = O;