diff --git a/lib/parse.js b/lib/parse.js index a0e214d0..c9c175bc 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -1522,7 +1522,7 @@ function parse($TEXT, options) { } if (is_expand) { if (!is("punc", "]")) { - unexpected(); // Must be last element + token_error(S.token, "Rest element must be last element"); } elements[elements.length - 1] = new AST_Expansion({ start: expand_token, @@ -1606,7 +1606,7 @@ function parse($TEXT, options) { } if (is_expand) { if (!is("punc", "}")) { - unexpected(); // Must be last element + token_error(S.token, "Rest element must be last element"); } } else if (is("operator", "=")) { diff --git a/test/mocha/lhs-expressions.js b/test/mocha/lhs-expressions.js index 2dcbfd6c..78a15c7e 100644 --- a/test/mocha/lhs-expressions.js +++ b/test/mocha/lhs-expressions.js @@ -253,13 +253,19 @@ describe("Left-hand side expressions", function () { // Multiple spreads are not allowed in destructuring array expect("[...a, ...b] = [1, 2, 3, 4]", "Spread must the be last element in destructuring array"); + // Array spread must be last in destructuring declaration + expect("let [ ...x, a ] = o;", "Rest element must be last element"); + + // Only one spread per destructuring array declaration + expect("let [ a, ...x, ...y ] = o;", "Rest element must be last element"); + // Spread in block should not be allowed expect("{...a} = foo", "Unexpected token: expand (...)"); // Object spread must be last in destructuring declaration - expect("let { ...x, a } = o;", "Unexpected token: punc (,)"); + expect("let { ...x, a } = o;", "Rest element must be last element"); // Only one spread per destructuring declaration - expect("let { a, ...x, ...y } = o;", "Unexpected token: punc (,)"); + expect("let { a, ...x, ...y } = o;", "Rest element must be last element"); }); });