]> granicus.if.org Git - clang/commitdiff
Fixed transfer function for casts to always evaluate the effects of the
authorTed Kremenek <kremenek@apple.com>
Tue, 19 Feb 2008 18:52:54 +0000 (18:52 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 19 Feb 2008 18:52:54 +0000 (18:52 +0000)
cast's subexpression even if the cast itself has no effect.

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

Analysis/GRExprEngine.cpp

index 6d45beab32771275612be5749f609a68ed6bf903..d1a0d4c59b0094b1131fabd5b219a55d28715fa9 100644 (file)
@@ -447,19 +447,22 @@ void GRExprEngine::VisitCall(CallExpr* CE, NodeTy* Pred,
 
 void GRExprEngine::VisitCast(Expr* CastE, Expr* E, NodeTy* Pred, NodeSet& Dst) {
   
-  QualType T = CastE->getType();
+  NodeSet S1;
+  Visit(E, Pred, S1);
 
+  QualType T = CastE->getType();
+  
   // Check for redundant casts or casting to "void"
   if (T->isVoidType() ||
       E->getType() == T || 
       (T->isPointerType() && E->getType()->isFunctionType())) {
-    Dst.Add(Pred);
+    
+    for (NodeSet::iterator I1=S1.begin(), E1=S1.end(); I1 != E1; ++I1)
+      Dst.Add(*I1);
+
     return;
   }
   
-  NodeSet S1;
-  Visit(E, Pred, S1);
-  
   for (NodeSet::iterator I1=S1.begin(), E1=S1.end(); I1 != E1; ++I1) {
     NodeTy* N = *I1;
     StateTy St = N->getState();