diff --git a/jerry-core/parser/js/js-parser-statm.c b/jerry-core/parser/js/js-parser-statm.c index 6a591b5f5..bdd2d1845 100644 --- a/jerry-core/parser/js/js-parser-statm.c +++ b/jerry-core/parser/js/js-parser-statm.c @@ -1168,6 +1168,11 @@ parser_parse_for_statement_start (parser_context_t *context_p) /**< context */ || context_p->token.type == LEXER_KEYW_LET || context_p->token.type == LEXER_KEYW_CONST) { + if (context_p->status_flags & PARSER_IS_STRICT) + { + parser_raise_error (context_p, PARSER_ERR_FOR_IN_OF_DECLARATION); + } + token_type = context_p->token.type; has_context = (context_p->token.type != LEXER_KEYW_VAR); scanner_get_location (&start_location, context_p); diff --git a/jerry-core/parser/js/js-parser-util.c b/jerry-core/parser/js/js-parser-util.c index 7b779c3e6..1601cb28d 100644 --- a/jerry-core/parser/js/js-parser-util.c +++ b/jerry-core/parser/js/js-parser-util.c @@ -951,6 +951,10 @@ parser_error_to_string (parser_error_t error) /**< error code */ { return "Incorrect use of yield keyword."; } + case PARSER_ERR_FOR_IN_OF_DECLARATION: + { + return "for in-of loop variable declaration may not have an initializer."; + } #endif /* ENABLED (JERRY_ES2015) */ case PARSER_ERR_DELETE_IDENT_NOT_ALLOWED: { diff --git a/jerry-core/parser/js/js-parser.h b/jerry-core/parser/js/js-parser.h index 1a09cb74a..e1e2588ab 100644 --- a/jerry-core/parser/js/js-parser.h +++ b/jerry-core/parser/js/js-parser.h @@ -80,6 +80,7 @@ typedef enum #if ENABLED (JERRY_ES2015) PARSER_ERR_USE_STRICT_NOT_ALLOWED, /**< use strict directive is not allowed */ PARSER_ERR_YIELD_NOT_ALLOWED, /**< yield keyword is not allowed */ + PARSER_ERR_FOR_IN_OF_DECLARATION, /**< variable declaration in for-in or for-of loop */ #endif /* ENABLED (JERRY_ES2015) */ PARSER_ERR_DELETE_IDENT_NOT_ALLOWED, /**< identifier delete is not allowed in strict mode */ PARSER_ERR_EVAL_CANNOT_ASSIGNED, /**< eval cannot be assigned in strict mode */ diff --git a/tests/jerry/es2015/forin-header-strict.js b/tests/jerry/es2015/forin-header-strict.js new file mode 100644 index 000000000..07093c261 --- /dev/null +++ b/tests/jerry/es2015/forin-header-strict.js @@ -0,0 +1,29 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; +try { + eval('for (var i = 0 in {}) {}'); + assert(false); +} catch(e) { + assert(e instanceof SyntaxError); +} + +try { + eval('for (var = i of {}) {}'); + assert(false); +} catch (e) { + assert(e instanceof SyntaxError); +}