[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