mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 11:38:21 +02:00
More fixes for switch unreachable
This commit is contained in:
parent
748f7b8e49
commit
d40f7fa759
2 changed files with 13 additions and 14 deletions
|
@ -4040,10 +4040,9 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
|
|||
}
|
||||
|
||||
defaultBlock = mBfIRBuilder->CreateBlock("default");
|
||||
if (switchStmt->mDefaultCase != NULL)
|
||||
{
|
||||
bool hasDefaultCase = switchStmt->mDefaultCase != NULL;
|
||||
if (hasDefaultCase)
|
||||
blocks.push_back(defaultBlock);
|
||||
}
|
||||
|
||||
SizedArray<BfDeferredLocalAssignData, 8> deferredLocalAssignDataVec;
|
||||
deferredLocalAssignDataVec.resize(blocks.size());
|
||||
|
@ -4585,7 +4584,13 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
|
|||
mBfIRBuilder->AddBlock(defaultBlock);
|
||||
mBfIRBuilder->SetInsertPoint(defaultBlock);
|
||||
if (isComprehensive)
|
||||
{
|
||||
mBfIRBuilder->CreateUnreachable();
|
||||
//TODO: This masks a bug in our backend
|
||||
if (IsTargetingBeefBackend())
|
||||
mBfIRBuilder->CreateBr(endBlock);
|
||||
}
|
||||
else
|
||||
mBfIRBuilder->CreateBr(endBlock);
|
||||
}
|
||||
|
||||
|
@ -4601,12 +4606,6 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
|
|||
if (deferredLocalAssignData->mHadFallthrough)
|
||||
continue;
|
||||
|
||||
// if ((deferredLocalAssignData->mHadFallthrough) && (blockIdx < (int)blocks.size() - 1))
|
||||
// {
|
||||
// auto nextDeferredLocalAssignData = &deferredLocalAssignDataVec[blockIdx + 1];
|
||||
// deferredLocalAssignData->SetUnion(*nextDeferredLocalAssignData);
|
||||
// }
|
||||
|
||||
if (mergedDeferredLocalAssignData == NULL)
|
||||
mergedDeferredLocalAssignData = deferredLocalAssignData;
|
||||
else
|
||||
|
@ -4618,12 +4617,12 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
|
|||
}
|
||||
|
||||
if ((caseCount > 0) && (allHadReturns) &&
|
||||
((defaultBlock != endBlock) || (isComprehensive)))
|
||||
((hasDefaultCase) || (isComprehensive)))
|
||||
{
|
||||
mCurMethodState->SetHadReturn(true);
|
||||
mCurMethodState->mLeftBlockUncond = true;
|
||||
|
||||
if ((defaultBlock != endBlock) && (switchStmt->mDefaultCase != NULL))
|
||||
if ((!hasDefaultCase) && (!isComprehensive))
|
||||
mBfIRBuilder->DeleteBlock(endBlock);
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue