aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Analysis/GRExprEngine.cpp27
-rw-r--r--Analysis/ValueState.cpp3
2 files changed, 28 insertions, 2 deletions
diff --git a/Analysis/GRExprEngine.cpp b/Analysis/GRExprEngine.cpp
index 4ea7819497..8df9e5f305 100644
--- a/Analysis/GRExprEngine.cpp
+++ b/Analysis/GRExprEngine.cpp
@@ -839,7 +839,7 @@ void GRExprEngine::Visit(Stmt* S, NodeTy* Pred, NodeSet& Dst) {
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 @@ void GRExprEngine::Visit(Stmt* S, NodeTy* Pred, NodeSet& Dst) {
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 @@ void GRExprEngine::Visit(Stmt* S, NodeTy* Pred, NodeSet& Dst) {
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);
diff --git a/Analysis/ValueState.cpp b/Analysis/ValueState.cpp
index 0f29def4a0..963864662a 100644
--- a/Analysis/ValueState.cpp
+++ b/Analysis/ValueState.cpp
@@ -232,7 +232,7 @@ RValue ValueStateManager::GetValue(ValueState St, Expr* E, bool* hasVal) {
// 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 @@ RValue ValueStateManager::GetValue(ValueState St, Expr* E, bool* hasVal) {
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