]> granicus.if.org Git - clang/commitdiff
Fixed analyzer caching bug in DeclStmt.
authorTed Kremenek <kremenek@apple.com>
Thu, 28 Aug 2008 18:34:26 +0000 (18:34 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 28 Aug 2008 18:34:26 +0000 (18:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55487 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 69a5c45a31a80427ead45e95ac735504950a7d71..7cd345d2338db208a40e962edcaa28e8b4c1aa4a 100644 (file)
@@ -494,9 +494,6 @@ protected:
   /// VisitDeclStmt - Transfer function logic for DeclStmts.
   void VisitDeclStmt(DeclStmt* DS, NodeTy* Pred, NodeSet& Dst); 
   
-  void VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
-                        NodeTy* Pred, NodeSet& Dst);
-  
   /// VisitGuardedExpr - Transfer function logic for ?, __builtin_choose
   void VisitGuardedExpr(Expr* Ex, Expr* L, Expr* R, NodeTy* Pred, NodeSet& Dst);
   
index c92093cf0039ea731fc5fcb8421c2cfeb82a0bd6..75ba46051ffd9af1e3735ed6f44453dcf67471f2 100644 (file)
@@ -1452,25 +1452,19 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
 }
 
 void GRExprEngine::VisitDeclStmt(DeclStmt* DS, NodeTy* Pred, NodeSet& Dst) {  
-  VisitDeclStmtAux(DS, DS->getDecl(), Pred, Dst);
-}
-
-void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
-                                    NodeTy* Pred, NodeSet& Dst) {
 
-  if (!D)
-    return;
+  // The CFG has one DeclStmt per Decl, so we don't need to walk the 
+  // Decl chain.
+  
+  ScopedDecl* D = DS->getDecl();
   
-  if (!isa<VarDecl>(D)) {
-    VisitDeclStmtAux(DS, D->getNextDeclarator(), Pred, Dst);
+  if (!D || !isa<VarDecl>(D))
     return;
-  }
   
   const VarDecl* VD = dyn_cast<VarDecl>(D);
   
   // FIXME: Add support for local arrays.
   if (VD->getType()->isArrayType()) {
-    VisitDeclStmtAux(DS, D->getNextDeclarator(), Pred, Dst);
     return;
   }
   
@@ -1480,21 +1474,16 @@ void GRExprEngine::VisitDeclStmtAux(DeclStmt* DS, ScopedDecl* D,
   //  time a function is called those values may not be current.
   NodeSet Tmp;
 
-  if (Ex) Visit(Ex, Pred, Tmp);
-  if (Tmp.empty()) Tmp.Add(Pred);
+  if (Ex)
+    Visit(Ex, Pred, Tmp);
+
+  if (Tmp.empty())
+    Tmp.Add(Pred);
   
   for (NodeSet::iterator I=Tmp.begin(), E=Tmp.end(); I!=E; ++I) {
     const GRState* St = GetState(*I);
     St = StateMgr.AddDecl(St, VD, Ex, Builder->getCurrentBlockCount());
-    
-    // Create a new node.  We don't really need to create a new NodeSet
-    // here, but it simplifies things and doesn't cost much.
-    NodeSet Tmp2;    
-    MakeNode(Tmp2, DS, *I, St);
-    if (Tmp2.empty()) Tmp2.Add(*I);
-    
-    for (NodeSet::iterator I2=Tmp2.begin(), E2=Tmp2.end(); I2!=E2; ++I2)
-      VisitDeclStmtAux(DS, D->getNextDeclarator(), *I2, Dst);
+    MakeNode(Dst, DS, *I, St);
   }
 }