diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index e6e42d4b..8f3f626a 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1034,6 +1034,7 @@ public: bool mNoBind; bool mInConditionalBlock; // IE: RHS of ((A) && (B)), indicates an allocation in 'B' won't be dominated by a dtor, for example bool mAllowUinitReads; + bool mDisableReturns; bool mCancelledDeferredCall; bool mNoObjectAccessChecks; bool mHadIgnoredError; @@ -1060,7 +1061,7 @@ public: mHadReturn = false; mLeftBlockUncond = false; mLeftBlockCond = false; - mHadContinue = false; + mHadContinue = false; mMayNeedThisAccessCheck = false; mTempKind = TempKind_None; mInHeadScope = true; @@ -1071,8 +1072,9 @@ public: mNoBind = false; mIgnoreObjectAccessCheck = false; mDisableChecks = false; - mInConditionalBlock = false; + mInConditionalBlock = false; mAllowUinitReads = false; + mDisableReturns = false; mCancelledDeferredCall = false; mNoObjectAccessChecks = false; mInDeferredBlock = false; diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 8d042c86..e29835a7 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -3143,7 +3143,7 @@ void BfModule::VisitEmbeddedStatement(BfAstNode* stmt, BfExprEvaluator* exprEval if ((flags & BfEmbeddedStatementFlags_Unscoped) != 0) { SetAndRestoreValue prevExprEvaluator(mCurMethodState->mCurScope->mExprEvaluator, exprEvaluator); - + SetAndRestoreValue prevAllowReturn(mCurMethodState->mDisableReturns, true); VisitCodeBlock(block); } else if (mCurMethodState != NULL) @@ -4983,9 +4983,14 @@ static int gRetIdx = 0; void BfModule::Visit(BfReturnStatement* returnStmt) { - if (mCurMethodInstance == NULL) + if ((mCurMethodInstance == NULL) || (mCurMethodState->mDisableReturns)) { Fail("Unexpected return", returnStmt); + if (returnStmt->mExpression != NULL) + { + BfExprEvaluator exprEvaluator(this); + CreateValueFromExpression(exprEvaluator, returnStmt->mExpression); + } return; }