From 78ca60e6cf56f6ee631db83b9fd35f3a30eea7e7 Mon Sep 17 00:00:00 2001
From: Jeff Walden <jwalden@mit.edu>
Date: Thu, 17 Dec 2015 17:11:46 -0500
Subject: [PATCH] Add tests verifying that ASI can't occur after the leading
 let/const in |let let|, |let let = "...";|, and |const let = "...";|.  Each
 matches the LexicalDeclaration production, then triggers an early error
 before evaluation because it attempts to bind "let".

---
 ...st-declaring-let-split-across-two-lines.js | 16 ++++++++++
 ...-let-declaration-split-across-two-lines.js | 30 +++++++++++++++++++
 ...with-initializer-split-across-two-lines.js | 30 +++++++++++++++++++
 3 files changed, 76 insertions(+)
 create mode 100644 test/language/statements/const/syntax/const-declaring-let-split-across-two-lines.js
 create mode 100644 test/language/statements/let/syntax/let-let-declaration-split-across-two-lines.js
 create mode 100644 test/language/statements/let/syntax/let-let-declaration-with-initializer-split-across-two-lines.js

diff --git a/test/language/statements/const/syntax/const-declaring-let-split-across-two-lines.js b/test/language/statements/const/syntax/const-declaring-let-split-across-two-lines.js
new file mode 100644
index 0000000000..e6d9a0108f
--- /dev/null
+++ b/test/language/statements/const/syntax/const-declaring-let-split-across-two-lines.js
@@ -0,0 +1,16 @@
+// Copyright (C) 2015 Mozilla Corporation. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Jeff Walden
+es6id: 13.3.1.1
+description: >
+    const: |const let| split across two lines is a static semantics early error.
+info: >
+  Lexical declarations may not declare a binding named "let".
+negative: SyntaxError
+---*/
+throw NotEarlyError;
+
+const
+let = "irrelevant initializer";
diff --git a/test/language/statements/let/syntax/let-let-declaration-split-across-two-lines.js b/test/language/statements/let/syntax/let-let-declaration-split-across-two-lines.js
new file mode 100644
index 0000000000..0ef615cea4
--- /dev/null
+++ b/test/language/statements/let/syntax/let-let-declaration-split-across-two-lines.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2015 Mozilla Corporation. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Jeff Walden
+es6id: 13.3.1.1
+description: >
+    let: |let let| split across two lines is not subject to automatic semicolon insertion.
+info: >
+  |let| followed by a name is a lexical declaration.  This is so even if the
+  name is on a new line.  ASI applies *only* if an offending token not allowed
+  by the grammar is encountered, and there's no [no LineTerminator here]
+  restriction in LexicalDeclaration or ForDeclaration forbidding a line break.
+
+  It's a tricky point, but this is true *even if* the name is "let", a name that
+  can't be bound by LexicalDeclaration or ForDeclaration.  Per 5.3, static
+  semantics early errors are validated *after* determining productions matching
+  the source text.
+
+  So in this testcase, the eval text matches LexicalDeclaration.  No ASI occurs,
+  because "let\nlet = ..." matches LexicalDeclaration before static semantics
+  are considered.  *Then* 13.3.1.1's static semantics for the LexicalDeclaration
+  just chosen, per 5.3, are validated to recognize the Script as invalid.  Thus
+  the eval script can't be evaluated, and a SyntaxError is thrown.
+negative: SyntaxError
+---*/
+throw NotEarlyError;
+
+let  // start of a LexicalDeclaration, *not* an ASI opportunity
+let;
diff --git a/test/language/statements/let/syntax/let-let-declaration-with-initializer-split-across-two-lines.js b/test/language/statements/let/syntax/let-let-declaration-with-initializer-split-across-two-lines.js
new file mode 100644
index 0000000000..5efbf57212
--- /dev/null
+++ b/test/language/statements/let/syntax/let-let-declaration-with-initializer-split-across-two-lines.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2015 Mozilla Corporation. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+author: Jeff Walden
+es6id: 13.3.1.1
+description: >
+    let: |let let| split across two lines is not subject to automatic semicolon insertion.
+info: >
+  |let| followed by a name is a lexical declaration.  This is so even if the
+  name is on a new line.  ASI applies *only* if an offending token not allowed
+  by the grammar is encountered, and there's no [no LineTerminator here]
+  restriction in LexicalDeclaration or ForDeclaration forbidding a line break.
+
+  It's a tricky point, but this is true *even if* the name is "let", a name that
+  can't be bound by LexicalDeclaration or ForDeclaration.  Per 5.3, static
+  semantics early errors are validated *after* determining productions matching
+  the source text.
+
+  So in this testcase, the eval text matches LexicalDeclaration.  No ASI occurs,
+  because "let\nlet = ..." matches LexicalDeclaration before static semantics
+  are considered.  *Then* 13.3.1.1's static semantics for the LexicalDeclaration
+  just chosen, per 5.3, are validated to recognize the Script as invalid.  Thus
+  the eval script can't be evaluated, and a SyntaxError is thrown.
+negative: SyntaxError
+---*/
+throw NotEarlyError;
+
+let  // start of a LexicalDeclaration, *not* an ASI opportunity
+let = "irrelevant initializer";
-- 
GitLab