diff --git a/rhino/src/main/java/org/mozilla/javascript/Parser.java b/rhino/src/main/java/org/mozilla/javascript/Parser.java index 6807ec081f..c1952c2e10 100644 --- a/rhino/src/main/java/org/mozilla/javascript/Parser.java +++ b/rhino/src/main/java/org/mozilla/javascript/Parser.java @@ -1677,6 +1677,16 @@ && matchToken(Token.NAME, true) markDestructuring(init); cond = expr(false); // object over which we're iterating } else { // ordinary for-loop + // For ordinary for loops, destructuring declarations must have initializers + if (init instanceof VariableDeclaration) { + VariableDeclaration varDecl = (VariableDeclaration) init; + for (VariableInitializer vi : varDecl.getVariables()) { + if (vi.isDestructuring() && vi.getInitializer() == null) { + reportError("msg.destruct.assign.no.init"); + } + } + } + mustMatchToken(Token.SEMI, "msg.no.semi.for", true); if (peekToken() == Token.SEMI) { // no loop condition diff --git a/tests/src/test/java/org/mozilla/javascript/tests/ParserTest.java b/tests/src/test/java/org/mozilla/javascript/tests/ParserTest.java index 11a86b6efc..420e314385 100644 --- a/tests/src/test/java/org/mozilla/javascript/tests/ParserTest.java +++ b/tests/src/test/java/org/mozilla/javascript/tests/ParserTest.java @@ -1490,6 +1490,13 @@ public void oomOnInvalidInput() { expectParseErrors("`\\u{8", new String[] {"syntax error"}); } + @Test + public void errorOnInvalidDestructuringDeclaration() { + expectParseErrors( + "for(var {};;) {}", + new String[] {"Missing = in destructuring declaration", "syntax error"}); + } + private void expectParseErrors(String string, String[] errors) { parse(string, errors, null, false); } diff --git a/tests/testsrc/jstests/harmony/destructuring.js b/tests/testsrc/jstests/harmony/destructuring.js index 7886b66517..ea0865946a 100644 --- a/tests/testsrc/jstests/harmony/destructuring.js +++ b/tests/testsrc/jstests/harmony/destructuring.js @@ -29,5 +29,9 @@ assertEquals(obj.b, 345); assertThrows("(1 ? {} : 490) = 1", SyntaxError); assertThrows("(1 ? [] : 490) = 1", SyntaxError); +assertThrows("for (var {};;) {}", SyntaxError); +assertThrows("for (let {};;) {}", SyntaxError); +assertThrows("for (var {a};;) {}", SyntaxError); +assertThrows("for (let {a};;) {}", SyntaxError); "success";