diff --git a/jerry-core/parser/js/js-parser-statm.c b/jerry-core/parser/js/js-parser-statm.c index c2a4259cd6..6f20e499ac 100644 --- a/jerry-core/parser/js/js-parser-statm.c +++ b/jerry-core/parser/js/js-parser-statm.c @@ -600,7 +600,9 @@ parser_parse_function_statement (parser_context_t *context_p) /**< context */ JERRY_ASSERT (context_p->token.type == LEXER_KEYW_FUNCTION); #if JERRY_ESNEXT - if (JERRY_UNLIKELY (parser_statement_flags[context_p->stack_top_uint8] & PARSER_STATM_SINGLE_STATM)) + bool is_single_statement = (parser_statement_flags[context_p->stack_top_uint8] & PARSER_STATM_SINGLE_STATM) != 0; + + if (JERRY_UNLIKELY (is_single_statement)) { if (context_p->status_flags & PARSER_IS_STRICT) { @@ -667,6 +669,10 @@ parser_parse_function_statement (parser_context_t *context_p) /**< context */ if (lexer_consume_generator (context_p)) { + if (is_single_statement) + { + parser_raise_error (context_p, PARSER_ERR_GENERATOR_IN_SINGLE_STATEMENT_POS); + } is_generator_function = true; } #endif /* JERRY_ESNEXT */ diff --git a/jerry-core/parser/js/js-parser-util.c b/jerry-core/parser/js/js-parser-util.c index 8a65dae4ac..66a6356219 100644 --- a/jerry-core/parser/js/js-parser-util.c +++ b/jerry-core/parser/js/js-parser-util.c @@ -1243,6 +1243,10 @@ parser_error_to_string (parser_error_t error) /**< error code */ { return "Lexical declaration cannot appear in a single-statement context"; } + case PARSER_ERR_GENERATOR_IN_SINGLE_STATEMENT_POS: + { + return "Generator function cannot appear in a single-statement context"; + } case PARSER_ERR_LABELLED_FUNC_NOT_IN_BLOCK: { return "Labelled functions are only allowed inside blocks"; diff --git a/jerry-core/parser/js/js-parser.h b/jerry-core/parser/js/js-parser.h index 6274cb5fc8..6f1bfb8968 100644 --- a/jerry-core/parser/js/js-parser.h +++ b/jerry-core/parser/js/js-parser.h @@ -141,6 +141,7 @@ typedef enum #if JERRY_ESNEXT PARSER_ERR_VARIABLE_REDECLARED, /**< a variable redeclared */ PARSER_ERR_LEXICAL_SINGLE_STATEMENT, /**< lexical declaration in single statement context */ + PARSER_ERR_GENERATOR_IN_SINGLE_STATEMENT_POS, /**< generator func not allowed in single statement position */ PARSER_ERR_LABELLED_FUNC_NOT_IN_BLOCK, /**< labelled functions are only allowed inside blocks */ PARSER_ERR_LEXICAL_LET_BINDING, /**< let binding cannot be declared in let/const */ PARSER_ERR_MISSING_ASSIGN_AFTER_CONST, /**< an assignment is required after a const declaration */ diff --git a/tests/jerry/es.next/generator-function-in-single-statement.js b/tests/jerry/es.next/generator-function-in-single-statement.js new file mode 100644 index 0000000000..44aa7bdf44 --- /dev/null +++ b/tests/jerry/es.next/generator-function-in-single-statement.js @@ -0,0 +1,27 @@ +/* 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. + */ + + +function parse(txt) { + try { + eval(txt) + assert(false) + } catch (e) { + assert(e instanceof SyntaxError) + } +} + +parse("if (true) function* g() { }") +parse("if (false) ; else function* g() { }") diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index 5822d88491..00f28d23e9 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -365,13 +365,8 @@ - - - - -