From f8ae6fa71355415446454d985c1963a69be3db60 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Thu, 22 Oct 2020 22:18:31 +0100 Subject: [PATCH] LibJS: Disallow NumericLiteral immediately followed by Identifier From the spec: https://tc39.es/ecma262/#sec-literals-numeric-literals The SourceCharacter immediately following a NumericLiteral must not be an IdentifierStart or DecimalDigit. For example: 3in is an error and not the two input elements 3 and in. --- Libraries/LibJS/Parser.cpp | 2 ++ Libraries/LibJS/Tests/numeric-literals-basic.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index 764ee67e85..893db52aad 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -1827,6 +1827,8 @@ Token Parser::consume_and_validate_numeric_literal() auto token = consume(TokenType::NumericLiteral); if (m_parser_state.m_strict_mode && is_unprefixed_octal_number(token.value())) syntax_error("Unprefixed octal number not allowed in strict mode", literal_start_line, literal_start_column); + if (match_identifier_name() && m_parser_state.m_current_token.trivia().is_empty()) + syntax_error("Numeric literal must not be immediately followed by identifier"); return token; } diff --git a/Libraries/LibJS/Tests/numeric-literals-basic.js b/Libraries/LibJS/Tests/numeric-literals-basic.js index 93a1815a49..f226581320 100644 --- a/Libraries/LibJS/Tests/numeric-literals-basic.js +++ b/Libraries/LibJS/Tests/numeric-literals-basic.js @@ -46,4 +46,6 @@ test("invalid numeric literals", () => { expect("0b").not.toEval(); expect("0o").not.toEval(); expect("'use strict'; 0755").not.toEval(); + expect("1in[]").not.toEval(); + expect("2instanceof foo").not.toEval(); });