Forráskód Böngészése

Fixed break targeting switch label

Brian Fiete 10 hónapja
szülő
commit
908a76b92a

+ 1 - 1
IDEHelper/Compiler/BfModule.cpp

@@ -1942,7 +1942,7 @@ void BfModule::NewScopeState(bool createLexicalBlock, bool flushValueScope)
 		{
 			if (checkScope->mLabel == mCurMethodState->mCurScope->mLabel)
 			{
-				auto errorNode = Fail("Duplicate scope label", curScope->mLabelNode);
+				auto errorNode = Warn(0, StrFormat("Duplicate scope label '%s'", checkScope->mLabel.c_str()), curScope->mLabelNode);
 				if (errorNode != NULL)
 					mCompiler->mPassInstance->MoreInfo("See previous scope label", checkScope->mLabelNode);
 				break;

+ 1 - 0
IDEHelper/Compiler/BfStmtEvaluator.cpp

@@ -5171,6 +5171,7 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
 			caseScopeData.mIsSharedTempBlock = true;
 			mCurMethodState->AddScope(&caseScopeData);
 			NewScopeState();
+			caseScopeData.mLabel = newScope.mLabel;
 
 			bool hadReturn = false;
 			VisitCodeBlock(switchCase->mCodeBlock, BfIRBlock(), endBlock, BfIRBlock(), true, &hadReturn, switchStmt->mLabelNode);

+ 23 - 0
IDEHelper/Tests/src/Switches.bf

@@ -1,3 +1,5 @@
+#pragma warning disable 168
+
 using System;
 
 namespace Tests
@@ -42,6 +44,27 @@ namespace Tests
 
 			Shape shape = .Circle(10, 20, 30);
 			Test.Assert(Switch1(shape) == 12);
+
+			int val = 123;
+			int result = 0;
+			switch (val)
+			{
+			case 0:
+				result = 1;
+			default:
+				SWITCH2:
+				switch (val)
+				{
+				case 2:
+					result = 2;
+				default:
+					result = 3;
+					break SWITCH2;
+				}
+
+				result = 4;
+			}
+			Test.Assert(result == 4);
 		}
 	}
 }