if (!njs_parser_is_lvalue(parser->node)) {
text = (njs_str_t *) parser->target;
- njs_parser_ref_error(parser, "Invalid left-hand side \"%V\" "
- "in for-in statement", text);
-
njs_mp_free(parser->vm->mem_pool, text);
- return NJS_DONE;
+ njs_parser_syntax_error(parser,
+ "Invalid left-hand side in for-loop");
+
+ return NJS_ERROR;
}
parser->node = njs_parser_lvalue_ref(parser->node);
/* for in. */
+ /* An invalid for-in target is a SyntaxError, parenthesized or not. */
+
{ njs_str("for (null in undefined);"),
- njs_str("ReferenceError: Invalid left-hand side \"null\" in for-in statement") },
+ njs_str("SyntaxError: Invalid left-hand side in for-loop") },
+
+ { njs_str("for ((null) in undefined);"),
+ njs_str("SyntaxError: Invalid left-hand side in for-loop") },
+
+ { njs_str("for (1 in {});"),
+ njs_str("SyntaxError: Invalid left-hand side in for-loop") },
+
+ { njs_str("for (this in {});"),
+ njs_str("SyntaxError: Invalid left-hand side in for-loop") },
+
+ { njs_str("for (function(){} in x);"),
+ njs_str("SyntaxError: Invalid left-hand side in for-loop") },
+
+ { njs_str("for ((a = 1) in {});"),
+ njs_str("SyntaxError: Invalid left-hand side in for-loop") },
+
+ { njs_str("for ((x => x) in {});"),
+ njs_str("SyntaxError: Invalid left-hand side in for-loop") },
+
+ { njs_str("var r; try { Function('for (null in undefined);') }"
+ "catch (e) { r = e.name } r"),
+ njs_str("SyntaxError") },
+
+ { njs_str("var d = {}; for (d.a in {x:1}); d.a"),
+ njs_str("x") },
+
+ { njs_str("var d = {}; for ((d.a) in {x:1}); d.a"),
+ njs_str("x") },
{ njs_str("for (var a, b in []);"),
njs_str("SyntaxError: Unexpected token \"in\"") },