[cfe-commits] r47299 - in /cfe/trunk/Analysis: GRExprEngine.cpp ValueState.cpp

Ted Kremenek kremenek at apple.com
Mon Feb 18 18:01:17 PST 2008


Author: kremenek
Date: Mon Feb 18 20:01:16 2008
New Revision: 47299

URL: http://llvm.org/viewvc/llvm-project?rev=47299&view=rev
Log:
Added back explicit state/node creation when visiting IntegerLiterals and
CharacterLiterals.  This may not be a permanent solution; it doesn't cost that
much, however, to create a few additional states, and solves a whole bunch
of edge cases when handling ?, ||, and &&.

Modified:
    cfe/trunk/Analysis/GRExprEngine.cpp
    cfe/trunk/Analysis/ValueState.cpp

Modified: cfe/trunk/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRExprEngine.cpp?rev=47299&r1=47298&r2=47299&view=diff

==============================================================================
--- cfe/trunk/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/Analysis/GRExprEngine.cpp Mon Feb 18 20:01:16 2008
@@ -839,7 +839,7 @@
       
     default:
       // Cases we intentionally have "default" handle:
-      //   AddrLabelExpr, CharacterLiteral, IntegerLiteral
+      //   AddrLabelExpr
       
       Dst.Add(Pred); // No-op. Simply propagate the current state unchanged.
       break;
@@ -873,6 +873,19 @@
       break;
     }
       
+      // While explicitly creating a node+state for visiting a CharacterLiteral
+      // seems wasteful, it also solves a bunch of problems when handling
+      // the ?, &&, and ||.
+      
+    case Stmt::CharacterLiteralClass: {
+      CharacterLiteral* C = cast<CharacterLiteral>(S);
+      StateTy St = Pred->getState();
+      NonLValue X = NonLValue::GetValue(ValMgr, C->getValue(), C->getType(),
+                                        C->getLoc());
+      Nodify(Dst, C, Pred, SetValue(St, C, X));
+      break;      
+    }
+      
     case Stmt::ChooseExprClass: { // __builtin_choose_expr
       ChooseExpr* C = cast<ChooseExpr>(S);
       VisitGuardedExpr(C, C->getLHS(), C->getRHS(), Pred, Dst);
@@ -897,6 +910,18 @@
       VisitDeclStmt(cast<DeclStmt>(S), Pred, Dst);
       break;
       
+      // While explicitly creating a node+state for visiting an IntegerLiteral
+      // seems wasteful, it also solves a bunch of problems when handling
+      // the ?, &&, and ||.
+      
+    case Stmt::IntegerLiteralClass: {      
+      StateTy St = Pred->getState();
+      IntegerLiteral* I = cast<IntegerLiteral>(S);
+      NonLValue X = NonLValue::GetValue(ValMgr, I);
+      Nodify(Dst, I, Pred, SetValue(St, I, X));
+      break;      
+    }
+      
     case Stmt::ImplicitCastExprClass: {
       ImplicitCastExpr* C = cast<ImplicitCastExpr>(S);
       VisitCast(C, C->getSubExpr(), Pred, Dst);

Modified: cfe/trunk/Analysis/ValueState.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/ValueState.cpp?rev=47299&r1=47298&r2=47299&view=diff

==============================================================================
--- cfe/trunk/Analysis/ValueState.cpp (original)
+++ cfe/trunk/Analysis/ValueState.cpp Mon Feb 18 20:01:16 2008
@@ -232,7 +232,7 @@
         
         // Integer literals evaluate to an RValue.  Simply retrieve the
         // RValue for the literal.
-        
+#if 0        
       case Stmt::IntegerLiteralClass:
         return NonLValue::GetValue(ValMgr, cast<IntegerLiteral>(E));
         
@@ -242,6 +242,7 @@
         return NonLValue::GetValue(ValMgr, C->getValue(), C->getType(),
                                    C->getLoc());
       }
+#endif        
 
         // Casts where the source and target type are the same
         // are no-ops.  We blast through these to get the descendant





More information about the cfe-commits mailing list