diff options
-rw-r--r-- | Analysis/GRExprEngine.cpp | 27 | ||||
-rw-r--r-- | Analysis/ValueState.cpp | 3 |
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 |