diff --git a/IDE/Tests/CompileFail001/src/Cases.bf b/IDE/Tests/CompileFail001/src/Cases.bf index 786aa0b6..cdceee31 100644 --- a/IDE/Tests/CompileFail001/src/Cases.bf +++ b/IDE/Tests/CompileFail001/src/Cases.bf @@ -21,5 +21,29 @@ namespace IDETest int a = val1; //FAIL } } + + int Switch1(Result res) + { + switch (res) + { + case .Ok(let a): + fallthrough; + case .Err(let b): //FAIL + return 1; + } + } + + int Switch2(Result res) + { + switch (res) + { + case .Ok(let a): + if (a > 0) + return 2; + fallthrough; + case .Err: + return 1; + } + } //FAIL } } diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 970a60d4..52975080 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -3621,6 +3621,8 @@ void BfModule::DoIfStatement(BfIfStatement* ifStmt, bool includeTrueStmt, bool i VisitEmbeddedStatement(ifStmt->mTrueStatement); } prevDLA.Restore(); + if (mCurMethodState->mDeferredLocalAssignData != NULL) + mCurMethodState->mDeferredLocalAssignData->mLeftBlock = deferredLocalAssignData.mLeftBlock; bool trueHadReturn = mCurMethodState->mHadReturn; @@ -4365,6 +4367,14 @@ void BfModule::Visit(BfSwitchStatement* switchStmt) hadWhen = true; whenExpr = checkWhenExpr; } + + if (auto invocationExpr = BfNodeDynCast(caseExpr)) + { + if (prevHadFallthrough) + { + Fail("Destructuring cannot be used when the previous case contains a fallthrough", caseExpr); + } + } } BfIRBlock lastNotEqBlock; @@ -4664,7 +4674,8 @@ void BfModule::Visit(BfSwitchStatement* switchStmt) openedScope = false; deferredLocalAssignDataVec[blockIdx].mHadReturn = hadReturn; caseCount++; - if ((!hadReturn) && (!mCurMethodState->mDeferredLocalAssignData->mHadFallthrough)) + if ((!hadReturn) && + ((!mCurMethodState->mDeferredLocalAssignData->mHadFallthrough) || (mCurMethodState->mDeferredLocalAssignData->mLeftBlock))) allHadReturns = false; if (auto block = BfNodeDynCast(switchCase->mCodeBlock)) diff --git a/IDEHelper/Tests/src/Switches.bf b/IDEHelper/Tests/src/Switches.bf new file mode 100644 index 00000000..6648fefb --- /dev/null +++ b/IDEHelper/Tests/src/Switches.bf @@ -0,0 +1,18 @@ +using System; + +namespace Tests +{ + class Switches + { + int Switch0(Result res) + { + switch (res) + { + case .Ok(let a): + return 0; + case .Err(let b): + return 1; + } + } + } +}