1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00

Fixes for new out-var rules, unassigned variable detection

This commit is contained in:
Brian Fiete 2020-09-22 07:44:47 -07:00
parent 6878183873
commit fd3265445d
9 changed files with 56 additions and 30 deletions

View file

@ -5662,13 +5662,7 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt)
auto isLet = BfNodeDynCast<BfLetTypeReference>(forEachStmt->mVariableTypeRef) != 0;
auto isVar = BfNodeDynCast<BfVarTypeReference>(forEachStmt->mVariableTypeRef) != 0;
BfDeferredLocalAssignData deferredLocalAssignData(mCurMethodState->mCurScope);
deferredLocalAssignData.mIsIfCondition = true;
deferredLocalAssignData.ExtendFrom(mCurMethodState->mDeferredLocalAssignData, true);
deferredLocalAssignData.mVarIdBarrier = mCurMethodState->GetRootMethodState()->mCurLocalVarId;
SetAndRestoreValue<BfDeferredLocalAssignData*> prevDLA(mCurMethodState->mDeferredLocalAssignData, &deferredLocalAssignData);
BfTypedValue target;
BfType* varType = NULL;
bool didInference = false;
@ -5695,6 +5689,13 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt)
if (varType == NULL)
varType = GetPrimitiveType(BfTypeCode_IntPtr);
BfDeferredLocalAssignData deferredLocalAssignData(mCurMethodState->mCurScope);
deferredLocalAssignData.mIsIfCondition = true;
deferredLocalAssignData.ExtendFrom(mCurMethodState->mDeferredLocalAssignData, true);
deferredLocalAssignData.mVarIdBarrier = mCurMethodState->GetRootMethodState()->mCurLocalVarId;
SetAndRestoreValue<BfDeferredLocalAssignData*> prevDLA(mCurMethodState->mDeferredLocalAssignData, &deferredLocalAssignData);
deferredLocalAssignData.mIsIfCondition = false;
// The "extend chain" is only valid for the conditional -- since that expression may contain unconditionally executed and
@ -5813,6 +5814,18 @@ void BfModule::DoForLess(BfForEachStatement* forEachStmt)
mCurMethodState->SetHadReturn(false);
mCurMethodState->mLeftBlockUncond = false;
mCurMethodState->mLeftBlockCond = false;
bool definitelyExecuted = false;
if (target.mValue.IsConst())
{
auto constant = mBfIRBuilder->GetConstant(target.mValue);
if (constant->mInt32 > 0)
definitelyExecuted = true;
}
prevDLA.Restore();
if (definitelyExecuted)
mCurMethodState->ApplyDeferredLocalAssignData(deferredLocalAssignData);
RestoreScopeState();
}