GRExprEngine: When processing compound assignments, do a switch table lookup to get the non-compound opcode from the compound opcode instead of relying on the order of BinaryOperator::opcode values. This unbreaks the misc-ps.c test.

llvm-svn: 63991
This commit is contained in:
Ted Kremenek 2009-02-07 00:52:24 +00:00
parent 19179ad680
commit 5d7662cfe0
1 changed files with 13 additions and 6 deletions

View File

@ -2515,12 +2515,19 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B,
assert (B->isCompoundAssignmentOp());
if (Op >= BinaryOperator::AndAssign) {
Op = (BinaryOperator::Opcode) (Op - (BinaryOperator::AndAssign -
BinaryOperator::And));
}
else {
Op = (BinaryOperator::Opcode) (Op - BinaryOperator::MulAssign);
switch (Op) {
default:
assert(0 && "Invalid opcode for compound assignment.");
case BinaryOperator::MulAssign: Op = BinaryOperator::Mul; break;
case BinaryOperator::DivAssign: Op = BinaryOperator::Div; break;
case BinaryOperator::RemAssign: Op = BinaryOperator::Rem; break;
case BinaryOperator::AddAssign: Op = BinaryOperator::Add; break;
case BinaryOperator::SubAssign: Op = BinaryOperator::Sub; break;
case BinaryOperator::ShlAssign: Op = BinaryOperator::Shl; break;
case BinaryOperator::ShrAssign: Op = BinaryOperator::Shr; break;
case BinaryOperator::AndAssign: Op = BinaryOperator::And; break;
case BinaryOperator::XorAssign: Op = BinaryOperator::Xor; break;
case BinaryOperator::OrAssign: Op = BinaryOperator::Or; break;
}
// Perform a load (the LHS). This performs the checks for