]> granicus.if.org Git - clang/commitdiff
Basic support for C++ in BasicStore:
authorMarcin Swiderski <marcin.sfider@gmail.com>
Tue, 16 Nov 2010 07:15:33 +0000 (07:15 +0000)
committerMarcin Swiderski <marcin.sfider@gmail.com>
Tue, 16 Nov 2010 07:15:33 +0000 (07:15 +0000)
- CXXThisRegion treated like VarRegion and ObjCIVarRegion in various places,
- Reference treated like pointer in BindDeclInternal.

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

lib/Checker/BasicStore.cpp

index 5221ae3495fdbec38a8009752d5e7c326f4a909f..d3860235ec03033fc52425dfb7ab1b2ba46a5586 100644 (file)
@@ -11,6 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "clang/AST/DeclCXX.h"
 #include "clang/AST/ExprObjC.h"
 #include "clang/Analysis/Analyses/LiveVariables.h"
 #include "clang/Analysis/AnalysisContext.h"
@@ -179,7 +180,8 @@ SVal BasicStoreManager::Retrieve(Store store, Loc loc, QualType T) {
     case loc::MemRegionKind: {
       const MemRegion* R = cast<loc::MemRegionVal>(loc).getRegion();
 
-      if (!(isa<VarRegion>(R) || isa<ObjCIvarRegion>(R)))
+      if (!(isa<VarRegion>(R) || isa<ObjCIvarRegion>(R) ||
+          isa<CXXThisRegion>(R)))
         return UnknownVal();
 
       BindingsTy B = GetBindings(store);
@@ -231,7 +233,7 @@ Store BasicStoreManager::Bind(Store store, Loc loc, SVal V) {
         R = ER->getSuperRegion();
     }
 
-  if (!(isa<VarRegion>(R) || isa<ObjCIvarRegion>(R)))
+  if (!(isa<VarRegion>(R) || isa<ObjCIvarRegion>(R) || isa<CXXThisRegion>(R)))
     return store;
 
   const TypedRegion *TyR = cast<TypedRegion>(R);
@@ -263,7 +265,8 @@ Store BasicStoreManager::Remove(Store store, Loc loc) {
     case loc::MemRegionKind: {
       const MemRegion* R = cast<loc::MemRegionVal>(loc).getRegion();
 
-      if (!(isa<VarRegion>(R) || isa<ObjCIvarRegion>(R)))
+      if (!(isa<VarRegion>(R) || isa<ObjCIvarRegion>(R) ||
+          isa<CXXThisRegion>(R)))
         return store;
 
       return VBFactory.Remove(GetBindings(store), R).getRoot();
@@ -291,7 +294,8 @@ Store BasicStoreManager::RemoveDeadBindings(Store store,
         continue;
     }
     else if (isa<ObjCIvarRegion>(I.getKey()) ||
-             isa<NonStaticGlobalSpaceRegion>(I.getKey()))
+             isa<NonStaticGlobalSpaceRegion>(I.getKey()) ||
+             isa<CXXThisRegion>(I.getKey()))
       RegionRoots.push_back(I.getKey());
     else
       continue;
@@ -315,7 +319,7 @@ Store BasicStoreManager::RemoveDeadBindings(Store store,
         break;
       }
       else if (isa<VarRegion>(MR) || isa<ObjCIvarRegion>(MR) ||
-               isa<NonStaticGlobalSpaceRegion>(MR)) {
+               isa<NonStaticGlobalSpaceRegion>(MR) || isa<CXXThisRegion>(MR)) {
         if (Marked.count(MR))
           break;
 
@@ -463,7 +467,8 @@ Store BasicStoreManager::BindDeclInternal(Store store, const VarRegion* VR,
     // Process local scalar variables.
     QualType T = VD->getType();
     // BasicStore only supports scalars.
-    if (T->isScalarType() && ValMgr.getSymbolManager().canSymbolicate(T)) {
+    if ((T->isScalarType() || T->isReferenceType()) &&
+        ValMgr.getSymbolManager().canSymbolicate(T)) {
       SVal V = InitVal ? *InitVal : UndefinedVal();
       store = Bind(store, loc::MemRegionVal(VR), V);
     }