diff --git a/Libraries/LibJS/AST.cpp b/Libraries/LibJS/AST.cpp index 098d4699dd..6bf047859a 100644 --- a/Libraries/LibJS/AST.cpp +++ b/Libraries/LibJS/AST.cpp @@ -1899,7 +1899,8 @@ Value SwitchStatement::execute(Interpreter& interpreter, GlobalObject& global_ob return {}; if (interpreter.vm().should_unwind()) { if (interpreter.vm().should_unwind_until(ScopeType::Continuable, m_label)) { - ASSERT_NOT_REACHED(); + // No stop_unwind(), the outer loop will handle that - we just need to break out of the switch/case. + return {}; } else if (interpreter.vm().should_unwind_until(ScopeType::Breakable, m_label)) { interpreter.vm().stop_unwind(); return {}; diff --git a/Libraries/LibJS/Tests/switch-basic.js b/Libraries/LibJS/Tests/switch-basic.js index b5cb52ae8d..5c2a851ac0 100644 --- a/Libraries/LibJS/Tests/switch-basic.js +++ b/Libraries/LibJS/Tests/switch-basic.js @@ -49,4 +49,22 @@ describe("basic switch tests", () => { expect(foo(42)).toBe("return from 'case 42'"); expect(foo(43)).toBe("return from 'default'"); }); + + test("continue from switch statement", () => { + let i = 0; + for (; i < 5; ++i) { + switch (i) { + case 0: + continue; + expect().fail(); + case 0: + expect().fail(); + default: + continue; + expect().fail(); + } + expect().fail(); + } + expect(i).toBe(5); + }); });