if (isa<LValue>(V1)) {
// FIXME: Add support for RHS being a non-lvalue.
const LValue& L1 = cast<LValue>(V1);
- const LValue& L2 = cast<LValue>(V2);
- Nodify(Dst, B, N2, SetValue(St, B, EvalBinaryOp(ValMgr, Op, L1, L2)));
+ if (isa<LValue>(V2)) {
+ const LValue& L2 = cast<LValue>(V2);
+ Nodify(Dst, B, N2, SetValue(St, B,
+ EvalBinaryOp(ValMgr, Op, L1, L2)));
+ }
+ else {
+ const NonLValue& R2 = cast<NonLValue>(V2);
+ Nodify(Dst, B, N2, SetValue(St, B,
+ EvalBinaryOp(ValMgr, Op, L1, R2)));
+ }
}
else {
const NonLValue& R1 = cast<NonLValue>(V1);
}
}
+
+// Pointer arithmetic.
+
+LValue GRSimpleVals::EvalBinaryOp(ValueManager& ValMgr,
+ BinaryOperator::Opcode Op,
+ LValue LHS, NonLValue RHS) {
+ return cast<LValue>(UnknownVal());
+}
+
// Equality operators for LValues.
BinaryOperator::Opcode Op,
NonLValue LHS, NonLValue RHS);
+ // Pointer arithmetic.
+
+ virtual LValue EvalBinaryOp(ValueManager& ValMgr, BinaryOperator::Opcode Op,
+ LValue LHS, NonLValue RHS);
+
// Equality operators for LValues.
virtual NonLValue EvalEQ(ValueManager& ValMgr, LValue LHS, LValue RHS);
virtual NonLValue EvalNE(ValueManager& ValMgr, LValue LHS, LValue RHS);
LValue LHS, LValue RHS) {
return TF->EvalBinaryOp(ValMgr, Op, LHS, RHS);
}
+
+ inline RValue EvalBinaryOp(ValueManager& ValMgr, BinaryOperator::Opcode Op,
+ LValue LHS, NonLValue RHS) {
+ return TF->EvalBinaryOp(ValMgr, Op, LHS, RHS);
+ }
};
} // end clang namespace
\ No newline at end of file
BinaryOperator::Opcode Op,
LValue LHS, LValue RHS);
+
+ // Pointer arithmetic.
+
+ virtual LValue EvalBinaryOp(ValueManager& ValMgr, BinaryOperator::Opcode Op,
+ LValue LHS, NonLValue RHS) = 0;
+
// Equality operators for LValues.
virtual NonLValue EvalEQ(ValueManager& ValMgr, LValue LHS, LValue RHS) = 0;
virtual NonLValue EvalNE(ValueManager& ValMgr, LValue LHS, LValue RHS) = 0;