- fixed: The CheckReturn check for FxSwitchStatement was not strict enough.

It may only return true if there is no default case because without that any non-matching value will go past the statement.
This commit is contained in:
Christoph Oelckers 2017-01-05 11:39:29 +01:00
parent e13627e9d8
commit b74c374a66

View file

@ -8926,15 +8926,20 @@ ExpEmit FxSwitchStatement::Emit(VMFunctionBuilder *build)
bool FxSwitchStatement::CheckReturn()
{
//A switch statement returns when it contains no breaks and ends with a return
bool founddefault = false;
//A switch statement returns when it contains a no breaks, a default case, and ends with a return
for (auto line : Content)
{
if (line->ExprType == EFX_JumpStatement)
{
return false; // Break means that the end of the statement will be reached, Continue cannot happen in the last statement of the last block.
}
else if (line->ExprType == EFX_CaseStatement)
{
if (static_cast<FxCaseStatement*>(line)->Condition == nullptr) founddefault = true;
}
}
return Content.Size() > 0 && Content.Last()->CheckReturn();
return founddefault && Content.Size() > 0 && Content.Last()->CheckReturn();
}
//==========================================================================