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

Fixed issue with return from unscoped block in string interpolation

This commit is contained in:
Brian Fiete 2022-01-29 15:02:19 -05:00
parent 8cccec20fa
commit c2a2cf221a
2 changed files with 11 additions and 4 deletions

View file

@ -1034,6 +1034,7 @@ public:
bool mNoBind; bool mNoBind;
bool mInConditionalBlock; // IE: RHS of ((A) && (B)), indicates an allocation in 'B' won't be dominated by a dtor, for example bool mInConditionalBlock; // IE: RHS of ((A) && (B)), indicates an allocation in 'B' won't be dominated by a dtor, for example
bool mAllowUinitReads; bool mAllowUinitReads;
bool mDisableReturns;
bool mCancelledDeferredCall; bool mCancelledDeferredCall;
bool mNoObjectAccessChecks; bool mNoObjectAccessChecks;
bool mHadIgnoredError; bool mHadIgnoredError;
@ -1060,7 +1061,7 @@ public:
mHadReturn = false; mHadReturn = false;
mLeftBlockUncond = false; mLeftBlockUncond = false;
mLeftBlockCond = false; mLeftBlockCond = false;
mHadContinue = false; mHadContinue = false;
mMayNeedThisAccessCheck = false; mMayNeedThisAccessCheck = false;
mTempKind = TempKind_None; mTempKind = TempKind_None;
mInHeadScope = true; mInHeadScope = true;
@ -1071,8 +1072,9 @@ public:
mNoBind = false; mNoBind = false;
mIgnoreObjectAccessCheck = false; mIgnoreObjectAccessCheck = false;
mDisableChecks = false; mDisableChecks = false;
mInConditionalBlock = false; mInConditionalBlock = false;
mAllowUinitReads = false; mAllowUinitReads = false;
mDisableReturns = false;
mCancelledDeferredCall = false; mCancelledDeferredCall = false;
mNoObjectAccessChecks = false; mNoObjectAccessChecks = false;
mInDeferredBlock = false; mInDeferredBlock = false;

View file

@ -3143,7 +3143,7 @@ void BfModule::VisitEmbeddedStatement(BfAstNode* stmt, BfExprEvaluator* exprEval
if ((flags & BfEmbeddedStatementFlags_Unscoped) != 0) if ((flags & BfEmbeddedStatementFlags_Unscoped) != 0)
{ {
SetAndRestoreValue<BfExprEvaluator*> prevExprEvaluator(mCurMethodState->mCurScope->mExprEvaluator, exprEvaluator); SetAndRestoreValue<BfExprEvaluator*> prevExprEvaluator(mCurMethodState->mCurScope->mExprEvaluator, exprEvaluator);
SetAndRestoreValue<bool> prevAllowReturn(mCurMethodState->mDisableReturns, true);
VisitCodeBlock(block); VisitCodeBlock(block);
} }
else if (mCurMethodState != NULL) else if (mCurMethodState != NULL)
@ -4983,9 +4983,14 @@ static int gRetIdx = 0;
void BfModule::Visit(BfReturnStatement* returnStmt) void BfModule::Visit(BfReturnStatement* returnStmt)
{ {
if (mCurMethodInstance == NULL) if ((mCurMethodInstance == NULL) || (mCurMethodState->mDisableReturns))
{ {
Fail("Unexpected return", returnStmt); Fail("Unexpected return", returnStmt);
if (returnStmt->mExpression != NULL)
{
BfExprEvaluator exprEvaluator(this);
CreateValueFromExpression(exprEvaluator, returnStmt->mExpression);
}
return; return;
} }