default:
// Cases we intentionally have "default" handle:
- // AddrLabelExpr, CharacterLiteral, IntegerLiteral
+ // AddrLabelExpr
Dst.Add(Pred); // No-op. Simply propagate the current state unchanged.
break;
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);
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);
// 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));
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