Skip to content
Snippets Groups Projects
Commit 78ca60e6 authored by Jeff Walden's avatar Jeff Walden
Browse files

Add tests verifying that ASI can't occur after the leading let/const in |let...

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".
parent 67ba34b0
No related branches found
No related tags found
No related merge requests found
// 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";
// 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;
// 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";
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment