1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 19:35:09 +00:00

LibJS: Always insert semicolon after do-while statement if missing

https://tc39.es/ecma262/#sec-additions-and-changes-that-introduce-incompatibilities-with-prior-editions

11.9.1: In ECMAScript 2015, Automatic Semicolon Insertion adds a
semicolon at the end of a do-while statement if the semicolon is
missing. This change aligns the specification with the actual behaviour
of most existing implementations.
This commit is contained in:
Linus Groh 2020-10-27 19:16:23 +00:00 committed by Andreas Kling
parent d278f61f4c
commit b4e51249e9
2 changed files with 8 additions and 1 deletions

View file

@ -1524,7 +1524,10 @@ NonnullRefPtr<DoWhileStatement> Parser::parse_do_while_statement()
auto test = parse_expression(0); auto test = parse_expression(0);
consume(TokenType::ParenClose); consume(TokenType::ParenClose);
consume_or_insert_semicolon();
// Since ES 2015 a missing semicolon is inserted here, despite the regular ASI rules not applying
if (match(TokenType::Semicolon))
consume();
return create_ast_node<DoWhileStatement>(move(test), move(body)); return create_ast_node<DoWhileStatement>(move(test), move(body));
} }

View file

@ -18,3 +18,7 @@ test("exception in test expression", () => {
do {} while (foo); do {} while (foo);
}).toThrow(ReferenceError); }).toThrow(ReferenceError);
}); });
test("automatic semicolon insertion", () => {
expect("do {} while (false) foo").toEval();
});