Implemented casts for ConcreteInt and ConcreteIntLValue.
Implemented '==' and '!=' for ConcreteIntLValue.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46630 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/RValues.cpp b/Analysis/RValues.cpp
index 4008e76..f41051e 100644
--- a/Analysis/RValues.cpp
+++ b/Analysis/RValues.cpp
@@ -79,20 +79,56 @@
   return getValue(V);
 }
 
+//===----------------------------------------------------------------------===//
+// Transfer function for Casts.
+//===----------------------------------------------------------------------===//
+
+RValue RValue::Cast(ValueManager& ValMgr, Expr* CastExpr) const {
+  switch (getBaseKind()) {
+    default: assert(false && "Invalid RValue."); break;
+    case LValueKind: return cast<LValue>(this)->Cast(ValMgr, CastExpr);
+    case NonLValueKind: return cast<NonLValue>(this)->Cast(ValMgr, CastExpr);      
+    case UninitializedKind: case InvalidKind: break;
+  }
+  
+  return *this;
+}
+ 
+RValue LValue::Cast(ValueManager& ValMgr, Expr* CastExpr) const {
+  if (CastExpr->getType()->isPointerType())
+    return *this;
+  
+  assert (CastExpr->getType()->isIntegerType());
+
+  if (!isa<ConcreteIntLValue>(*this))
+    return InvalidValue();
+  
+  APSInt V = cast<ConcreteIntLValue>(this)->getValue();
+  QualType T = CastExpr->getType();
+  V.setIsUnsigned(T->isUnsignedIntegerType());
+  V.extOrTrunc(ValMgr.getContext().getTypeSize(T, CastExpr->getLocStart()));
+  return ConcreteInt(ValMgr.getValue(V));
+}
+
+RValue NonLValue::Cast(ValueManager& ValMgr, Expr* CastExpr) const {
+  if (!isa<ConcreteInt>(this))
+    return InvalidValue();
+    
+  APSInt V = cast<ConcreteInt>(this)->getValue();
+  QualType T = CastExpr->getType();
+  V.setIsUnsigned(T->isUnsignedIntegerType());
+  V.extOrTrunc(ValMgr.getContext().getTypeSize(T, CastExpr->getLocStart()));
+  
+  if (CastExpr->getType()->isPointerType())
+    return ConcreteIntLValue(ValMgr.getValue(V));
+  else
+    return ConcreteInt(ValMgr.getValue(V));
+}
 
 //===----------------------------------------------------------------------===//
 // Transfer function dispatch for Non-LValues.
 //===----------------------------------------------------------------------===//
 
-RValue RValue::Cast(ValueManager& ValMgr, Expr* CastExpr) const {
-  switch (getSubKind()) {
-    case ConcreteIntKind:
-      return cast<ConcreteInt>(this)->Cast(ValMgr, CastExpr);
-    default:
-      return InvalidValue();
-  }
-}
-
 NonLValue NonLValue::UnaryMinus(ValueManager& ValMgr, UnaryOperator* U) const {
   switch (getSubKind()) {
     case ConcreteIntKind:
@@ -162,6 +198,13 @@
     default:
       assert(false && "EQ not implemented for this LValue.");
       return cast<NonLValue>(InvalidValue());
+    
+    case ConcreteIntLValueKind: {
+      bool b = cast<ConcreteIntLValue>(this)->getValue() ==
+               cast<ConcreteIntLValue>(RHS).getValue();
+            
+      return NonLValue::GetIntTruthValue(ValMgr, b);
+    }
       
     case LValueDeclKind: {
       bool b = cast<LValueDecl>(*this) == cast<LValueDecl>(RHS);
@@ -179,6 +222,13 @@
       assert(false && "EQ not implemented for this LValue.");
       return cast<NonLValue>(InvalidValue());
       
+    case ConcreteIntLValueKind: {
+      bool b = cast<ConcreteIntLValue>(this)->getValue() !=
+               cast<ConcreteIntLValue>(RHS).getValue();
+      
+      return NonLValue::GetIntTruthValue(ValMgr, b);
+    }  
+      
     case LValueDeclKind: {
       bool b = cast<LValueDecl>(*this) != cast<LValueDecl>(RHS);
       return NonLValue::GetIntTruthValue(ValMgr, b);
@@ -255,7 +305,12 @@
 }
 
 void LValue::print(std::ostream& Out) const {
-  switch (getSubKind()) {  
+  switch (getSubKind()) {        
+    case ConcreteIntLValueKind:
+      Out << cast<ConcreteIntLValue>(this)->getValue().toString() 
+          << " (LValue)";
+      break;
+      
     case SymbolicLValueKind:
       Out << '$' << cast<SymbolicLValue>(this)->getSymbolID();
       break;