]> granicus.if.org Git - clang/commitdiff
Localize the special processing of array variable inside
authorZhongxing Xu <xuzhongxing@gmail.com>
Tue, 21 Oct 2008 06:54:23 +0000 (06:54 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Tue, 21 Oct 2008 06:54:23 +0000 (06:54 +0000)
GRExprEngine::VisitCast() so that other parts of the analyzer can be ignorant.
When we cast "array of type T" to "pointer to T", we get the loc::MemRegionVal
corresponding to the array variable. This is sufficient for BasicStore, but not
for RegionStore. RegionStore should get the element region for the first array
element in the cast. So next comes to the revamping of transfer functions for
different store model.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57897 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BasicStore.cpp
lib/Analysis/GRExprEngine.cpp

index c37db3664066574b9815eaca6ffd441e04c0a019..b42f210dd83df52f42fa2fed69ec8b7af644144f 100644 (file)
@@ -78,6 +78,7 @@ public:
 StoreManager* clang::CreateBasicStoreManager(GRStateManager& StMgr) {
   return new BasicStoreManager(StMgr);
 }
+
 SVal BasicStoreManager::getLValueVar(const GRState* St, const VarDecl* VD) {
   return loc::MemRegionVal(MRMgr.getVarRegion(VD));
 }
index 32c83669e328f3a14000e11ba46908b531eeb044..68f10b0d038ea762926ed35e999f10c28bc7dabf 100644 (file)
@@ -829,17 +829,6 @@ void GRExprEngine::VisitDeclRefExpr(DeclRefExpr* Ex, NodeTy* Pred, NodeSet& Dst,
 
     SVal V = StateMgr.GetLValue(St, VD);
 
-    if (VD->getType()->isArrayType()) {
-      // C++ standard says array of type T should be implicitly converted to
-      // pointer to type T in some cases. Currently we don't do this cast in
-      // VisitCast(), because BasicStore is not field sensitive. We shall do
-      // this in a transfer function in the future. We represent both lvalue and
-      // rvalue of array of type T as the corresponding MemRegionVal of it.
-
-      MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
-      return;
-    }
-    
     if (asLValue)
       MakeNode(Dst, Ex, Pred, SetSVal(St, Ex, V));
     else
@@ -1445,8 +1434,9 @@ void GRExprEngine::VisitObjCMessageExprDispatchHelper(ObjCMessageExpr* ME,
 void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
   NodeSet S1;
   QualType T = CastE->getType();
+  QualType ExTy = Ex->getType();
   
-  if (T->isReferenceType())
+  if (ExTy->isArrayType() || T->isReferenceType())
     VisitLValue(Ex, Pred, S1);
   else
     Visit(Ex, Pred, S1);
@@ -1464,8 +1454,6 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
   //   let the transfer function object be responsible for constructing
   //   nodes.
   
-  QualType ExTy = Ex->getType();
-  
   for (NodeSet::iterator I1 = S1.begin(), E1 = S1.end(); I1 != E1; ++I1) {
     NodeTy* N = *I1;
     const GRState* St = GetState(N);