diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index a90c635647..08b5a10868 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -1519,8 +1519,15 @@ NonnullRefPtr Parser::parse_switch_statement() NonnullRefPtrVector cases; - while (match(TokenType::Case) || match(TokenType::Default)) + auto has_default = false; + while (match(TokenType::Case) || match(TokenType::Default)) { + if (match(TokenType::Default)) { + if (has_default) + syntax_error("Multiple 'default' clauses in switch statement"); + has_default = true; + } cases.append(parse_switch_case()); + } consume(TokenType::CurlyClose); diff --git a/Libraries/LibJS/Tests/switch-basic.js b/Libraries/LibJS/Tests/switch-basic.js index 5c2a851ac0..36210dda17 100644 --- a/Libraries/LibJS/Tests/switch-basic.js +++ b/Libraries/LibJS/Tests/switch-basic.js @@ -68,3 +68,11 @@ describe("basic switch tests", () => { expect(i).toBe(5); }); }); + +describe("errors", () => { + test("syntax errors", () => { + expect("switch () {}").not.toEval(); + expect("switch (foo) { bar }").not.toEval(); + expect("switch (foo) { default: default: }").not.toEval(); + }); +});