]> granicus.if.org Git - clang/commitdiff
Added preliminary transfer function support for references.
authorTed Kremenek <kremenek@apple.com>
Tue, 4 Mar 2008 22:16:08 +0000 (22:16 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 4 Mar 2008 22:16:08 +0000 (22:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47912 91177308-0d34-0410-b5e6-96231b3b80d8

Analysis/GRExprEngine.cpp
Analysis/GRSimpleVals.cpp

index e7f6f778595bb309471e2caf6727ade44d1c9e8d..a011e7b36024cf541fc0a734fcc6085416cf8c44 100644 (file)
@@ -598,10 +598,13 @@ void GRExprEngine::VisitCall(CallExpr* CE, NodeTy* Pred,
 void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
   
   NodeSet S1;
-  Visit(Ex, Pred, S1);
-
   QualType T = CastE->getType();
   
+  if (T->isReferenceType())
+    VisitLVal(Ex, Pred, S1);
+  else
+    Visit(Ex, Pred, S1);
+  
   // Check for redundant casts or casting to "void"
   if (T->isVoidType() ||
       Ex->getType() == T || 
@@ -616,7 +619,9 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
   for (NodeSet::iterator I1 = S1.begin(), E1 = S1.end(); I1 != E1; ++I1) {
     NodeTy* N = *I1;
     ValueState* St = N->getState();
-    RVal V = GetRVal(St, Ex);
+    
+    RVal V = T->isReferenceType() ? GetLVal(St, Ex) : GetRVal(St, Ex);
+    
     Nodify(Dst, CastE, N, SetRVal(St, CastE, EvalCast(V, CastE->getType())));
   }
 }
index a28ff1cf59bcca42977ef827dd5cfba4a1b34ad0..fbaccba94f79ec71d840f6baf84c3ddb6dde6482 100644 (file)
@@ -172,7 +172,7 @@ RVal GRSimpleVals::EvalCast(ValueManager& ValMgr, NonLVal X, QualType T) {
 
 RVal GRSimpleVals::EvalCast(ValueManager& ValMgr, LVal X, QualType T) {
   
-  if (T->isPointerType())
+  if (T->isPointerType() || T->isReferenceType())
     return X;
   
   assert (T->isIntegerType());