]> granicus.if.org Git - clang/commitdiff
Fixed more caching bugs related to the one fixed in r49914. Silence
authorTed Kremenek <kremenek@apple.com>
Fri, 18 Apr 2008 20:35:30 +0000 (20:35 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 18 Apr 2008 20:35:30 +0000 (20:35 +0000)
compiler warning introduced by a recent patch of mine.

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

include/clang/Analysis/PathSensitive/GRCoreEngine.h
lib/Analysis/GRCoreEngine.cpp
lib/Analysis/GRExprEngine.cpp

index 61f73093fc1976689fb3657c50bcf1cfbfa5cc04..d4074af5a9a3f6e59fb8972dbc1a27468cfba566 100644 (file)
@@ -126,8 +126,6 @@ class GRStmtNodeBuilderImpl {
   const unsigned Idx;
   ExplodedNodeImpl* Pred;
   ExplodedNodeImpl* LastNode;  
-  bool HasGeneratedNode;
-  bool Populated;
   
   typedef llvm::SmallPtrSet<ExplodedNodeImpl*,5> DeferredTy;
   DeferredTy Deferred;
@@ -164,8 +162,6 @@ public:
   Stmt* getStmt() const { return B[Idx]; }
   
   CFGBlock* getBlock() const { return &B; }
-  
-  bool hasGeneratedNode() const { return HasGeneratedNode; }
 };
   
   
@@ -183,13 +179,12 @@ class GRStmtNodeBuilder  {
 public:
   GRStmtNodeBuilder(GRStmtNodeBuilderImpl& nb) : NB(nb),
     CallExprAuditBeg(0), CallExprAuditEnd(0),
-    ObjCMsgExprAuditBeg(0), ObjCMsgExprAuditEnd(0),  BuildSinks(false) {
+    ObjCMsgExprAuditBeg(0), ObjCMsgExprAuditEnd(0),
+    BuildSinks(false), HasGeneratedNode(false) {
       
     CleanedState = getLastNode()->getState();
   }
   
-  bool hasGeneratedNode() const { return NB.hasGeneratedNode(); }
-  
   void setObjCMsgExprAuditors(GRAuditor<StateTy> **B,
                               GRAuditor<StateTy> **E) {
     ObjCMsgExprAuditBeg = B;
@@ -207,10 +202,12 @@ public:
   }
   
   NodeTy* generateNode(Stmt* S, StateTy* St, NodeTy* Pred) {
+    HasGeneratedNode = true;
     return static_cast<NodeTy*>(NB.generateNodeImpl(S, St, Pred));
   }
   
   NodeTy* generateNode(Stmt* S, StateTy* St) {
+    HasGeneratedNode = true;
     return static_cast<NodeTy*>(NB.generateNodeImpl(S, St));    
   }
   
@@ -275,7 +272,8 @@ public:
     return N;
   }
   
-  bool BuildSinks;  
+  bool BuildSinks;
+  bool HasGeneratedNode;
 };
   
 class GRBranchNodeBuilderImpl {
index 7ad7f73abf75acb4dd93fe00382c26c4ccc40adb..c2b8c115fdb17ce46ffee29def61f35538f2688b 100644 (file)
@@ -286,7 +286,7 @@ void GRCoreEngineImpl::GenerateNode(const ProgramPoint& Loc, void* State,
 
 GRStmtNodeBuilderImpl::GRStmtNodeBuilderImpl(CFGBlock* b, unsigned idx,
                                      ExplodedNodeImpl* N, GRCoreEngineImpl* e)
-  : Eng(*e), B(*b), Idx(idx), Pred(N), LastNode(N), Populated(false) {
+  : Eng(*e), B(*b), Idx(idx), Pred(N), LastNode(N) {
   Deferred.insert(N);
 }
 
@@ -324,8 +324,6 @@ ExplodedNodeImpl* GRStmtNodeBuilderImpl::generateNodeImpl(Stmt* S, void* State,
   N->addPredecessor(Pred);
   Deferred.erase(Pred);
   
-  HasGeneratedNode = true;
-  
   if (IsNew) {
     Deferred.insert(N);
     LastNode = N;
index 2e474fc8e9a3d48ebd597dec0492ed3fae0f4789..8c771bffa14baa232a85257f15aa2c0bd9647374 100644 (file)
@@ -188,7 +188,7 @@ void GRExprEngine::ProcessStmt(Stmt* S, StmtNodeBuilder& builder) {
   // dead mappings removed.
   
   if (Dst.size() == 1 && *Dst.begin() == StmtEntryNode && 
-      !Builder->hasGeneratedNode())
+      !Builder->HasGeneratedNode)
     builder.generateNode(S, GetState(StmtEntryNode), StmtEntryNode);
   
   // NULL out these variables to cleanup.
@@ -715,7 +715,11 @@ void GRExprEngine::EvalStore(NodeSet& Dst, Expr* E, NodeTy* Pred,
   assert (Builder && "GRStmtNodeBuilder must be defined.");
   
   unsigned size = Dst.size();  
-  SaveAndRestore<bool> OldSink(Builder->BuildSinks);
+
+  SaveAndRestore<bool> OldSink(Builder->BuildSinks),
+                       OldHasGen(Builder->HasGeneratedNode);
+
+  Builder->HasGeneratedNode = false;
   
   assert (!TargetLV.isUndef());
   
@@ -724,7 +728,7 @@ void GRExprEngine::EvalStore(NodeSet& Dst, Expr* E, NodeTy* Pred,
   // Handle the case where no nodes where generated.  Auto-generate that
   // contains the updated state if we aren't generating sinks.
   
-  if (!Builder->BuildSinks && Dst.size() == size)
+  if (!Builder->BuildSinks && Dst.size() == size && !Builder->HasGeneratedNode)
     TF->GRTransferFuncs::EvalStore(Dst, *this, *Builder, E, Pred, St,
                                    TargetLV, Val);
 }
@@ -888,14 +892,18 @@ void GRExprEngine::VisitCall(CallExpr* CE, NodeTy* Pred,
       
       unsigned size = Dst.size();
       
-      SaveAndRestore<bool> OldSink(Builder->BuildSinks);
+      SaveAndRestore<bool> OldSink(Builder->BuildSinks),
+                           OldHasGen(Builder->HasGeneratedNode);
       
+      Builder->HasGeneratedNode = false;
+
       EvalCall(Dst, CE, cast<LVal>(L), *DI);
       
       // Handle the case where no nodes where generated.  Auto-generate that
       // contains the updated state if we aren't generating sinks.
       
-      if (!Builder->BuildSinks && Dst.size() == size)
+      if (!Builder->BuildSinks && Dst.size() == size &&
+          !Builder->HasGeneratedNode)
         MakeNode(Dst, CE, *DI, St);
     }
   }
@@ -991,14 +999,18 @@ void GRExprEngine::VisitObjCMessageExprDispatchHelper(ObjCMessageExpr* ME,
   // Dispatch to plug-in transfer function.
   
   unsigned size = Dst.size();
-  SaveAndRestore<bool> OldSink(Builder->BuildSinks);
+
+  SaveAndRestore<bool> OldSink(Builder->BuildSinks),
+                       OldHasGen(Builder->HasGeneratedNode);
   
+  Builder->HasGeneratedNode = false;
   EvalObjCMessageExpr(Dst, ME, Pred);
   
   // Handle the case where no nodes where generated.  Auto-generate that
   // contains the updated state if we aren't generating sinks.
   
-  if (!Builder->BuildSinks && Dst.size() == size)
+  if (!Builder->BuildSinks && Dst.size() == size && !Builder->HasGeneratedNode)
     MakeNode(Dst, ME, Pred, St);
 }
 
@@ -1461,14 +1473,17 @@ void GRExprEngine::EvalReturn(NodeSet& Dst, ReturnStmt* S, NodeTy* Pred) {
   assert (Builder && "GRStmtNodeBuilder must be defined.");
   
   unsigned size = Dst.size();  
-  SaveAndRestore<bool> OldSink(Builder->BuildSinks);
+
+  SaveAndRestore<bool> OldSink(Builder->BuildSinks),
+                       OldHasGen(Builder->HasGeneratedNode);
   
+  Builder->HasGeneratedNode = false;
+
   TF->EvalReturn(Dst, *this, *Builder, S, Pred);
   
-  // Handle the case where no nodes where generated.  Auto-generate that
-  // contains the updated state if we aren't generating sinks.
+  // Handle the case where no nodes where generated.
   
-  if (!Builder->BuildSinks && Dst.size() == size)
+  if (!Builder->BuildSinks && Dst.size() == size && !Builder->HasGeneratedNode)
     MakeNode(Dst, S, Pred, GetState(Pred));
 }