commit 6985ed7b2bc849460ff5d99ff3e6633aaf7f9eae
parent b13071d0706a2e1bb3dbc4c221d5c38a791e7845
Author: Debadree Chatterjee <debadree333@gmail.com>
Date: Fri, 14 Nov 2025 18:29:44 +0000
Bug 2000156: Throw error if binding patterns are observed in using decls. r=arai
Differential Revision: https://phabricator.services.mozilla.com/D272602
Diffstat:
3 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/js/public/friend/ErrorNumbers.msg b/js/public/friend/ErrorNumbers.msg
@@ -229,6 +229,7 @@ MSG_DEF(JSMSG_BAD_CLASS_MEMBER_DEF, 0, JSEXN_SYNTAXERR, "bad class member def
MSG_DEF(JSMSG_BAD_COALESCE_MIXING, 0, JSEXN_SYNTAXERR, "cannot use `??` unparenthesized within `||` and `&&` expressions")
MSG_DEF(JSMSG_BAD_CONST_DECL, 0, JSEXN_SYNTAXERR, "missing = in const declaration")
MSG_DEF(JSMSG_BAD_USING_DECL, 0, JSEXN_SYNTAXERR, "missing = in using declaration")
+MSG_DEF(JSMSG_NO_DESTRUCT_IN_USING, 0, JSEXN_SYNTAXERR, "destructuring patterns are not allowed in using declarations")
MSG_DEF(JSMSG_BAD_CONSTRUCTOR_DEF, 0, JSEXN_SYNTAXERR, "a class constructor definition must be a plain public method")
MSG_DEF(JSMSG_BAD_CONTINUE, 0, JSEXN_SYNTAXERR, "continue must be inside loop")
MSG_DEF(JSMSG_BAD_DESTRUCT_ASS, 0, JSEXN_SYNTAXERR, "invalid destructuring assignment operator")
diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp
@@ -4868,6 +4868,12 @@ GeneralParser<ParseHandler, Unit>::declarationList(
Node binding;
if (tt == TokenKind::LeftBracket || tt == TokenKind::LeftCurly) {
+ if (declKind == DeclarationKind::Using ||
+ declKind == DeclarationKind::AwaitUsing) {
+ MOZ_ASSERT(!initialDeclaration);
+ error(JSMSG_NO_DESTRUCT_IN_USING);
+ return errorResult();
+ }
binding = MOZ_TRY(declarationPattern(declKind, tt, initialDeclaration,
yieldHandling, forHeadKind,
forInOrOfExpression));
diff --git a/js/src/tests/jstests.list b/js/src/tests/jstests.list
@@ -702,16 +702,12 @@ skip script test262/intl402/PluralRules/notation.js
skip script test262/staging/top-level-await/tla-hang-entry.js
# https://bugzilla.mozilla.org/show_bug.cgi?id=1998671
-skip script test262/language/statements/await-using/syntax/await-using-invalid-arraybindingpattern-after-bindingidentifier.js
skip script test262/language/statements/await-using/syntax/await-using-invalid-assignment-statement-body-for-of.js
-skip script test262/language/statements/await-using/syntax/await-using-invalid-objectbindingpattern-after-bindingidentifier.js
skip script test262/language/statements/await-using/syntax/await-using-invalid-assignment-next-expression-for.js
skip script test262/language/statements/using/syntax/using-invalid-assignment-statement-body-for-of.js
-skip script test262/language/statements/using/syntax/using-invalid-arraybindingpattern-after-bindingidentifier.js
skip script test262/language/statements/using/syntax/with-initializer-default-statement-list.js
skip script test262/language/statements/using/syntax/using-invalid-assignment-next-expression-for.js
skip script test262/language/statements/using/syntax/using-not-allowed-at-top-level-of-eval.js
-skip script test262/language/statements/using/syntax/using-invalid-objectbindingpattern-after-bindingidentifier.js
skip script test262/language/statements/using/syntax/using-for-using-of-of.js