From f4d0babd5dc5faffe57dc17584ea59552ea1bf52 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Mon, 5 Oct 2020 00:00:10 +0100 Subject: [PATCH] LibJS: Make assignment to CallExpression a syntax error in strict mode --- Libraries/LibJS/Parser.cpp | 2 ++ Libraries/LibJS/Tests/invalid-lhs-in-assignment.js | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index 273fef5ea2..deec9c0536 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -1129,6 +1129,8 @@ NonnullRefPtr Parser::parse_assignment_expression(Assignme auto name = static_cast(*lhs).string(); if (name == "eval" || name == "arguments") syntax_error(String::formatted("'{}' cannot be assigned to in strict mode code", name)); + } else if (m_parser_state.m_strict_mode && lhs->is_call_expression()) { + syntax_error("Cannot assign to function call"); } return create_ast_node(assignment_op, move(lhs), parse_expression(min_precedence, associativity)); } diff --git a/Libraries/LibJS/Tests/invalid-lhs-in-assignment.js b/Libraries/LibJS/Tests/invalid-lhs-in-assignment.js index 7018a94b78..ec5024f8ec 100644 --- a/Libraries/LibJS/Tests/invalid-lhs-in-assignment.js +++ b/Libraries/LibJS/Tests/invalid-lhs-in-assignment.js @@ -5,6 +5,10 @@ test("assignment to function call", () => { }).toThrowWithMessage(ReferenceError, "Invalid left-hand side in assignment"); }); +test("assignment to function call in strict mode", () => { + expect("'use strict'; foo() = 'foo'").not.toEval(); +}); + test("assignment to inline function call", () => { expect(() => { (function () {})() = "foo";