Index: src/preparser.h |
diff --git a/src/preparser.h b/src/preparser.h |
index 1b9af9e732600c75d36b9f3e14d8919e0f3e7bae..be03c76928d04aa15b92dd919a97a35ffc96f50d 100644 |
--- a/src/preparser.h |
+++ b/src/preparser.h |
@@ -538,6 +538,7 @@ class ParserBase : public Traits { |
} |
void ReportUnexpectedToken(Token::Value token); |
+ void ReportUnexpectedTokenAt(Scanner::Location location, Token::Value token); |
// Recursive descent functions: |
@@ -1681,7 +1682,13 @@ ParserBase<Traits>::FunctionState::~FunctionState() { |
template<class Traits> |
void ParserBase<Traits>::ReportUnexpectedToken(Token::Value token) { |
- Scanner::Location source_location = scanner()->location(); |
+ return ReportUnexpectedTokenAt(scanner_->location(), token); |
+} |
+ |
+ |
+template<class Traits> |
+void ParserBase<Traits>::ReportUnexpectedTokenAt( |
+ Scanner::Location source_location, Token::Value token) { |
// Four of the tokens are treated specially |
switch (token) { |
@@ -2846,6 +2853,15 @@ typename ParserBase<Traits>::ExpressionT |
ParserBase<Traits>::ParseArrowFunctionLiteral(int start_pos, |
ExpressionT params_ast, |
bool* ok) { |
+ if (peek() == Token::ARROW && scanner_->HasAnyLineTerminatorBeforeNext()) { |
+ // ASI inserts `;` after arrow parameters if a line terminator is found. |
+ // `=> ...` is never a valid expression, so report as syntax error. |
+ // If next token is not `=>`, it's a syntax error anyways. |
+ ReportUnexpectedTokenAt(scanner_->peek_location(), Token::ARROW); |
+ *ok = false; |
+ return this->EmptyExpression(); |
+ } |
+ |
Scope* scope = this->NewScope(scope_, ARROW_SCOPE); |
typename Traits::Type::StatementList body; |
int num_parameters = -1; |