Commit cd21f71f authored by Toon Verwaest's avatar Toon Verwaest Committed by Commit Bot

[parser] Validate destructuring assignment pattern in correct classifier

Previously we'd first accumulate errors to the parent and validate the
destructuring pattern in the parent. In the case of ParseArguments this
will invalidly propagate binding pattern errors from one argument to the
next. The reason why ParseArguments keeps track of binding pattern errors
is because it could also be used to parse async arrow function parameters.
If we see async(a,b) we don't yet know whether this is the head of an
async arrow function, or a call to async with arguments a and b.

Bug: v8:8241
Change-Id: I670ab9a9c6f2e0bee399808b02a465ae1afa7c3f
Reviewed-on: https://chromium-review.googlesource.com/c/1296229
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
Reviewed-by: 's avatarMarja Hölttä <marja@chromium.org>
Cr-Commit-Position: refs/heads/master@{#56887}
parent 33439472
...@@ -2791,13 +2791,13 @@ ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, bool* ok) { ...@@ -2791,13 +2791,13 @@ ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, bool* ok) {
// This is definitely not an expression so don't accumulate // This is definitely not an expression so don't accumulate
// expression-related errors. // expression-related errors.
productions &= ~ExpressionClassifier::ExpressionProduction; productions &= ~ExpressionClassifier::ExpressionProduction;
ValidateAssignmentPattern(CHECK_OK);
} }
Accumulate(productions); Accumulate(productions);
if (!Token::IsAssignmentOp(peek())) return expression; if (!Token::IsAssignmentOp(peek())) return expression;
if (is_destructuring_assignment) { if (is_destructuring_assignment) {
ValidateAssignmentPattern(CHECK_OK);
impl()->MarkPatternAsAssigned(expression); impl()->MarkPatternAsAssigned(expression);
} else { } else {
expression = CheckAndRewriteReferenceExpression( expression = CheckAndRewriteReferenceExpression(
......
// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
function f(x) { }
f(x=>x, [x,y] = [1,2]);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment