Commit 454816f0 authored by vabr's avatar vabr Committed by Commit bot

Report unexpected lexical decl also without destructuring

https://codereview.chromium.org/2694003002/ introduced
"SyntaxError: Lexical declaration cannot appear in a single-statement context"
for the case when let + desctructuring from a list happen.

As was pointed out in https://codereview.chromium.org/2694003002/#msg18, the
case without destructuring would also benefit from a better message: if a
single statement is expected and "let identifier = ..." is seen, the error is
indeed again that the lexical declaration is not a statement. However, the current
error is "Unexpected identifier", because the parser tries to accept "let" as
an identifier in an expression statement, and then gives up seeing the other
identifier after "let".

This CL ensures that the parser recognises the error properly and reports
accordingly. It also renames the existing test, which contains destructuring,
and adds the one with a non-destructuring lexical declaration.

BUG=v8:5686

Review-Url: https://codereview.chromium.org/2697193007
Cr-Commit-Position: refs/heads/master@{#43275}
parent 4b07a979
...@@ -4950,12 +4950,19 @@ ParserBase<Impl>::ParseExpressionOrLabelledStatement( ...@@ -4950,12 +4950,19 @@ ParserBase<Impl>::ParseExpressionOrLabelledStatement(
ReportUnexpectedToken(Next()); ReportUnexpectedToken(Next());
*ok = false; *ok = false;
return impl()->NullStatement(); return impl()->NullStatement();
case Token::LET: case Token::LET: {
if (PeekAhead() != Token::LBRACK) break; Token::Value next_next = PeekAhead();
// "let" followed by either "[", "{" or an identifier means a lexical
// declaration, which should not appear here.
if (next_next != Token::LBRACK && next_next != Token::LBRACE &&
next_next != Token::IDENTIFIER) {
break;
}
impl()->ReportMessageAt(scanner()->peek_location(), impl()->ReportMessageAt(scanner()->peek_location(),
MessageTemplate::kUnexpectedLexicalDeclaration); MessageTemplate::kUnexpectedLexicalDeclaration);
*ok = false; *ok = false;
return impl()->NullStatement(); return impl()->NullStatement();
}
default: default:
break; break;
} }
......
// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
with ({}) let {a: x} = {a: 42};
*%(basename)s:5: SyntaxError: Lexical declaration cannot appear in a single-statement context
with ({}) let {a: x} = {a: 42};
^^^
SyntaxError: Lexical declaration cannot appear in a single-statement context
// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
with ({}) let [a] = [42];
*%(basename)s:5: SyntaxError: Lexical declaration cannot appear in a single-statement context
with ({}) let [a] = [42];
^^^
SyntaxError: Lexical declaration cannot appear in a single-statement context
...@@ -2,4 +2,4 @@ ...@@ -2,4 +2,4 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
with ({}) let [a] = []; with ({}) let a = [];
*%(basename)s:5: SyntaxError: Lexical declaration cannot appear in a single-statement context *%(basename)s:5: SyntaxError: Lexical declaration cannot appear in a single-statement context
with ({}) let [a] = []; with ({}) let a = [];
^^^ ^^^
SyntaxError: Lexical declaration cannot appear in a single-statement context SyntaxError: Lexical declaration cannot appear in a single-statement context
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment