From 6fe9488ec780c8ddcdc27039f0ae6d846ebaa734 Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Fri, 7 Apr 2017 15:19:58 -0700 Subject: [PATCH 1/3] Add tests for the behavior of |let await| in normal and async functions. --- .../let-newline-await-in-async-function.js | 23 ++++++++++++++++++ .../let-newline-await-in-normal-function.js | 24 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 test/language/statements/async-function/let-newline-await-in-async-function.js create mode 100644 test/language/statements/let/syntax/let-newline-await-in-normal-function.js diff --git a/test/language/statements/async-function/let-newline-await-in-async-function.js b/test/language/statements/async-function/let-newline-await-in-async-function.js new file mode 100644 index 0000000000..c012b8da44 --- /dev/null +++ b/test/language/statements/async-function/let-newline-await-in-async-function.js @@ -0,0 +1,23 @@ +// Copyright (C) 2017 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +author: Jeff Walden +esid: sec-let-and-const-declarations +description: > + `await` must not be considered a permissible binding name in + LexicalDeclaration as used in async functions. +info: > + LexicalDeclaration is parametrized to indicate whether `async` is permitted as + binding name. In async functions `await` is excluded from LexicalDeclaration + as a binding name. Therefore ASI *can* apply between `let` (where a + LexicalDeclaration is permitted) and `await`, so a subsequent `0` forms part + of an AwaitExpression and there is no syntax error. +---*/ + +async function f() { + let + await 0; +} + +assert(f instanceof Function); diff --git a/test/language/statements/let/syntax/let-newline-await-in-normal-function.js b/test/language/statements/let/syntax/let-newline-await-in-normal-function.js new file mode 100644 index 0000000000..5bb3b9317a --- /dev/null +++ b/test/language/statements/let/syntax/let-newline-await-in-normal-function.js @@ -0,0 +1,24 @@ +// Copyright (C) 2017 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +author: Jeff Walden +esid: sec-let-and-const-declarations +description: > + `await` must be considered a permissible binding name in LexicalDeclaration as + used in non-async functions. +info: > + LexicalDeclaration is parametrized to indicate whether `async` is permitted as + binding name. In non-async functions `await` is a perfectly cromulent binding + name. Therefore ASI can't apply between `let` (where a LexicalDeclaration is + permitted) and `await`, so a subsequent `0` where `=` was expected is a syntax + error. +negative: + phase: early + type: SyntaxError +---*/ + +function f() { + let + await 0; +} From dbfca4581d7af1d5003b84ceb25c9dba5be64b08 Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Tue, 11 Apr 2017 22:31:35 +0200 Subject: [PATCH 2/3] Prohibit ASI between 'let' and 'yield'/'await' Inspired by https://github.com/tc39/test262/pull/956 --- ...let-newline-yield-in-generator-function.js | 22 +++++++++++++++++++ .../let-newline-yield-in-normal-function.js | 21 ++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 test/language/statements/let/syntax/let-newline-yield-in-generator-function.js create mode 100644 test/language/statements/let/syntax/let-newline-yield-in-normal-function.js diff --git a/test/language/statements/let/syntax/let-newline-yield-in-generator-function.js b/test/language/statements/let/syntax/let-newline-yield-in-generator-function.js new file mode 100644 index 0000000000..c7a7adb798 --- /dev/null +++ b/test/language/statements/let/syntax/let-newline-yield-in-generator-function.js @@ -0,0 +1,22 @@ +// Copyright (C) 2017 Mozilla Corporation. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +author: Jeff Walden +esid: sec-let-and-const-declarations +description: > + `let await` does not permit ASI in between, as `await` is a BindingIdentifier +info: > + `await` is a perfectly cromulent binding name in any context grammatically, just + prohibited by static semantics in some contexts. Therefore ASI can never apply + between `let` (where a LexicalDeclaration is permitted) and `await`, + so a subsequent `0` where `=` was expected is a syntax error. +negative: + phase: early + type: SyntaxError +---*/ + +async function f() { + let + await 0; +} diff --git a/test/language/statements/let/syntax/let-newline-yield-in-normal-function.js b/test/language/statements/let/syntax/let-newline-yield-in-normal-function.js new file mode 100644 index 0000000000..60471fede4 --- /dev/null +++ b/test/language/statements/let/syntax/let-newline-yield-in-normal-function.js @@ -0,0 +1,21 @@ +// Copyright (C) 2017 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-let-and-const-declarations +description: > + `let yield` does not permit ASI in between, as `yield` is a BindingIdentifier +info: > + `yield` is a perfectly cromulent binding name in any context grammatically, just + prohibited by static semantics in some contexts. Therefore ASI can never apply + between `let` (where a LexicalDeclaration is permitted) and `yield`, + so a subsequent `0` where `=` was expected is a syntax error. +negative: + phase: early + type: SyntaxError +---*/ + +function f() { + let + yield 0; +} From 799568fe26eafd33362370d9cf248d75d6399b1d Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Tue, 11 Apr 2017 23:58:04 +0200 Subject: [PATCH 3/3] Fix commit messages --- .../let-newline-await-in-async-function.js | 17 ++++++++--------- .../let-newline-await-in-normal-function.js | 12 +++++------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/test/language/statements/async-function/let-newline-await-in-async-function.js b/test/language/statements/async-function/let-newline-await-in-async-function.js index c012b8da44..c7a7adb798 100644 --- a/test/language/statements/async-function/let-newline-await-in-async-function.js +++ b/test/language/statements/async-function/let-newline-await-in-async-function.js @@ -5,19 +5,18 @@ author: Jeff Walden esid: sec-let-and-const-declarations description: > - `await` must not be considered a permissible binding name in - LexicalDeclaration as used in async functions. + `let await` does not permit ASI in between, as `await` is a BindingIdentifier info: > - LexicalDeclaration is parametrized to indicate whether `async` is permitted as - binding name. In async functions `await` is excluded from LexicalDeclaration - as a binding name. Therefore ASI *can* apply between `let` (where a - LexicalDeclaration is permitted) and `await`, so a subsequent `0` forms part - of an AwaitExpression and there is no syntax error. + `await` is a perfectly cromulent binding name in any context grammatically, just + prohibited by static semantics in some contexts. Therefore ASI can never apply + between `let` (where a LexicalDeclaration is permitted) and `await`, + so a subsequent `0` where `=` was expected is a syntax error. +negative: + phase: early + type: SyntaxError ---*/ async function f() { let await 0; } - -assert(f instanceof Function); diff --git a/test/language/statements/let/syntax/let-newline-await-in-normal-function.js b/test/language/statements/let/syntax/let-newline-await-in-normal-function.js index 5bb3b9317a..8e35b7fd69 100644 --- a/test/language/statements/let/syntax/let-newline-await-in-normal-function.js +++ b/test/language/statements/let/syntax/let-newline-await-in-normal-function.js @@ -5,14 +5,12 @@ author: Jeff Walden esid: sec-let-and-const-declarations description: > - `await` must be considered a permissible binding name in LexicalDeclaration as - used in non-async functions. + `let await` does not permit ASI in between, as `await` is a BindingIdentifier info: > - LexicalDeclaration is parametrized to indicate whether `async` is permitted as - binding name. In non-async functions `await` is a perfectly cromulent binding - name. Therefore ASI can't apply between `let` (where a LexicalDeclaration is - permitted) and `await`, so a subsequent `0` where `=` was expected is a syntax - error. + `await` is a perfectly cromulent binding name in any context grammatically, just + prohibited by static semantics in some contexts. Therefore ASI can never apply + between `let` (where a LexicalDeclaration is permitted) and `await`, + so a subsequent `0` where `=` was expected is a syntax error. negative: phase: early type: SyntaxError