Skip to content

Commit

Permalink
Add default TR_ASSERTs to enum switch statements
Browse files Browse the repository at this point in the history
There are some switch statements on enum classes in
ControlFlowEvaluator.cpp that were previously missing default cases.
While these switches are exhaustive, the way enum classes work in C++
means that technically any int can be used, so default cases are needed
to make sure that such errors are caught.

Signed-off-by: Ben Thomas <ben@benthomas.ca>
  • Loading branch information
aviansie-ben committed Sep 11, 2020
1 parent bc037b1 commit d1e6b9e
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions compiler/p/codegen/ControlFlowEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ CRCompareCondition compareConditionInCR(CompareCondition cond)
return CRCompareCondition(TR::RealRegister::CRCC_GT, false);
case CompareCondition::le:
return CRCompareCondition(TR::RealRegister::CRCC_GT, true);
default:
TR_ASSERT_FATAL(false, "Invalid CompareCondition %d", static_cast<int>(cond));
}
}

Expand Down Expand Up @@ -162,6 +164,8 @@ CompareCondition reverseCondition(CompareCondition cond)
return CompareCondition::le;
case CompareCondition::le:
return CompareCondition::gt;
default:
TR_ASSERT_FATAL(false, "Invalid CompareCondition %d", static_cast<int>(cond));
}
}

Expand Down Expand Up @@ -192,6 +196,8 @@ CompareCondition flipConditionOrder(CompareCondition cond)
return CompareCondition::lt;
case CompareCondition::le:
return CompareCondition::ge;
default:
TR_ASSERT_FATAL(false, "Invalid CompareCondition %d", static_cast<int>(cond));
}
}

Expand Down Expand Up @@ -222,6 +228,8 @@ TR::InstOpCode::Mnemonic compareConditionToBranch(CompareCondition cond)
return TR::InstOpCode::bgt;
case CompareCondition::le:
return TR::InstOpCode::ble;
default:
TR_ASSERT_FATAL(false, "Invalid CompareCondition %d", static_cast<int>(cond));
}
}

Expand Down Expand Up @@ -598,6 +606,9 @@ CompareCondition evaluateDualIntCompareToConditionRegister(
generateTrg1Src2ImmInstruction(cg, TR::InstOpCode::cror, node, condReg, condReg2, condReg,
(TR::RealRegister::CRCC_EQ << TR::RealRegister::pos_RT) | (TR::RealRegister::CRCC_EQ << TR::RealRegister::pos_RA) | (TR::RealRegister::CRCC_LT << TR::RealRegister::pos_RB));
break;

default:
TR_ASSERT_FATAL(false, "Invalid CompareCondition %d", static_cast<int>(compareInfo.cond));
}

cg->stopUsingRegister(condReg2);
Expand Down

0 comments on commit d1e6b9e

Please sign in to comment.